Der Titel sagt schon alles. Ihr Ziel ist es, ein Programm zu schreiben, das ein Rechteck aus Zeichen bildet, das gedreht und erneut ausgeführt werden kann, um die Anzahl der durchgeführten Umdrehungen um 90 ° gegen den Uhrzeigersinn (CCW) auszugeben.
Zum Beispiel, wenn das 3 × 2-Programm
abc
def
Gelöst das Problem, würde es zunächst 0 und aufeinanderfolgende Drehungen von 90 ° nach links ausgeben
cf fed da
be cba eb
ad fc
würde jeweils 1, 2 und 3 ausgeben.
Das Verwenden von Kommentaren macht dies zu einer trivialen Aufgabe für die meisten Sprachen. In Ruby kann dies beispielsweise in einem 7 × 7-Rechteck erfolgen:
###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###
Die Herausforderung besteht darin, dies ohne jegliche Kommentare zu tun .
Wertung
Ihre Punktzahl ist w * h, die Fläche Ihres Rechtecks. Zeilenumbrüche sind ausgeschlossen. Mit anderen Worten, Code-Golf, Newlines zählen nicht.
Die Punktzahl für das Ruby-Beispiel ist 49 (obwohl es natürlich ungültig ist, da es Kommentare enthält).
Anmerkungen
- Ihr Code muss wirklich rechteckig sein und darf keine fehlenden Zeichen am Zeilenende enthalten.
- Wenn Sie möchten, können Sie anstelle von 0 1 2 3 auch andere zulässige "mod 90 °" -Werte ausgeben. 8 ist also in Ordnung anstelle von 0 und -1 ist in Ordnung anstelle von 3 usw.
- Die Ausgabe kann an die Konsole oder in eine Datei gehen.
- Es gelten Standardlücken.
Ich hoffe, dass dies, meine erste Frage, einige Leute wirklich fasziniert. Genießen!
quelle
echo 0;exit;e
in Bash ist also erlaubt?Antworten:
APL (1x3 = 3)
Diese Lösung verwendet die zusätzliche Regel, dass jede Ausgabe, die korrekt für Mod 4 ist, funktioniert.
In APL
x!y
ist die Anzahl der Auswahlmöglichkeiten fürx
Elementey
, die allgemein alsbinom(y,x)
oder bezeichnet werdenchoose(y,x)
. Lassen Sie uns überprüfen, ob jede Umdrehung die richtige Antwort liefert.0 Umdrehungen
Es gibt keine Möglichkeit, 5 Elemente aus 3 auszuwählen, daher erhalten wir 0, die automatisch gedruckt wird.
1 Linkslauf
APL wertet glücklich jede Zeile aus, erhält die Nummer
3
, den Operator!
und dann die Nummer5
und druckt nur die letzte davon (5
), was 1 mod 4 ist.2 Linksdrehungen
Das ist
binom(5,3)
, was ist(5*4*3*2*1)/(3*2*1)/(2*1) = 10
, was ist 2 mod 4.3 Linksdrehungen
Nach wie vor ist nur der zuletzt ausgewertete Wert von
3
printer.Ich kenne APL nicht wirklich, also sag mir bitte, ob ich eine der Erklärungen falsch verstanden habe. Ich fand es durch Versuch und Irrtum als die erste Sprache auf dieser Seite, dass:
Für (5) ging ich die Liste der dyadischen APL- Funktionen durch . Meine erste in Frage kommende Operation war die Ganzzahldivision
/
von C und Python 2, aber die APL-Division÷
gibt Floats. Potenzierung ist verlockend, aber schlägt fehl , daa
unda^b
die gleiche Parität haben , aber durch aufeinanderfolgende Drehungen bekommen (es sei dennb=0
, aber dannb^a=0
). Boolesche Operatoren wie<
give0
und1
180 degrees apart funktionieren nicht. Schließlich fand ich den Binomialoperator!
und versuchte es mit Zahlen, bis ich etwas davon bekam.Vielen Dank an Quincunx für sein Vertrauen, dass es eine kleinere Lösung als 2x2 gibt.
quelle
Rubin, 7 × 9 (63)
Ein bisschen länger als die andere Lösung, aber zumindest hängt diese Lösung nicht von implizitem Drucken oder Regelmissbrauch ab. Bei allen vier Umdrehungen wird der gesamte Code analysiert und abgesehen von Kurzschlüssen vollständig ausgeführt. Überraschenderweise gibt es absolut keine Symmetrie im Code
Diese Lösung beruht auf der Tatsache, dass es weiterhin möglich ist, die
p
Funktion (die zum Drucken der Zahlen verwendet wird) aufzurufen, auch wenn bereits eine Variable mit demselben Namen definiert wurde. Zum Beispielp p
ruft so etwas wie die Funktionp
mit der Variablenp
als Argument auf (druckt also den Wert vonp
).Erklärung für einige der im Code verwendeten allgemeinen Ausdrücke:
p
: Wie oben erwähnt, ist dies entweder ein Funktionsaufruf oder eine Variable. Wenn die Variable nicht definiert ist, ruft dies die Funktionp
ohne Argumente auf, die nichts tut und zurückgibtnil
.p p
: Druckt die Variablep
.p|x
: Wennp
es sich um die Funktion handelt, ist diese identisch mitnil|x
, die abhängig vom Wert von true / false zurückgibtx
. Wennp
es sich um eine Ganzzahl handelt, ist es bitweise oder. In beiden Fällen hat diese Aussage keine Nebenwirkung.p=p||x
: Im Grunde das Gleiche wiep||=x
(bedingte Zuweisung) mit dem Vorteil, syntaktisch gültig zu sein und ein No-Op zu erhalten, wenn umgekehrt.Symmetrische Version (9 × 10 = 90)
Dies ist die kürzeste symmetrische Lösung (C 2, wenn die zu druckenden Zahlen ignoriert werden), die mir einfallen könnte.
Skript testen
Hier ist ein Testskript, um den obigen Code zu verifizieren (die
#
an den Zeilenenden wurden hinzugefügt, damit das Leerzeichen nicht entfernt und vor der Ausführung entfernt wird):quelle
GolfScript, 4 (2x2)
Druckt
4312
was ist0
(mod 4). Die Drehungen drucken3241
(1 Mod 4),2134
(2 Mod 4) und1423
(3 Mod 4).Aufgefordert von:
Es gibt tatsächlich viele Zahlenmengen, für die dies funktioniert. Ich habe diese mit diesem Python-Programm gefunden:
Obwohl das Programm
0
s ausgibt (was wahrscheinlich nicht funktionieren würde), haben die gültigen Lösungen die FormWo
a∈{4,8}
,b∈{3,7}
,c∈{1,5,9}
,d∈{2,6}
. IE,(a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}
die 24 Lösungen ist.quelle
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
n
. Dies liegt daran, dass die Parität der ganzen Zahl der Parität der am weitesten rechts stehenden Ziffer entspricht, Rotationen im Abstand von 90 Grad jedoch unterschiedliche Paritäten ergeben müssen. Ist2*2
also das Minimum für diesen Ansatz.Python - 23 x 23 = 529
Ok, diese Frage hat bereits einen Gewinner, aber es gibt noch keine Python-Lösung. Also habe ich darüber nachgedacht - schwer! - und einen Weg gefunden, um den sperrigen
print
Befehl in jede Richtung arbeiten zu lassen, ohne Fehler zu erzeugen, wenn er aus einer der anderen Richtungen analysiert wird.Der Durchbruch war die folgende Zeile:
Während das
forward_code
ausgeführt wird,backward_code
ist das Teil eines Strings und wird daher nicht gedruckt. Dies ist genau umgekehrt, wenn Sie rückwärts lesen.Kombiniert mit zwei weiteren Richtungen und der Feinabstimmung, um alle Anführungszeichen korrekt abzugleichen, erhalte ich die folgende Lösung:
Edit: Ich habe einen Weg gefunden, mit all dem Whitespace umzugehen. ;)
quelle
p=print
die Datei auch einzufügen, da Sie momentan so viel Leerzeichen haben? (Python 3 natürlich)p=print
ist auch langwierig. Und was noch wichtiger ist: Sie können nicht wiederverwenden,p
nachdem Sie den Code gedreht haben!BASIC, 64
Gewinnt nicht, aber hier ist es trotzdem. (Getestet in Chipmunk Basic )
Hinweis:
?
ist eine Abkürzung fürPRINT
verschiedene Dialekte von BASIC. Obwohl der Code viele Syntaxfehler enthält, verhindert dieEND
Anweisung in der ersten Zeile, dass sie vom Interpreter gesehen werden.quelle
END
obwohl :)Pyth , 9 Zeichen (3x3)
In Pyth wird standardmäßig alles gedruckt, es sei denn, vor ihm steht ein Leerzeichen. Zeilen nach der ersten Zeile dienen der Benutzereingabe und werden in diesem Programm nicht ausgewertet.
Ein anderer Weg, um 9 Zeichen zu bekommen:
Pyth 1.0.5 , 4 Zeichen
Während die letzten Änderungen an Pyth die Generierung von zweistelligen Zahlen erschwert haben (eine Änderung, die ich rückgängig machen möchte), haben ältere Versionen von Pyth die einfache Generierung zweistelliger Zahlen, kombiniert mit dem impliziten Drucken und der Tatsache, dass alle Zeilen außer der ersten Zeile werden ignoriert, ergibt sich folgende Lösung:
Drucke 32,21,14,43.
quelle
Befunge, 16
Erläuterung: Digits von
0
auf9
die entsprechende Zahl auf den Stapel zu schieben,.
erscheint ein Wert aus dem Stapel und druckt sie als eine Ganzzahl, und@
das Programm beendet.( hier getestet )
quelle
Piet, 49
Ich habe darauf hingewiesen, nur gelbe und rote Farben zu verwenden und zu versuchen, es grob symmetrisch zu machen. Beim Drehen werden 0, 1, 2 oder 3 ausgegeben. Das Beenden des Programms in Piet ist schwierig und nimmt leider etwa die Hälfte des Bildbereichs ein.
quelle
GNU dc , 6 (3x2)
Ich denke, dies ist die kürzeste Antwort, um die "mod 90 °" -Regelentspannung nicht zu erfordern:
Ausgänge
0
,1
,2
oder3
für jede Drehung.Für die
0
,2
und3
Drehungen, diep
knallen einfach und drucken die letzte Nummer wörtliche auf den Stapel geschoben wurde. Für die1
Drehungz
schiebt der die aktuelle Stapeltiefe (1) auf den Stapel, dannp
knallt der und druckt ihn aus.quelle
311\n0p2
, wo\n
ein Newline-Charakter ist. Andernfalls wäre es im Kontext von dc bedeutungslos.GolfScript, 9 (3x3)
Art, die Regeln zu missbrauchen. Das
}
Programm wird beendet, wenn keine Übereinstimmung vorliegt{
, und der Inhalt des Stapels wird am Programmende gedruckt.quelle
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
}
das unausgeglichen sein kann. Guter Trick.JavaScript, 4
Wenn Sie dieses Programm (oder eine Drehung dieses Programms) in einer JavaScript-Konsole ausführen, wird nur die letzte Zeile in der Konsole ausgewertet und als Echo ausgegeben.
Damit:
Hier sind alle ähnlichen 2x2-Programme, die auch funktionieren:
Mit anderen Worten,
wobei a in [0,4,8] ist, b in [3,7] ist, c in [1,5,9] ist und d in [2,6] ist
quelle
CJam / GolfScript - 3 * 3
Das Semikolon zeigt die vorherige Nummer an, daher wird nur die untere rechte Ecke gedruckt.
quelle
Aheui , 8
Da Aheui keinen Buchstaben hat, der 1 auf den Stapel schiebt, habe ich beschlossen, 0, 5, 2 und 3 zu drucken.
Erläuterung: 바 und 반 drücken jeweils 0 und 2 auf den Stapel und bewegen den Cursor um ein Zeichen nach rechts. 뷸 und 뷷 drücken jeweils 5 und 3 auf den Stapel und bewegen den Cursor um zwei Zeichen nach unten. 몽 öffnet und druckt die Zahl im Stapel und bewegt den Cursor um ein Zeichen nach oben. 희 beendet das Programm.
quelle
JavaScript
(Wird in die Browserkonsole, die Shell oder eine andere REPL eingegeben, damit das Ergebnis gedruckt wird.)
Sollte für jede andere Sprache mit Ausdrücken, nicht signifikanten Zeilenumbrüchen und automatischem Ausdruck des Ergebnisses funktionieren.
quelle
'2,3\n,0,\n1,0'
.Matlab / Octave -
144100Golf gespielt: 10 x 10 = 100
Alternative Lösung: 15 x 15 = 225
quelle
...d....
...i....
...s2...
disp 1..
..3 psid
...4s...
....i...
....d...
..3 psid
. Sie benötigen mindestens drei Punkte am Anfang jeder Zeile, um einen Zeilenumbruch anzuzeigen und die verbleibenden Zeichen zu ignorieren.Perl 5x7 (35)
Ein bisschen zu spät zur Party. Der Einzelgänger
-
bestimmt, welche Nummer gedruckt wird.quelle
JavaScript, 3
Es funktioniert ... in Basis 7.
Base 9 Version:
Erläuterung
Bei interaktiver Ausführung, z. B. von einer Debug-Konsole, wird der Wert der letzten Anweisung / des letzten Ausdrucks ausgegeben.
4 7 = 4 10 ≤ 0 (mod 4 )
412 7 = 205 10 ≤ 1 (mod 4 )
2 7 = 2 10 ≤ 2 (mod 4 )
214 7 = 109 10 ≤ 3 (mod 4 )
Ähnliche Lösungen könnten für jede ungerade Basis gefunden werden.
quelle
Befunge, 12 (6x2)
Es gelang mir, eine leichte Verbesserung der vorhandenen Befunge-Antwort zu erzielen, indem ich die zweidimensionale Natur von Befunge optimal nutzte und den Codepfad vertikal in zwei der Ausrichtungen verlaufen ließ.
Probieren Sie es online aus: Starten von 0 , Drehung 1 , Drehung 2 , Drehung 3 .
quelle
Marbelous, 7 × 14 = 98
quelle
Argh! / Aargh! (4 * 4 = 16)
Wie war das mit dem richtigen Werkzeug für den Job? Es gibt keine Kommentare (in der Sprache im Allgemeinen).
Die gesamte Programmfamilie (generiert in J:
((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'
oder((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'
)einmal gedreht:
zweimal gedreht:
dreimal gedreht:
Um dies zu erklären, ist es am besten, sich eine "eingerückte" Version anzuschauen (das funktioniert auch in allen Rotationen):
Diese Version zeigt, dass das Programm aus 4 separaten Teilen besteht, einen für jede einzelne Umdrehung.
h
- Kontrollfluss links einstellenp
- Element im Daten- / Code-Raster darunter druckenq
- Beenden Sie das Programmquelle
Floater - 9 × 5 = 45
Druckt 4, 1, 2 oder 3 auf die Konsole.
Beachten Sie, dass 'Black' eine gültige Anweisung (NOP) und syntaktisch ist. Ohne kann es die Ausgangsposition nicht finden. Somit sind alle Positionen im Rechteck belegt.
quelle
Element, 2x3 = 6
Dies ist eine Verbesserung gegenüber der naiven 3x3-Lösung, bei der
`
in der Mitte eine Zahl auf jeder Seite steht. Der oben gezeigte 0-Fall ist der interessanteste, da er*
verwendet wird, um die 3 mit nichts zu multiplizieren, um 0 zu erhalten. Ansonsten ist er nicht so kompliziert.Wenn Sie das Leerzeichen als unangenehm empfinden, können Sie es durch ein beliebiges anderes Zeichen ersetzen, mit Ausnahme von
[]{}`_
.Als Referenz sind hier die anderen drei Umdrehungen:
quelle
Chip, (2x5) 10
*
aktiviert alle Nachbarelemente: Norden, Osten, Süden und Westen (Quelle) ,~
wenn nicht aus dem Westen aktiviert wird , aktiviert die Ost-Nachbarn (NOT-Gatter) (hier nie aktiviert)t
beendet die Ausführung nach dem aktuellen Byte Drucka
das Bit setzt0x01
derb
Ausgabesätze das Bit0x02
des Ausgangse
setzt das Bit0x10
des Ausgangsf
setzt das Bit0x20
des Ausgangs,+
falls von einem Nachbarn aktiviert, alle anderen Nachbarn aktivieren (Draht)Chip benötigt entweder das
-w
Flag (um die Ausführung ohne Eingabe zu ermöglichen) oder eine Eingabe, um ausgeführt zu werden.Druck
0
,1
,2
, oder3
in ASCII. Wenn Codepunkte0x00
auf0x03
erwünscht sind, entfernen Sie diee
undf
dann den Raum bewegen, um die Lücke zu füllen.quelle
Japt , 3 * 1 = 3 Bytes
Probieren Sie es online aus: so wie es ist , einmal , zweimal , dreimal gedreht .
Ausgänge 0, 5, 2, 11.
Die Variable
B
enthält den Wert 11 undNumber.z(other)
ist eine Unterteilung (alle haben anscheinend nach p gesucht). Bei mehrzeiligem Code wird die letzte Zeile an die Ausgabe übergeben, was hier einfach eine Konstante ist.2 * 2 = 4 Bytes
Probieren Sie es online aus: so wie es ist , einmal , zweimal , dreimal gedreht .
Ausgänge 0, 21, 2, -1.
T
hält 0 undJ
hält -1.Der Trick ist, dass, wenn zwei Literale oder Variablen nebeneinander gestellt werden, ein Komma eingefügt wird und die Ausgabe nur die letzte ist.
2 * 2 JS-Lösung funktioniert auch in Japt.
quelle