Dies ist eine restricted-Quelle , Kolmogorov-Komplexität , Code-Golf - Herausforderung einen festen Ausgang ohne Eingabe zu erzeugen.
Das Ausgabeformat ist jedoch flexibel - es kann als Standardausgabe ausgegeben, als Standardfehler ausgegeben, als Liste von Zeichen zurückgegeben, als Liste von Bytes zurückgegeben oder als Liste von Ganzzahlen zurückgegeben werden. Wenn Sie der Meinung sind, dass etwas anderes vernünftig erscheint, fragen Sie einfach in den Kommentaren nach!
Hier ist ein einfacher ASCII-Kunst- CODEGOLF mit großen Buchstaben :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Ohne Zeilenumbrüche (oder Leerzeichen in den Zeilen) sind 256 Zeichen zulässig:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Die (0-basierten) Indizes der Nicht-Leerzeichen sind:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
Sie dürfen keines dieser 97 Bytes in Ihrem Code verwenden , müssen jedoch eine Liste (oder eine ähnliche Ausgabe) dieser Bytes in dieser Reihenfolge erstellen, wobei die fehlenden Bytes durch das 32. Byte in der von Ihnen verwendeten Codepage ersetzt werden (in vielen, vielen) Codeseiten ein Leerzeichen).
Sie können die hübschen * Zeilenumbrüche (aber keine nachgestellten Leerzeichen in den Zeilen) einfügen, wenn dies hilfreich ist.
Zum Beispiel mit der Jelly Code-Seite ist diese Ausgabe akzeptabel:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... aber so ist es:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
...und so ist:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Letzteres ist eine gültige Listenausgabe in einer beliebigen Sprache mit einer beliebigen Codepage, und es kann auch eine angemessene Listenformatierung verwendet werden.)
Hier ist Python 3-Code, der die nicht verfügbaren ASCII-Bytes anzeigt.
* Obwohl der Druck selbst vielleicht gar nicht so hübsch ist!
quelle
$%&*123456=ADHKRY]``ghosvz}~
und kein Zeilenvorschub?array_map(function($n){return sprintf("%6b",$n);},...)
ohne$
(ich könnte das tun) UND ohne}
(keine Ahnung). Ja; Ich möchte die Daten packen!Antworten:
Python 2 ,
321203 BytesProbieren Sie es online!
Erläuterung:
von innen heraus:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
ist die Zahl25731972618407747697792173390589410779249734035626759409848989703511287412985
, die mit zulässigen Zeichen codiert ist. (Nein ist123456
erlaubt)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
ordnet die Zeichenfolge der Dezimalzeichenfolge zu:reduce(lambda x,y:x+y,'..','')
ist dasselbe wie''.join('..')
(Nein isto
erlaubt)repr('..')
stattstr('..')
(Neins
, erlaubt)'abcdefijkl'.find(y)
ordnet einen Buchstaben einer Ziffer zu.enumerate(bin(int(...)))
konvertiert den Zahlenstring in einen Binärstring und zählt auf. Dies gibt die Paare[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
wandelt die Aufzählung in das Endergebnis um.map(lambda(i,x):.. , .. )
statt[... for(i,x)in ...]
(Neino]
, erlaubt)lambda(i,x): ..
konvertiert jedes (Index-, Wert-) Paar entweder in den Index oder32
.(x>'0'and i-8-8-8-8)+8+8+8+8
ist das gleiche wie:x>'0'and i or 8+8+8+8
, (Neino
, erlaubt)[8+8+8+8,i][x>'0']
oder[8<<9-7,i][x>'0']
, (Nein]
, erlaubt)8+8+8+8
=32
(Nein ist23
erlaubt)Das heißt, das Programm ist im Wesentlichen dasselbe wie:
quelle
C (gcc) , 318 Bytes
Probieren Sie es online!
Dieser ist ein bisschen eine Reise ...
1. Komprimieren Sie die Liste
Irgendwie müssen wir überprüfen, ob eine bestimmte Ganzzahl einer der speziellen Codepunkte ist. Jede "nackte" Liste ist viel zu lang, deshalb verwenden wir eine Checkliste. Diese Liste hat an Codepunkten, die 'eingeschränkt' sind, einen Wert ungleich Null und an solchen, die es nicht sind, einen Wert ungleich Null.
Leider dauert dies immer noch 512 Bytes, nur um die Liste zu haben (wie es aussieht
0,0,7,7,0,7,0,...
). Dies kann mit einer Bitmaske gekürzt werden.Um die Bitmaske zu verwenden, werden wir jedes Byte in zwei Teile aufteilen. Die ersten 3 Bits wählen eine Maske aus einem Array aus, während die letzten 5 ein Bit im Array auswählen. Das Array kann nicht weiter verkleinert werden, da die standardmäßig verwendeten 32-Bit-Ganzzahlen nicht mehr als 2 ^ 5 = 32 Bit unterstützen.
Unter Verwendung einer Referenzimplementierung schrieb ich:
Mit dem Befehl konnte ich die entsprechenden Werte für dieses neue Array generieren
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. Dies übergibt die Ausgabe des obigen Programms (./a.out
) an dasrev
Programm, das jede Zeile umkehrt. Dies wird zusammen mit einem Header an bc ausgegeben, der die Ausgangsbasis auf 16 und die Eingangsbasis auf 2 setzt. Somit konvertiert bc die Binärziffern in eine hexadezimale Bitmaske.Das resultierende Array ist in dieser "Beta" -Lösung zu sehen:
2. Umgang mit den Zwängen
Es gibt viele Einschränkungen, die für den obigen Code gelten müssen. Hier gehe ich einzeln durch.
Dies wird auch von anderen Sprachen wahrgenommen. Ohne Zuweisung in C ist es sehr schwierig, garantierte Werte in Variablen zu erhalten. Für uns ist es am einfachsten, unsere Funktion als vollständiges Programm zu schreiben. Das erste Argument von
main
wird übergeben, dessen Wertargc
1 ist, wenn es ohne Argumente aufgerufen wird.Die einzigen Schleifenkonstrukte in C sind
for
,while
undgoto
alle enthalten eingeschränkte Zeichen. Dies lässt uns die Rekursion verwenden. Die Hauptfunktion beginnt bei 1 und wird solange wiederholt, bis das Argument> 256 ist. In der Zwischenzeit wird das Argument intern dekrementiert, um einen 0-indizierten Wert zu verwenden.Die Werte im obigen Array sind hexadezimal, auch wenn sie in dezimal umgewandelt wurden. Sie enthalten einige eingeschränkte Symbole, insbesondere 123456 (AD kann in Kleinbuchstaben geschrieben sein). Um dies zu umgehen, wird jede Konstante mit einer anderen XOR-Verknüpfung versehen, sodass die eingeschränkten Zeichen entfernt werden. Aus 1 wird 9 ^ B, aus 2 wird C ^ E, aus 3 wird B ^ 8, aus 4 wird 8 ^ C, aus 5 wird 9 ^ C und aus 6 wird 9 ^ F. .
Die Einschränkungen überlassen uns nicht viele Druckfunktionen.
putchar
undputs
sind beide eingeschränkt, verlassenprintf
. Leider müssen wirprintf
einen Formatstring senden , idealerweise "% c". Alle diese Zeichenfolgen haben das lästige Prozentzeichen, das wir entfernen möchten. Zum Glück nehmen wir eine Little-Endian-Maschine an (denn anscheinend verwendet TIO diese, und das ist ziemlich typisch). Indem wir die Ganzzahl konstruieren, deren Bytes im Speicher 0x25 (%), 0x63 (c), 0x00 (\ 0) sind, können wir alles (egal, es steht hinter dem Nullterminator) einfach an seine Adresse übergebenprintf
und es wird angenommen ist eine Zeichenfolge. Eine solche Nummer, die funktioniert, ist -989830363 (0xC5006325). Dies ist unter den Einschränkungen 77707-989908070 einfach zu erstellen.Es gibt immer noch das Problem, dass wir keine Werte referenzieren können (weil wir sie nicht zuweisen können und weil wir & nicht verwenden können), daher müssen wir ein Array-Literal (int []) {...} verwenden. Wir verwenden dies tatsächlich auch für das obige Bitmasken-Array.
Wir können weder ']' noch '}' verwenden, um unsere Arrays oder Funktionen zu schließen. Glücklicherweise hat C Digraphen und Trigraphen, die funktionieren.
:>
wird werden]
, während??>
werden wird}
. Dies erfordert, dass gcc den-trigraphs
Schalter übernimmt , da standardmäßig Trigraphen ignoriert werden (was gegen den Standard verstößt).Wir können weder
&
Teile unseres Index maskieren, noch können wir sie%
auf altmodische Weise verwenden. Deshalb setzen wir auf implementierungsspezifisches Verhalten. Insbesondere verschieben wir unsere 32-Bit-Ganzzahlen weit genug nach links, um Bits zu verlieren, und dann zurück nach rechts. Um zum Beispiel die letzten 5 Bits unserer Zahl zu erhalten, verschieben wir sie zuerst um 27 Bits nach links (Verlassenabcde00000...
) und dann um 27 Bits nach rechts (Verlassen...00000abcde
).Wir brauchen noch ein paar wörtliche Werte im gesamten Code - diese stammen aus Arnauld's JS-Antwort, plus 27 (aus dem obigen Grund) wird von mir als hinzugefügt
9+9+9
.3. Setzen Sie es zusammen
Hier ist die Beschreibung der Quelle mit all diesen Änderungen zusammen.
quelle
?:
Erweiterung, um bitweise Shift Modulo 32, 273 Bytes zu-trigraphs
Option auf einigen C-Compilern nicht benötigt , während?:
gcc erforderlich ist-trigraphs
.Brainfuck , 635 Bytes
Probieren Sie es online!
Als Reaktion darauf, dass ich endlich von Javascript geschlagen wurde, habe ich alles getan, was ich kann:
1 Byte gespart durch 32 in Zelle 0 und Inkrementieren von Zelle 1 (der einzige Grund, warum ich es ursprünglich anders hatte, war eine schnelle Korrektur, als OrjanJohansen darauf hinwies, dass ich es nicht verwenden konnte
]
)1 Byte gespart durch Dekrementieren einer dritten Zelle (anfänglich bei 0), um
255
= zu erzeugen-1
2 Bytes, die durch das Drucken von Leerzeichen zwischen den Zeichen 31 und 36 ohne Verwendung von gespeichert werden,
<>
aber stattdessen einfach bei 32 anhalten, um von Zelle 0 aus zu drucken, wenn von 31 bis 33 inkrementiert wird.Brainfuck , 639 Bytes
Probieren Sie es online!
Zuerst erzeugen wir die Zahl 32. Dann erhöhen wir nur eine Zelle und schalten den Druck zwischen der Zelle und der Zelle mit der Zahl 32 um. Stetig steigende Zahlen sind etwas, was Brainfuck gut kann.
Es ist schön, Javascript mit Brainfuck zu schlagen, es kommt nicht oft vor!
quelle
]
kein erlaubter Charakter. Obwohl Sie das immer noch beheben und das Javascript schlagen sollten. :)]
nicht erlaubt ist, denke ich, dass meine BF-Antwort jetzt wahrscheinlich optimal ist.JavaScript (SpiderMonkey) ,
1918,1598,1487,1431 Byte56 Bytes dank @ user202729 gespeichert
Probieren Sie es online!
Wie?
Die Tatsache, dass
=
das nicht erlaubt ist, ist ein Showkiller in JS. Wir können keine Variablen zuweisen und wir können auch keine Pfeilfunktion verwenden.+
-
/
|
^
<<
>>
8<<98
8<<2
quelle
32
as8<<9-7
speichert jeweils ein Byte32
.32 = 8<<98
Haskell,
623617614594360342 BytesEdit: -234 Bytes dank @Lynn durch Auffinden einer Musterkodierung als String. -18 Bytes dank @ Ørjan Johansen.
Probieren Sie es online!
Wie es funktioniert
quelle
(id:pure(\_->8+8+8+8))
durchuntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
und speichern ein Bündel von Bytes.filter
stattuntil
zu verzweigen (undcycle
ein Extra zu vermeiden++pure(...)
).Brain-Flak- r,
41904188 BytesProbieren Sie es online!
Dies ist ein wenig schwierig für Brain-Flak , da wir nicht verwenden können ,
]
oder}
. Das heißt, die einzigen nützlichen Zeichen sind<>()
.Hier ist ein Haskell-Programm, das mir beim Schreiben geholfen hat
Es zählt nur, zu überspringen, wo Räume sein müssen, und diese einzeln zu verschieben.
quelle
{}
Computersuche haben, konnten tatsächlich das Optimum in endlicher Zeit finden.JavaScript (SpiderMonkey) ,
1001919789441 ByteProbieren Sie es online!
Endlich schlägt BF !!!
Grund Idee
Konvertieren Sie jedes Zeichen der langen Zeichenfolge in den Index oder 32, abhängig vom Wert.
Array.prototype.map
? Wie bekomme ich ein Array?Brute Force , um festzustellen, auf welche Objekte zugegriffen werden kann, indem auf Objekteigenschaften zugegriffen wird (da dies
]
nicht zulässig ist, sind nur Eigenschaften mit einem Namen zugänglich, der einem Bezeichner entspricht).RegExp.prototype.exec
Gibt ein Array-ähnliches Objekt zurück, wenn eine Übereinstimmung vorliegt. Wenn kein Argument zur Verfügung gestellt, auf das Argument Standardwertundefined
, so/u/.exec()
Streichhölzer und ein Array zurück.Erhalte 2 willkürliche unterschiedliche Werte für 2 verschiedene Charaktere
Wir wollen haben
(x,y)=>x=='0'?32:y
, aber wir können nicht verwenden=
.Stattdessen werden wir tun
Wir können
map
die Zeichenfolge über eine Funktion, aber=>
legen, dies ist jedoch nicht zulässig, sodass nur einige Funktionen verwendet werden können. Es kann gebundenethis
und einige gebundene Argumente haben (so hat es die Form(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)Nach Prüfung einer Liste von Funktionen (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
) entscheide ich, dass die folgenden Funktionen verwendet werden (nach Prüfung aller anderen Kombinationen)repeat
: number -> verschiedene Strings.find
: thisArg -> erstes Element in der Arrayübereinstimmung.Die allgemeine Idee wäre:
wo
somefunction
berücksichtigt dasthis
Argument (x
) und das erste Argument (elem1
oderelem2
) und zurückgegeben, ob es übereinstimmt.Die letzte Pfeilfunktion wird umgeschrieben
[].find.bind([elem1,elem2],somefunction)
.Array-Literal
Wir können regex exec verwenden, um ein Array
fill
mit unterschiedlichen Werten zu erhalten. Beispielsweise/()/.exec()
ein Array der Länge 2 zurück, dann können wir es nach Bedarf füllen.Welche
somefunction
brauchen wir?Wir brauchen eine, von der ein wahrer / falscher Wert abhängt
this
(dies ist eine von zwei Funktionen, die wir zurückgeben) und dem ersten Argument (muss eine Zeichenfolge oder ein Array sein).Dafür habe ich verwendet
indexOf
- es gibt einen falschen Wert zurück, wenn das erste Argument ein Präfix von istthis
Arguments ist.Stellen Sie die Funktionsliterale dar
quelle
TI-Basic (Serie 83), 578 Byte
TI-Basic hat eine spezielle "Code-Seite" mit seltsamen Design-Optionen wie dem Verschieben des Leerzeichens auf 0x29, sodass 0x20 der
randM(
Befehl sein kann.Es ist schwierig herauszufinden, wie man TI-Basic dazu bringt, die richtige Art von Objekt auszugeben. Zeichenfolgen würden aus mehreren Gründen nicht funktionieren: Es gibt keine Möglichkeit, auf ein Token zu verweisen, ohne das Token zu verwenden, und wir dürfen das
"
Zeichen auch nicht verwenden. Wir können nicht einfach eine Liste schreiben, weil{
und}
verboten sind. Wir dürfen die Zeichen[
und]
für Matrizen verwenden, aber eine 1 × 256-Matrix funktioniert nicht, da Matrizen höchstens 99 Zeilen und Spalten enthalten dürfen. Wir können nicht verwenden→
, um Variablen zuzuweisen, und wir können nicht an die Listenvariablen gelangenʟ
oder sowiesoL₁
durchL₆
.Hier schreiben wir also eine komplizierte logische Formel mit Ungleichungen auf, die besagt, wenn ein Zeichen eines der Zeichen ist, die wir ausgeben möchten. Dann verwenden wir den
seq(
Befehl, um eine Liste mit1
an diesen Positionen und0
anderswo zu generieren . Von dort aus beendet ein weitererseq(
Befehl und ein wenig Rechnen den Job.Das war der aufregende Teil; der Rest spielt mit den Konstanten und ich habe das wahrscheinlich nicht so oft wie möglich gemacht. Einer der Tricks, die ich benutze, ist standardmäßig
Xmax
10,XFact
4 undΔTbl
1.quelle
(
es verboten ist.[A](I,J)
, und nach meinem Verständnis möchten Sie so etwas wie[A](int(I/99),I-99int(I/99))
alle Elemente der Matrix auslesen[A]
- das können wir auch nicht. (Übrigens)
ist auch verboten. Zum Glück müssen wir keine endenden Klammern schließen, aber es schränkt ein, wie viele Befehle verwendet werden können.)Brain-Flak- r, 3894 Bytes
Probieren Sie es online!
Ich habe ein Programm geschrieben, um für jede Ausgabe das optimale Brain-Flak-Programm zu generieren. Annehmen, dass:
<>
ist nicht benutztDann ist diese Lösung optimal.
Ich war jedoch ein bisschen faul und implementierte eine Lösung, die nicht sehr schwer zu finden ist und die in 1M13s (Zeit in Anspruch nimmt) ausgeführt wirdO ( n5) oder so). Möglicherweise suche ich später nach einer effizienteren Lösung.
quelle
Python 2 ,
162157 BytesAchtung : Nicht druckbare Zeichen voraus!
Probieren Sie es online!
Basierend auf der bestehenden Antwort von TFeld , jedoch mit einigen Änderungen:
0xe0/7
anstelle von8+8+8+8
, um 32 darzustellen. ( Ein Programm, um die kürzeste Darstellung einer Zahl zu finden. )bytearray
, um das große Literal darzustellen.A
bytearray
ähnelt astr
, ist jedoch iterierbar, es gibt Ganzzahlen, keine Zeichen. Wir können es verwenden, um ein Basis-N-Literal zu codieren und esreduce(lambda x,y: x*N+y, my_bytearray)
zu decodieren.Da Python 2-Dateien standardmäßig nicht codiert sind, können nur Zeichen in ASCII (0..127) verwendet werden. Null-Byte, Zeilenumbrüche, Backslashes und Anführungszeichen benötigen 1 Byte mehr.
Es ist auch nicht möglich, alle Basen zu verwenden.
Angesichts dieser Einschränkungen habe ich ein Programm geschrieben , um die kürzeste Darstellung zu finden
n
.quelle