Möglicherweise sehr schwierig, aber ich habe einige erstaunliche Dinge gesehen, die aus dieser Site hervorgegangen sind.
Das Ziel ist es, ein Programm in jeder Sprache zu schreiben, das macht, was immer Sie wollen. Der Haken ist, dass das Programm nach jeder zirkulären Verschiebung der Zeichen gültig sein muss .
Eine kreisförmige Zeichenverschiebung ist sehr ähnlich zu einem Ringschiebe . Einige Beispiele meiner klaren Dinge.
Für das Programm int main() { return 0; }
Verschiebung um 6 Zeichen nach links ergibt: in() { return 0; }int ma
Verschiebung um 1 Zeichen nach links ergibt: nt main() { return 0; }i
Verschiebung nach rechts um 10 Zeichen ergibt: eturn 0; }int main() { r
Dieses Programm entspricht jedoch offensichtlich nicht den Regeln.
Regeln
- Jede Sprache
- Der Gewinner wird nach Anzahl der abgegebenen Stimmen ermittelt
- Lösungen, die das Gleiche tun oder für jede Rotation völlig andere Dinge tun, erhalten 100 virtuelle Upstimmen zu ihrer Punktzahl.
UPDATE Ich denke, das hat lange genug gedauert. Der Gewinner mit den meisten Stimmen (einschließlich virtueller Stimmen) ist Mark Byers. Gut gemacht!
quelle
Antworten:
Verwenden Sie die richtige Sprache für die Aufgabe. In diesem Fall ist das Befunge .
Diese Sprache erlaubt natürlich Rotationen, weil:
Dieses Befunge-Programm druckt die exakt gleiche Ausgabe ("Hallo"), unabhängig davon, wie viele "kreisförmige Zeichenverschiebungen" Sie verwenden:
Es läuft auf Befungee . Das Board muss vergrößert werden (nicht die Standardeinstellung von 80 Zeichen). Es kann so ausgeführt werden:
Es funktioniert, indem zuerst dynamisch ein Programm generiert und gespeichert wird, das "Hallo" ausgibt, und dann das erste Byte überschrieben wird, um das Steuerelement in das neu geschriebene Programm umzuleiten. Das Programm wird zweimal geschrieben. Wenn ein Byte beim ersten Mal nicht korrekt geschrieben wird, wird es beim zweiten Mal korrigiert.
Die Idee könnte erweitert werden, um jedes Programm von beliebiger Komplexität zu produzieren.
quelle
Brainf * ck
Wählen Sie das richtige Werkzeug für den Job - ein Sprichwort, das hier noch nie relevanter war als dieser Job!
Das nicht verschobene Programm, das Sie hier sehen, wird einfach gedruckt
SHIFT
(plus eine neue Zeile). Unbeabsichtigte kreisförmige Verschiebungen erzeugen verschiedene andere Ausgaben, obwohl immer sechs ASCII-Zeichen ausgegeben werden.quelle
Commodore 64 BASIC
?
ist eine Abkürzung fürPRINT
und:
ein Anweisungstrennzeichen.Längere Abweichungen sind selbstverständlich möglich:
etc...
quelle
Golfscript
Dieses Programm gibt einige Ziffern aus, die unabhängig von der Programmverschiebung immer 2 ergeben:
Die erste Zeile wird gedruckt
1010
(10 in binär), die zweite Zeile wird gedruckt02
und alle anderen Zeilen werden gedruckt2
.Aktualisieren:
Das Programm kann hier getestet werden . Bitte beachten Sie, dass ich
n
s am Ende jeder Zeile nur zum Formatieren der Ausgabe hinzugefügt habe . Diese können entfernt werden und das Programm funktioniert immer noch.quelle
Ruby, wahrscheinlich eine der kürzesten möglichen Lösungen:
Und noch eine etwas längere und interessantere:
quelle
x86 16-Bit-Binärdatei
Manuell konstruiert mit Hilfe dieser ( 1 2 ) Tabellen, nasm und ndisasm. Dies wird immer ohne einen Absturz oder eine Endlosschleife zurückgegeben, da keine Bytes springen oder den Stapel ändern und es
ret
in jedem Fall mit NOPs gefüllt ist, um mit einem Einzelbyte-Befehl zu enden .In den meisten Fällen wird dies ausgegeben
FOO
oder eine Teilzeichenfolge davon. Wenn dies nicht funktioniertAX
, wird eine zufällige Ganzzahl 10 aufgerufen (dies hat die Blinkgeschwindigkeit des Cursors in einem meiner Tests geändert), führt jedoch normalerweise nicht zu einem Absturz.Zum Ausprobieren lege den Hexdump in eine Datei und verwende ihn
xxd -r foo.hex > foo.com
dann in einer DOS-Umgebung (ich habe Dosbox verwendet).Hier ist ein Hex-Dump dieser Datei:
Und einige interessante demontierte Versätze:
+0
(für die folgenden Beispiele ist der Rest der Binärdatei noch gültig)
+1
+2
+6
+11
+12
+18
(Andere Offsets sind nur Wiederholungen der oben genannten)
+58
quelle
Unäre Antwort:
^ 44391 Nullen
Katzenprogramm. Egal wie Sie sich drehen, es ist das gleiche Programm.
quelle
PHP
Los geht's, ein gültiges PHP-Programm:
quelle
Scala
Eine geschachtelte Anführungszeichen:
C ++ / Java / C # /ScalaKommentar:
Leerer Befehl:
Bash
Kommentar, eingebaute Whitespace und Shell Kombination:
Sed
Standalone-gültige Befehle:
p
P
n
N
g
G
d
D
h
H
Eine Kombination der oben genannten:
p;P;n;N;g;G;d;D;h;H;
AWK
So drucken Sie jede Zeile der Datei:
oder
Nichts drucken:
Perl
quelle
;P;n;N;g;G;d;D;h;H
gültig?J
Zuerst ein Skript, um gültige Rotationen eines Programms zu überprüfen
s
:Zum Beispiel
+/1 5
ergibt das Programm (Summe von 1 und 5):Dann ein langweiliges, gültiges Programm:
quelle
dc
Gleichstromprogramme sind in jeder Umdrehung leicht gültig. Beispielsweise:
quelle
Maschinensprache
Wie wäre es mit Z80 / Intel 8051 Maschinencode für NOP .
Sicher, es macht keine Operation, aber es nimmt ein oder zwei Zyklen in Anspruch ... Sie können so viele oder so wenige davon haben, wie Sie wollen.
Und ich bin mit der obigen Ruby- Antwort nicht einverstanden - ich denke, ein einzelnes Byte 00h ist kürzer als ein Ruby
p
.quelle
k
Wertet eine leere Zeichenfolge aus
Gibt ein Punktzeichen zurück
Gibt eine teilweise Anwendung von '.' (dyanische Form) zu einer leeren Zeichenliste.
quelle
sh, bash
cc gedreht ist wieder cc, aber es ist nicht sehr freundlich, wenn man es so nackt nennt.
dh debhelper ist auch nicht sehr kooperativ, während hexdump nur auf Eingaben wartet.
Ghostscript startet den interaktiven Modus, während die Schaltergruppe eine Verwendungsmeldung anzeigt - auch hier eine gültige Lösung.
Und hier ist das Skript, um Kandidaten für solche Programme zu finden:
Findet man auch längere Sequenzen wie (arj, jar) oder (luatex, texlua), die nicht nach jeder Schicht gültig sind, sondern erst nach einigen bestimmten Schichten, die ich am Anfang falsch verstanden habe, aber es gibt nur wenige, so ist es einfach um sie von Hand herauszufiltern.
quelle
arj
/jar
nicht gültig, da es keinenrja
Befehl gibt (obwohl mir dieses Beispiel gefällt). +1 für das Skript - wirklich schöne Idee :)every
oder zu meinena random one
. Das Beispiel mitshift left by 6
,left by 1
undright by 10
versicherte mir bei der Interpretation, dass ich nur eine einzige Schaltmöglichkeit benötigen.... in any language ...
: Meine Lösung funktioniert nur in bash (und sh, zsh, ash und einigen anderen), aber all diese anderen Lösungen haben auch Programmnamen.Triviales Python-Beispiel:
Kann wiederholt um drei Zeichen verschoben werden, um mehr und mehr von dem Alphabet zu enthüllen.
quelle
Python
Bewerten Sie einfach einige Zahlen
quelle
dc wird bereits verwendet, aber das folgende Programm gibt unabhängig von der Drehung immer dasselbe aus : D
Ausgänge
quelle