Dies hängt tangential mit meiner Suche nach einer esoterischen Programmiersprache zusammen .
Eine Tabelle der Binärzahlen 0 .. 15 kann verwendet werden, um eine universelle Binärfunktion unter Verwendung von Indexierungsoperationen zu implementieren. Bei zwei 1-Bit-Eingängen X und Y können alle 16 möglichen Funktionen in einem 4-Bit-Opcode codiert werden.
X Y F|0 1 2 3 4 5 6 7 8 9 A B C D E F
- - - - - - - - - - - - - - - - - -
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
- - - - - - - - -
0 ~X ~Y ^ & Y X | 1
ZERO NOT-Y AND OR
NOT-X XOR ONE
Dieser Satz von 16 Funktionen kann also als Funktion auf Binäreingänge angewendet werden
U (f, x, y): (f >> ((x << 1) | y)) & 1 ,
oder
U (f, x, y): (f / 2 ^ (x × 2 + y))% 2 ,
oder mit Indexierung oder Matrixpartitionierung.
Es ist nützlich, die kompakteste Methode zu kennen, um eine solche Wertetabelle für alle möglichen Sprachen darzustellen oder zu generieren, die auf dieser Art von Binäroperation aufbauen.
Das Ziel:
Generieren Sie genau diese Textausgabe:
0101010101010101
0011001100110011
0000111100001111
0000000011111111
Das ist es! Kürzester Code gewinnt.
quelle
Antworten:
J, 10 (13?) Zeichen
Nummernliste:
zu binär:
Transponieren:
Umkehren:
Müssen wir die Leerzeichen entfernen? Wenn wir uns die andere Antwort ansehen, müssen wir 3 Zeichen hinzufügen und die Antwort
1":
von Jan ausleihen .quelle
Python 2, 40
quelle
APL (14)
Vorausgesetzt
⎕IO=0
(das ist eine Einstellung):Erläuterung:
⍳16
: Zahlen [0,16)(4⍴2)⊤
: Kodieren Sie jede Zahl in Basis 2 mit 4 Ziffern⊖
: horizontale Umkehrung (so landet das MSB oben)⎕D[
...]
: Wählen Sie diese Werte aus, aus⎕D
denen die Zeichenfolge besteht0123456789
. (Eine numerische Matrix wird mit Leerzeichen zwischen den Werten angezeigt, eine Zeichenmatrix nicht. Dadurch wird jedes numerische Bit in eines der Zeichen konvertiert'0' '1'
.)quelle
(4⍴2)⊤
→2⊥⍣¯1
Jelly ,
427 Bytes (nicht konkurrierend)Probieren Sie es online!
Vielen Dank an Dennis für seine Hilfe. Hier ist die erste Nachricht, hier ist die letzte (andere Diskussionen haben auch stattgefunden). Mit seiner Hilfe habe ich die Partitur anscheinend (fast) verwurzelt.
quelle
/// , 51 Bytes
Probieren Sie es online aus
quelle
GolfScript (
18 1715 Zeichen)(Mit Dank an Howard)
Ich verstehe nicht, warum die 10-Zeichen
funktioniert nicht; Ich vermute, dass ein Fehler im Standardinterpreter zu nicht unterstützten Typen auf dem Stack führt.
Eine Alternative mit 18 Zeichen, die ich vollständig verstehe, ist:
Ein mathematischer Ansatz ist mit 28 Zeichen etwas länger:
Vieles davon ist für die Basisumwandlung und das Null-Auffüllen. Ohne diese sinkt es auf 19 Zeichen,
mit Ausgabe
quelle
16,zip{n}/
dann funktionieren?16,zip{','-~n}%
zip
sollte ein Array von Arrays zurückgeben, aber es scheint tatsächlich ein Array von Ruby-Arrays zurückzugeben (ist meine beste Vermutung). Was auch immer die Elemente sind, das Anwenden von `` `` auf sie wirkt sich nicht auf die Art und Weise aus, in der sie gedruckt werden, was sich von den 4 GolfScript-Datentypen unterscheidet. Du hast recht, das','-
scheint sie in normale Arrays zu verwandeln: netter Trick.CJam - 16
Äquivalenter Java-Code (als Erklärung):
quelle
Javascript (ECMA6), 67
Rufen Sie dazu an
Bitverschiebung!
Und auch XOR und ein bisschen Rekursion.
Das Erste, was wir bemerken müssen, ist, dass wir, wenn wir eine Zeile nehmen und Sie diese verschieben (Anzahl der fortlaufenden Nullen) / 2 nach links, ein nettes XOR erhalten, um die nächste Zeile zu bilden.
Beispielsweise,
XOR diese bitweise geben uns
Das ist die nächste Zeile (Zeile 3).
Wenden Sie den gleichen Prozess für Zeile 3 an, verschieben Sie 2 nach links und wir erhalten ...
XOR'ed gibt
Das ist Zeile 2.
Beachten Sie, dass sich der Betrag, den wir verschieben, jedes Mal halbiert.
Jetzt rufen wir diese Funktion einfach rekursiv mit 2 Argumenten auf. Der ganzzahlige Wert dieser Zeile und N, um wie viel verschoben werden muss. Wenn wir rekursiv arbeiten, geben Sie einfach den verschobenen XOR-Wert und n / 2 ein.
ist, die Nullen an den Anfang jeder Zeile zu setzen, weil toString führende Nullen entfernt.
quelle
s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
J, 21 Zeichen
i.16
ist eine Liste von 0..152^i.4
ist eine Liste (1,2,4,8)%~/
Erzeugt die Tabelle der Unterteilungen, in der das linke Argument Zeilen bildet, aber das rechte Argument für die Unterteilung ist2|
berechnet den Rest nach dem Teilen [jeder Zelle] durch zwei<.
Etagen, die den Wert 0 oder 1 haben1":
formatiert die Tabelle mit einem Zeichen pro Zellequelle
floor
sollte nicht nötig sein. Die Domain von2|
ist doch schon 0 oder 1, oder?|
arbeitet mit Schwimmern .2|3.25
ist1.25
. Das wollen wir nicht.GolfScript, 19 Zeichen
Ein weiterer GolfScript-Ansatz
quelle
Rubin (44)
Langweilig und langweilig: Drucken Sie einfach die mit 0 aufgefüllten Binärdarstellungen der Zahlen.
quelle
Nachsatz
108177126777470Vertauscht die Werte für eine einfachere Mod- Off-Methode.
151131119Anwendung eines APL- ähnlichen Ansatzes. edit: String-Chopping und Array-Zipping wurden durch Indexing und For-Loops ersetzt.
Eingerückt:
Das erneute Implementieren der Funktionen, die in der erfolgreichen J-Antwort verwendet wurden, führt dazu (mit viel Support-Code ).
i
Hier ist ein 1-basierter Vektor in Iversons Elementarfunktionen beschrieben , daher der-1 ... +
zu erzeugende0 .. 15
.quelle
Perl (36 + 1)
+1 für
say
wie gewohnt. Das Double0
ist kein Tippfehler :)quelle
say
.perl -e'...'
ist Standard und erfordertperl -E'...'
keine Erhöhung der Byteanzahl. Wie auch immer, ich denke , es beschlossen wurde Code Golf Meta , die-M5.01
frei ist.JavaScript (ECMA6), 108
Ich versuche hier einen anderen Ansatz. Obwohl die Verwendung von Binäroperatoren empfohlen wurde , habe ich mir erlaubt, diese Lösung einzureichen, da die Herausforderung auch kolmogorov-komplex ist, und ich dachte: Wie kann ich die Menge des Codes reduzieren, der diese Werte darstellt? Grundlagen .
(Zeilenumbruch zur Vereinfachung).
Es ist eine Schande, dass ich mich mit dem Auffüllen mit führenden Nullen herumschlagen musste, aber der Punkt dieses Codes repräsentiert einfach das binäre Zielergebnis in Base 36, das genau das ist
gut, a43, 2z3, 73
Werte sind.Hinweis: Mir ist klar, dass es nicht annähernd die Gewinner-Antwort sein wird, sondern nur der Idee zuliebe ...
quelle
alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n'))
. Bei diesem Ansatz werden Zeilenumbrüche anstelle von vier Sekunden verwendetalert()
.Korrigiert , 44 Bytes
Cedric's Antwort wurde auf Sprects portiert.
quelle
MATL ( nicht konkurrierend ), 8 Bytes
Probieren Sie es online!
Erläuterung
quelle
CJam ( nicht konkurrierend ),
109 BytesVielen Dank an @Dennis für 1 Byte!
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
5852 ByteErstellt die Zeichenfolge rekursiv.
Wie es funktioniert
Diese Rekursion basiert auf der Tatsache, dass das Muster aus der vertikalen Binärdarstellung der Halbbytes 0x0 bis 0xF besteht:
Daher kann jede Position (X, Y) in diesem Muster als das Y-te Bit von X: ausgedrückt werden
X & (1 << Y)
. Wir können auch dieses Bit - Isolat mit:(X >> Y) & 1
. Anstatt von X und Y, wir Iterierte auf eine einzige Variable die Verfolgung imn
Bereich von 0 bis 63. So wird die Formel:(n >> (n >> 4)) & 1
. Es ist tatsächlich einfacher, von 63 auf 0 zu iterieren, sodass die Zeichenfolge in umgekehrter Reihenfolge erstellt wird. Mit anderen Worten, das Zeichen n-1 wird links vom Zeichen n angehängt .Als Randnotiz bringt die Rekursion hier nichts außer kürzeren Code.
Ohne die Zeilenumbrüche ist der Code 35 Byte lang:
Wir brauchen 17 weitere Bytes, um die Zeilenumbrüche einzufügen. Dies kann auf 14 Byte verkürzt werden, wenn ein Zeilenumbruch zulässig ist.
Demo
quelle
(f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n`
(63 Bytes).replace(/.{16}/g,"$0\n")
hat die gleiche Länge. Schade.Bash + Coreutils, 65 Bytes
Nicht die kürzeste, aber auch nicht die längste:
(Das letzte Zeichen ist ein Leerzeichen)
Probieren Sie es online aus .
quelle
NARS2000 APL, 22
Abgeleitet von der APL-Antwort von Marinus, die auf NARS2000 nicht zu funktionieren scheint.
Vektor generieren
Wechseln Sie auf Nullbasis
Form für die Codierung generieren
Kodieren
Passen Sie die 1-basierte Indizierung an
Hauptachse umkehren
Index
quelle
C 73 Zeichen
Dies ist nur eine allgemeine Lösung für die Ausgabe von 64 Bit in vier 16-Bit-Blöcken. Sie müssen nur die Nummer ändern
0xFF0F0F33335555
um eine andere Bitfolge auszugeben.vereinfacht & ungolfed:
quelle
Haskell, 73
Huch, 73 Zeichen! Ich kann es aus Liebe zu Gott nicht kleiner machen.
Das wirklich traurige daran ist, dass Sie nur 74 Zeichen benötigen, wenn Sie die Ausgabe mit bash wiedergeben würden.
quelle
JavaScript (ES5) 69
for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}
quelle
inca2 ,
332724Dies basiert auf der Antwort von Jan Dvorak . inca2 kann dies ab den Bugfixes von gestern ausführen. Technisch ungültig, da die Sprache nach der Frage erfunden wurde, aber Erfindung einer Sprache war ein Teil meines Ziels, die Frage zu stellen. Wir danken Ihnen für die anderen Antworten. :)
Erläuterung:
Einige der Klammern sollten unnötig sein, aber anscheinend gibt es noch einige Probleme mit meiner Interpretation der Grammatik. Und "ravel => map => reshape" ist wirklich umständlich: map muss schlauer sein. Edit: Bugfixes ermöglichen die Beseitigung von Parens.
Die Basenumwandlung in eine separate Funktion zu
N:x|y%.x^~1+[]/x.y
faktorisieren, ergibt dies1916 char version.Und während ich hier sowieso betrüge, habe ich dies zu einer eingebauten Funktion gemacht. Aber auch wenn es eine ist niladic- Funktion handelt (für die kein Argument erforderlich ist), werden niladic-Funktionen nicht unterstützt, und es muss ein Dummy-Argument angegeben werden.
inca2, 2
quelle
Pyth 24/26
Die kürzeste Methode war die Antwort von grc in Pyth übersetzte , die ich für billig hielt, also habe ich meine eigene Methode gemacht:
Meins: 26 Zeichen
grc's: 24 zeichen
quelle
C ++ 130
Konvertiert hexadezimal in binär
quelle
Haskell (Lambdabot), 47 Bytes
Ein bisschen schummelig, weil es transponiert von Data.List und replicateM verwendet von Control.Monad verwendet, jedoch werden beide standardmäßig von Lambdabot geladen.
Ich bin mir auch sicher, dass es Raum für Verbesserungen gibt, ich wollte nur die Idee teilen
quelle
Julia (39 Bytes)
Zweites Drehbuch, das ich jemals in Julia geschrieben habe, muss zugeben, dass ich Julia mag, sie ist ein hübsches Biest.
Kehrt zurück
Erläuterung:
bin(x,4)
- Konvertieren Sie int in eine binäre Ganzzahl mit einem Abstand von 4 Zeichen.collect(_)
- String in char-Array aufteilen.map(x->_,0:15)
- Tun Sie dies für die ersten 16 Stellen des Bereichs.hcat(_...)
- Splat und horizontal zu einer Matrix verketten.quelle
C
8377767471Ziemlich einfach.
quelle
?:
und eine weitere Einsparung von 1 durch Verschieben von a++
.main
vonf
. lolR
5341 BytesEine Übersetzung von @ grcs Python-Antwort. 12 Bytes der ursprünglichen Übersetzung wurden durch Verwendung von
rep()
's'each
und 'length
arguments' (und partieller Argumentübereinstimmung) und durch Erinnerung daran, dass dies0:1
äquivalent zu ist, entferntc(0,1)
.Sie können auch versuchen, eine Übersetzung von @ Gareths J-Antwort zu erstellen, etwa so (34 Bytes):
Es verwendet jedoch eine Funktion, die nicht Teil der Basis R ist, und gibt eine Matrix aus, die sich wie in der Spezifikation nur schwer in exakten gedruckten Text formatieren lässt.
quelle