Code auf 8 Arten lesen, um 8 Zahlen auszugeben

21

Die englische Sprache und die meisten Programmiersprachen werden von links nach rechts und von oben nach unten geschrieben und gelesen, aber das muss nicht der Fall sein .

In der Tat für den Textblock

ABC
DEF

Ich kann mir acht verwandte Arten vorstellen, wie es gelesen werden könnte:

  1. Von links nach rechts, von oben nach unten (LTR-TTB): ABCDEF
  2. Von oben nach unten, von links nach rechts (TTB-LTR): ADBECF
  3. Von links nach rechts, von unten nach oben (LTR-BTT): DEFABC
  4. Von unten nach oben, von links nach rechts (BTT-LTR): DAEBFC
  5. Von rechts nach links, von oben nach unten (RTL-TTB): CBAFED
  6. Von oben nach unten, von rechts nach links (TTB-RTL): CFBEAD
  7. Von rechts nach links, von unten nach oben (RTL-BTT): FEDCBA
  8. Von unten nach oben, von rechts nach links (BTT-RTL): FCEBDA

Herausforderung

Schreiben Sie einen rechteckigen Textblock, der auf jede der acht oben genannten Arten als acht einzeilige Programme in der Sprache Ihrer Wahl gelesen werden kann . Jedes dieser Programme sollte eine andere Ganzzahl von eins bis acht ausgeben.

Es spielt keine Rolle, welche Leserichtung welche Zahl ausgibt, sie müssen nicht mit den obigen Zahlen übereinstimmen. Zum Beispiel, wenn Ihr Textblock noch ist

ABC
DEF

dann geht das Programm ABCDEFMacht Ausgang 5und FEDCBAMacht Ausgang 2, und die anderen sechs Programme ausgeben würde 1, 3, 4, 6, 7, und 8in einer bestimmten Reihenfolge.

Der Textblock kann beliebige Zeichen mit Ausnahme der Zeilenendezeichen enthalten .

Die Ausgabe sollte nach stdout oder einer ähnlichen Alternative erfolgen, wenn Ihre Sprache keine ordnungsgemäße stdout hat. Es erfolgt keine Eingabe. Sie können davon ausgehen, dass die Programme in einer REPL-Umgebung ausgeführt werden.

Pietu1998 hat gemeinnützig eine JSFiddle geschrieben , die den 8 verschiedenen einzeiligen Programmen einen Textblock gibt. Ich habe es zu einem Stack-Snippet gemacht:

<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+"   "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/>&nbsp;<label for="b">Show directions</label><br/><pre id="a"></pre>

Sie können immer noch finden Martins CJam Version hier .

Wertung

Ihre Punktzahl ist der Bereich Ihres Textblocks (die Breite multipliziert mit der Höhe). Die Einsendung mit der niedrigsten Punktzahl gewinnt. (Im Wesentlichen gewinnt der kleinste Code, daher der Tag.) Tiebreaker wechselt zu dem zuvor veröffentlichten Beitrag.

Das Beispiel ist 2 mal 3, also ist die Punktzahl 6. Eine Punktzahl von weniger als 4 (2 mal 2) ist unmöglich, da dann einige der 8 Programme identisch wären und nicht zwei verschiedene Werte ausgeben könnten.

Calvins Hobbys
quelle
6
Warum die "nur druckbare ASCII" -Regel? Dies bedeutet, dass APL bei dieser Herausforderung nicht mithalten kann. :(
Moris Zucca
3
Ich habe eine Geige gemacht , die einen Codeblock in die 8 Programme konvertiert. Könnte als Ausschnitt enthalten sein, möchte aber die Meinung von OP dazu.
PurkkaKoodari
3
@ MartinBüttner Alles klar, ich habe es behoben. Es scheint String.prototype.repeat()noch ein bisschen neu zu sein. Auch bestätigt, jetzt im IE zu arbeiten. neue Geige
PurkkaKoodari
@MorisZucca Alle Zeichen außer den Zeilenumbrüchen sind jetzt zulässig.
Calvins Hobbys
@ Pietu1998 Danke für die Geige, ich habe es als Snippet hinzugefügt.
Calvins Hobbys

Antworten:

21

J, 3 · 3 = 9

1[2
+2+
2+2

Alle Richtungen ausführen:

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

Erläuterung:

  • In J geht die Ausführung von rechts nach links und es gibt keine Operator-Rangfolge.
  • Das [( left) nimmt die linke Seite seiner beiden Operanden, so dass es im Wesentlichen die gesamte rechte Seite unseres Ausdrucks aufhebt, z . B. 1+2[2+2+2wird 1+2[6und dann 1+2.
  • Die linken Ausdrücke sind Zusätze mit insgesamt 1, 2, 3 und 4 Operanden. Es gibt zwei nOperandenausdrücke, einen mit der Zahl 1und einen mit nur 2s. Die Zusätze mit 1erzeugen die ungeraden Zahlen und die anderen die geraden.
randomra
quelle
5
Das ist wirklich nett. Ersetzen Sie [durch ;und es sollte in der REPL-Umgebung der meisten Sprachen funktionieren.
Optimierer
18

Befunge-98 ,5x5 = 25 5x3 = 15

1+4+2
$.@.$
3+4+4

Ich habe ein kleines Skript geschrieben, das die richtigen Zahlen für mich gefunden hat. Es hat eine Weile gedauert, aber hey, ich habe gerade GolfScript geschlagen! : D

Die Skripte, die ich verwendet habe, sind hier und hier , aber ich empfehle nicht, sie anzuschauen, da der Codestil extrem krebserregend ist.

Unterprogramme

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

Alte Version

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

Unterprogramme

Geben Sie die Nummern 1-8 aus.

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR
PurkkaKoodari
quelle
14

Brainfuck $ , 4x3 = 12

Gehirnfick $ ist sehr ähnlich wie Brainfuck , hat aber einige weitere Befehle, darunter ein Befehl der aktuellen Zelle Wert als numerische Ausgabe zu Ausgabe, die für diese Herausforderung sehr nützlich war.

++:+
  ++
++++

Einzeilige Befehle:

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6
ProgramFOX
quelle
Ich würde behaupten, Sie brauchen keine Brainfuck $; Befehl. Ich würde überlegen, einfach zu verwenden. und die Ausgabe von 0x01-0x08 ist vollkommen gültig. Es ist Brainfuck, verdammt noch mal. +1.
matega
Ich würde mit binärer Ausgabe in Ordnung sein.
captncraig
7

TECO, 3 · 5 = 15

 +4 5
+2=4 
 +1 \

=Gibt den Wert des letzten numerischen Ausdrucks aus. \wird verwendet, um Zahlen aus Zeichenfolgen zu lesen oder zu schreiben, aber ich verwende es hier nur als Ablage.

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5 3
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ 8
Feersum
quelle
7

Piet - 12 x 12 = 144

Bildbeschreibung hier eingeben

Da ein einzeiliges Programm niemals beendet werden kann, wird angenommen, dass es nach der ersten Ausgabe beendet wird.

8 Unterprogramme in einem Bild:

Bildbeschreibung hier eingeben

captncraig
quelle
6

GolfScript, 4x4 = 16

1})7
)  }
}  )
3)}5

Nutzt den guten alten "Superkommentar": Ein nicht passender }ignoriert den Rest des Codes (in diesem Fall hätte ein normaler Kommentar #genauso gut funktioniert, da der gesamte Code als einzelne Zeile ausgeführt wird). Von jeder Ecke gibt es also entweder nur eine einzige Zahl oder (in der anderen Richtung) diese Zahl um 1 erhöht, da die Ausführung beendet wird und der Stapelinhalt gedruckt wird. Die 8 Programme sind

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT
Martin Ender
quelle
5

Haskell, 26 × 26 = 676

Verwendet comments ( --), um die Rückwärts- und Seitwärtsbits auszublenden. Das macht es schrecklich lang

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam
HEGX64
quelle
2
Es scheint mir, dass dies auf die meisten Sprachen mit Inline-Kommentaren ausgedehnt werden kann
Sp3000
4

Vorspiel , 5x3 = 15

12 34
  !  
56 78

Dies setzt den Python-Interpreter voraus , der Werte als Zahlen anstelle von Zeichencodes ausgibt.

Dies schlägt Befunge $ nicht, aber es schlägt meine GolfScript-Einsendung und ich mag seine Einfachheit. Beachten Sie auch, dass nur 9 Zeichen ohne Leerzeichen verwendet werden. ist weniger als bei allen anderen Einsendungen (J schlägt erneut zu :)). Im Prelude wird jede Ziffer einzeln auf den Stapel geschoben, und je nach Pfad befindet sich direkt vor dem eine andere Ziffer !, die nur das oberste Stapelelement druckt. Die 8 Programme sind:

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

Alternativ gibt es auch

 1 3 
1+!+1
 5 7 

Dadurch werden die ungeraden Zahlen auf den vertikalen Pfaden verschoben und 1auf den horizontalen Pfaden inkrementiert :

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1
Martin Ender
quelle
2

CJam - 7 × 7

Nicht beeindruckend, aber es gab keine CJam-Antwort und ich mag es, wie es aussieht :)

 8;];1 
7     2
;  0  ;
] 0 0 ]
;  0  ;
6     3
 5;];4 

Es nutzt hauptsächlich die Tatsache, dass ];der Stapel gelöscht wird.

Probieren Sie es online aus

aditsu
quelle
1

Ruby - 7x7

Auch nicht beeindruckend, dieselbe Taktik wie die Antwort von Haskell.

p 1#2 p

3     7
#     #
4     8

p 5#6 p
sj26
quelle
1

R 9x9

Kein Leerzeichen, keine Kommentare.

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

Ich denke, dies könnte auf jede gewünschte Größe erweitert werden. Ich dachte, der Modulo-Operator sei der flexibelste der verfügbaren Operatoren, da er verhindert, dass Werte unabhängig von der Datengröße zu groß werden, und es gibt keinen Effekt, wenn wirklich große Zahlen dazwischen liegen.

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8
freekvd
quelle
1

Diese Programmiersprache, 5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

Was übersetzt dazu:

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

Da ;das Programm beendet wird, bedeutet dies:

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

Erklärung: Eine beliebige Zahl von 0bis 9legt die entsprechende Ziffer auf den Stapel. +Nimmt die zwei obersten Werte xund yvon dem Stapel und drückt x + yauf den Stapel. igibt den Stack als Integer aus.

BobTheAwesome
quelle