Geben Sie das Alphabet-Lied ohne (m) Buchstaben aus


12

Ihr Ziel ist es, ein Programm zu schreiben, das keine Eingaben macht und folgenden Text ausgibt:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

Aber es gibt einen Haken: Für jeden Buchstaben (jedes Zeichen, dessen allgemeine Kategorie in Unicode mit beginnt L) in Ihrer Quelle erhalten Sie eine Strafe von 20 Zeichen! (Als Referenz enthält der zu druckende Text 81 Buchstaben.)

Der unten stehende Perl 6-Code besteht aus 145 Bytes und 84 Buchstaben, sodass er eine Punktzahl von 1.845 ergibt:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

Der folgende Code hat 152 Bytes und 70 Buchstaben, sodass er eine Punktzahl von 1.552 ergibt:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

Standardlücken sind verboten.

Ursprünglich dachte ich daran, Briefe ganz zu verbieten, aber ich glaube nicht, dass es viele Sprachen gibt, die dies ermöglichen. Sie sind herzlich eingeladen, es zu versuchen.

(ŋarâþ crîþ [ˈŋaɹaɹθ kɹḭθ] ist einer meiner Conlangs. Ich wollte seinen Namen hier großschreiben, aber ich bekomme den hässlichen dicken Spruch hier. Naja, die Sprache verwendet sowieso keine Großbuchstaben in ihrer Umschrift.)

Edit: habe erkannt, dass eine der Zeilen falsch ist, aber ich werde es behalten, da es bereits Antworten gibt. Die korrekte Version der dritten Zeile lautet ma a fa ga pa ta ča; Nach Ihrer Wahl können Sie stattdessen den korrigierten Text erstellen.


11
Kolmogorov-Komplexität , Quellenbeschränkung und Spezialwertung sind alles mögliche, die von einer sorgfältigen Prüfung im Sandkasten in hohem Maße profitieren. Derzeit scheint es die beste Lösung für diese Herausforderung zu sein, einfach alle Codepunkte in Dezimalzahlen zu schreiben und sie dann mit einer eingebauten Verknüpfung in Text umzuwandeln, um alle as zu codieren - oder auch nicht, je nachdem, wie viele Buchstaben würde es dauern, weil 20 Zeichen eine wirklich große Strafe sind (obwohl, wenn alles andere durch Bytes bewertet wird, es nicht ganz genau definiert ist ...)!
Unrelated String

4
In Anbetracht des Aufrufs von Unicode sind wahrscheinlich einige explizite Regeln für spezielle Codepages erforderlich, wie sie von den meisten Golflangs verwendet werden (neben möglicherweise einem Link zu einem Skript zur Validierung des Scorings).
Unrelated String

Antworten:


21

7 , 410 Zeichen, 154 Bytes in der Kodierung von 7, 0 Buchstaben = Punktzahl 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Probieren Sie es online!

In einer Herausforderung, die es nicht mag, Buchstaben zu benutzen, welche Sprache ist besser als eine, die nur aus Ziffern besteht?

Dies ist ein vollständiges Programm, das über einen Absturz beendet wird. Daher wird stderr nicht korrekt ausgegeben, aber stdout ist korrekt.

Erläuterung

Ein 7-Programm schiebt bei seiner ersten Iteration einfach eine Reihe von Elementen in den Stapel (da von den 12 Befehlen, die in 7 vorhanden sind, nur 8 in einem Quellprogramm dargestellt werden können und diese 8 auf das Schreiben von Code spezialisiert sind) bestimmte Datenstrukturen in den Stack zu verschieben). Dieses Programm verwendet den 6Befehl nicht (dies ist die einfachste Methode zum Erstellen verschachtelter Strukturen, tritt jedoch ansonsten in einem Quellprogramm nicht buchstäblich auf), sodass nur die 7Befehle die Struktur bestimmen. 7schiebt ein neues an die Oberseite des Stapels leeres Element (während der 0... 5Befehle an die Oberseite des Stapels gerade append). Wir können dem Programm also Leerzeichen hinzufügen, um seine Struktur zu zeigen:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

334135124105231424105230523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Die Elemente gegen Ende des Programms werden zuletzt verschoben, befinden sich also zu Beginn der zweiten Iteration oben auf dem Stapel. Bei dieser Iteration und allen zukünftigen Iterationen erstellt der 7-Interpreter automatisch eine Kopie der obersten Ebene des Stapels und interpretiert sie als Programm. Das Literal 41403drückt den (nicht-literalen, Live-Code) 47463(7 hat 12 Befehle, aber nur 8 von ihnen haben Namen. Als solches verwende ich Fett, um den Code anzuzeigen, und Nicht-Fett, um das Literal anzuzeigen, das diesen Code erzeugt, was bedeutet 4Dies ist zB der Befehl, der 4an das oberste Stapelelement angehängt wird . Das Programm, das bei der zweiten Iteration ausgeführt wird, lautet also 47463. Das bewirkt Folgendes:

47463 
4        Swap obere zwei Stapelelemente, ein leeres Element in Between
  7       ein leeres Stapelelement nach oben von Stack In
   4      Swap oberen zwei Stapelelemente, ein leeres Element dazwischen hinzufügen
    6     auszuarbeiten, die Befehle , das obere Stapelelement erzeugen würden;
        Hänge das an das Element darunter an (und platziere die alte Oberseite des Stapels)
    3    Geben Sie das oberste Stapelelement aus und platzieren Sie das Element darunter

Dies ist einfacher zu verstehen, wenn wir uns ansehen, was mit dem Stapel passiert:

  • D c b einen 47463 (Code auszuführen: 47463)
  • D c b 47463 entleeren einen (Code auszuführen: 7463)
  • ... d c b entleeren einen leeren (Code auszuführen: )47463 463
  • ... d c b leer leer leer a (Code auszuführen: )47463 63
  • ... d c b leer leer " ein " (Code auszuführen: )47463 3
  • D c b leer (auszuführender Code: leer )47463

Mit anderen Worten, wir nehmen die Spitze des Stapels a , ermitteln, welcher Code ihn wahrscheinlich erzeugt hat, und geben diesen Code aus. Der Interpreter 7 fügt am Ende einer Iteration automatisch leere Elemente von der Stapeloberseite ein, sodass die 47463Rückseite auf der Stapeloberseite angezeigt wird, genau wie im ursprünglichen Programm. Es sollte einfach zu sehen sein, was als nächstes passiert: Wir durchlaufen jedes Stack-Element nacheinander und geben alle aus, bis der Stack unterläuft und das Programm abstürzt. Wir haben also im Grunde genommen eine einfache Ausgabeschleife erstellt, die den Quellcode des Programms überprüft , um zu bestimmen, was ausgegeben werden soll (wir geben nicht die Datenstrukturen aus, die von unserem Computer auf den Stack übertragen wurden) 0.5Stattdessen erstellen wir neu, welche Befehle verwendet wurden, indem wir uns ansehen, welche Strukturen erstellt wurden, und diese ausgeben. Somit ist der erste Teil der Datenausgabe 551220304010420030455(der Quellcode, der das zweitoberste Stapelelement generiert), der zweite 3341351…114525(der Quellcode, der das drittoberste Stapelelement generiert) und so weiter.

Offensichtlich werden diese Teile des Quellcodes jedoch nicht unverschlüsselt ausgegeben. 7 enthält mehrere verschiedene domänenspezifische Sprachen für die Codierung der Ausgabe. Sobald eine domänenspezifische Sprache ausgewählt wurde, bleibt sie in Gebrauch, bis sie explizit gelöscht wird. Wurde jedoch noch keine der Sprachen ausgewählt, bestimmt die erste Ziffer des ausgegebenen Codes, welche der Sprachen verwendet werden soll. In diesem Programm werden nur zwei Sprachen verwendet:551 und 3.

551ist ziemlich einfach: Es ist im Grunde der alte Baudot- / Teletyp-Code, der zum Übertragen von Buchstaben über Teletypen verwendet wird, als 5-Bit-Zeichensatz, der jedoch so geändert wurde, dass alle Buchstaben in Kleinbuchstaben geschrieben werden. Der erste auszugebende Codeabschnitt dekodiert also wie folgt:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

Wie zu sehen ist, passen wir jedes Zeichen in zwei Oktalziffern an, was ein ziemlich anständiges Komprimierungsverhältnis darstellt. Zahlenpaare im Bereich von 0 bis 5 geben uns 36 Möglichkeiten, im Gegensatz zu den 32 Möglichkeiten, die Baudot benötigt. Die restlichen vier werden für spezielle Befehle verwendet. in diesem Fall die55 am Ende das gespeicherte Ausgabeformat gelöscht, sodass wir für die nächste Ausgabe ein anderes Format verwenden können.

3ist konzeptionell noch einfacher, aber mit einer Wendung. Die Grundidee ist, Gruppen von drei Ziffern zu nehmen (ebenfalls im Bereich 0-5, da dies die Ziffern sind, für die wir garantieren können, dass wir den ursprünglichen Quellcode aus seiner Ausgabe wiederherstellen können) und sie als dreistellig zu interpretieren nummerieren Sie in der Basis 6 und geben Sie es einfach als Byte in binärer Form aus. Die Verdrehung ergibt sich jedoch aus der Tatsache, dass die Basis 6 nur 216 dreistellige Zahlen (mit möglichen führenden Nullen) enthält, aber 256 mögliche Bytes. 7 umgeht dies, indem Zahlen von 332₆ = 128₁₀ aufwärts mit zwei verschiedenen Bytes verknüpft werden;332kann entweder Byte 128 oder 192, 333Byte 129 oder 193 usw. ausgeben , bis zu 515welchem ​​Byte Byte 191 oder 255 ausgegeben werden .

Woher weiß das Programm, welche der beiden Möglichkeiten ausgegeben werden soll? Es ist möglich, Drillinge von Ziffern aus zu verwenden520 abwärts zu verwenden, um dies explizit zu steuern, aber in diesem Programm müssen wir Folgendes nicht tun: 7 wählt standardmäßig alle mehrdeutigen Bytes so aus, dass die Ausgabe UTF-8-gültig ist! Es stellt sich heraus, dass es immer höchstens eine Möglichkeit gibt, dies zu tun. Solange es UTF-8 ist (und das tun wir in diesem Fall), können wir es nur mehrdeutig lassen und das Programm funktioniert trotzdem.

Am Ende jedes 3…Abschnitts wird 525das Ausgabeformat zurückgesetzt, sodass wir zum 551nächsten Abschnitt zurückkehren können.


Dies sind entweder 410 Bytes + 0 Buchstaben in der entpackten Darstellung oder 154 Bytes + viele Buchstaben in der gepackten Darstellung. Das Zählen der Bytes in einem und der Buchstaben im anderen scheint zu schummeln.
Grimmy

1
@ Grimy: Sie verwechseln Bytes mit Zeichen. Die gepackte Darstellung besteht aus 154 Bytes in der 7er-Codierung, die 410 Oktalziffern codieren, von denen jede eine Ziffer und kein Buchstabe ist. Ihre Argumentation impliziert, dass beispielsweise ɓin Jelly kein Buchstabe ist (da seine Codierung in Jellys Codierung dem Steuercode "CSI" entspricht, wenn er in einem typischen 8-Bit-Zeichensatz und nicht in einem Buchstaben interpretiert wird). Genau wie Jelly verwendet auch 7 eine benutzerdefinierte Codierung. Da 7 jedoch keine Buchstaben verwendet, muss die Codierung keine Buchstaben codieren und kann dies daher nicht.
ais523

10

Haskell, 0 Buchstaben, 423 Bytes = 423 Punkte

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

Probieren Sie es online!


6

Jelly ,  274 260  212 Bytes + 2 Buchstaben =  314 300  252

-48 Bytes dank Nick Kennedy

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(Verwendet !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”davon Vund sind Unicode-Buchstaben und werden jeweils einmal verwendet.)

Probieren Sie es online!




@NickKennedy Ich hatte mit dem Golfen der Nummer herumgespielt, bin aber nicht zurückgetreten und habe nur versucht, die Ordinalzahlen auszugleichen, gutes Zeug - danke!
Jonathan Allan

3

PowerShell , Punkte 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

Probieren Sie es online!

Naiver Ansatz; Ich habe nur die Codepunkte genommen und sie in Dezimalzahlen konvertiert, 32 subtrahiert und sie dann wie ein behandelt, charbevor -joinich sie wieder zu einer einzigen Zeichenfolge zusammengefügt habe.




3

Jelly , 321 Bytes + 2 Buchstaben = Punktzahl 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Probieren Sie es online!

Das ist abscheulich und jemand kann es definitiv besser machen.

Überprüfen Sie die Punktzahl .


1
Eigentlich weniger schlimm als es scheint
ASCII

2

Python 3 , 380 Bytes + 5 Buchstaben = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

Probieren Sie es online!


1

Netzhaut , 140 Zeichen, 159 Bytes, 14 Buchstaben = 439 Punkte


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

Probieren Sie es online! Bearbeiten: 1 Buchstabe durch Umschalten K`auf eine neue Zeile gespeichert. Funktioniert jetzt auch in Retina 0.8.2 (aber der Titel wäre zu lang).


1

Japt -S , 304 286 Bytes + 2 1 Buchstabe s = 344 306

Nun, das ist einfach gottesfürchtig!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

Versuch es


1

PHP -a, 402 Bytes + 200 Penalty = 602 Score

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

Die Antwort von Port of Artermis Fowl und mein erster Codegolfeintrag!

Ich wünschte, das chr()könnte nur UTF-8 unterstützen. Diese zusätzlichen 3 Bytes + 40 Zeichen tun weh!


Willkommen bei PPCG :)
Shaggy

1

05AB1E , Punktzahl 209 (189 Bytes + 20 Strafe für 1 Buchstaben)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

Probieren Sie es online!

Der einzige Buchstabe ist ç. Die Währungssymbole €£¢werden in Unicode nicht als Buchstaben betrachtet.


0

Python 3 , 397 Bytes + 19 Buchstaben = 777 Punkte

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

Probieren Sie es online!

Port of AdmBorkBork's Antwort .




562 , -2 bei Verwendung von Python 2
ASCII

TIO arbeitet nicht in meiner Organisation, daher muss ich warten, bis ich nach Hause komme, um diese hinzuzufügen.
Artemis vertraut immer noch nicht SE

0

R , 384 Bytes + 12 Buchstaben * 20 Punkte = 684 Punkte

Nicht besonders originell.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

Probieren Sie es online!


0

05AB1E , Score 383 365 (325 Bytes + 2 Buchstaben * 20 Strafen)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Port von @HyperNeutrino 's Jelly Antwort .

Werde versuchen mich hier weiter zu verbessern. Die Zahl ist durch eine Reihe von Zahlen teilbar , aber keine von ihnen würde unglücklicherweise irgendwelche Bytes speichern, und die komprimierten größeren Teiler enthalten mindestens 1 Buchstaben.

-18 (+2 Bytes und -20 Strafe) dank @Grimy , Ersetzen des Buchstabens J(Join) durch .««(Reduzieren durch Verketten).

Probieren Sie es online aus.


1
Jkann .««für -18 sein. Oder für einen ganz anderen Ansatz, siehe meine Antwort .
Grimmy

@ Grimy Danke! :) Und schöne Antwort!
Kevin Cruijssen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.