Schreiben Sie ein Programm, das ausgibt
Do not repeat yourself!
Ihr Programmcode muss die folgenden Einschränkungen erfüllen:
- seine Länge muss eine gerade Zahl sein
- Jedes Zeichen an der Position
2n
(wobein
eine Ganzzahl> 0 ist) muss mit dem Zeichen an der Position übereinstimmen2n-1
. Das zweite Zeichen des Programms entspricht dem ersten, das vierte dem dritten usw.
Zeilenumbrüche gelten als Zeichen!
Das ist Code-Golf, also gewinnt der kürzeste Code!
Beispiele
HHeellllooWWoorrlldd
ist ein gültiges Programm
123
oder AAABBB
oder HHeello
sind falsch
Nachprüfung
Mit diesem CJam-Skript können Sie überprüfen, ob Ihr Quellcode gültig ist. Fügen Sie einfach Ihren Code in das Feld "Eingabe" ein und führen Sie das Skript aus.
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
wäre dies eine gültige Antwort in TriggerAntworten:
Hexagony ,
166126124 BytesDas Einfügen der impliziten No-Ops und Whitespace entspricht dem folgenden Quellcode:
Ich bin mir sicher, dass es möglich ist, dies noch weiter zu verkürzen und vielleicht sogar in Seitenlänge 6 zu lösen, aber es wird schwierig ...
Wie es funktioniert
Diagramm erstellt mit Timwi's Hexagony Colorer .
Der Code ist vollständig linear. Das
\
Recht am Anfang leitet die IP in eine Diagonale um, so dass wir uns überhaupt nicht um die doppelten Zeichen kümmern müssen. Die farbigen Pfade werden in der Reihenfolge Orange / Rot, Blau / Grau, Grün, Lila ausgeführt (wenn zwei Pfade derselben Farbe vorhanden sind, wird der linke Pfad zuerst ausgeführt, bevor der rechte Pfad umbrochen wird).Wenn wir No-Ops, Mirrors und Befehle ignorieren, die von anderen überschrieben werden, läuft der lineare Code folgendermaßen ab:
Buchstaben in Hexagony setzen nur den aktuellen Wert der Speicherkante auf den Zeichencode des Buchstabens.
;
druckt die aktuelle Speicherflanke als Zeichen. Mit setzen wir&
den Speicherrand auf zurück0
und drucken ein Leerzeichen mit32;
.}
bewegt sich zu einer anderen Kante, damit wir uns die32
für weitere Räume merken können . Der Rest des Codes druckt nur Buchstaben an der neuen Kante und bewegt sich gelegentlich mit vor und zurück';}
, um ein Leerzeichen zu drucken. Am Ende bewegen wir uns wieder mit'
an die Leerstelle, erhöhen den Wert mit auf 33)
und drucken das Ausrufezeichen.@
Beendet das Programm.quelle
;
Zeichensatzes gibt es noch keine Wiederverwendung zwischen den Zeichenpaaren im Code. Der aktuelle Code ist so ziemlich das Erste, was mir in den Sinn gekommen ist. Wenn man sich also anstrengt, sollte es möglich sein, eine viel kompliziertere Lösung zu finden, die die Semikolons und vielleicht sogar einige Buchstaben wiederverwendet, um dies zu erreichen in Seitenlänge 6.;
nur einmal wiederverwenden, weil Sie kann sie nicht horizontal überqueren.;
Ihr Code enthält nur 23 s und nur 6 Zeichenwiederholungen (2 × o, 1 × t, 1 × r, 2 × e), was nur 29 ergibt. Persönlich überzeugt mich dies mehr als, dass Größe 6 unmöglich ist. .GolfScript,
1308476 BytesVersuchen Sie es online in Web GolfScript .
Wie es funktioniert
Der GolfScript-Interpreter beginnt mit dem Platzieren einer leeren Zeichenfolge auf dem Stapel.
Das Verketten eines Arrays mit einer Zeichenfolge wird flacher, sodass das Ergebnis die gewünschte Ausgabe ist.
quelle
Unär , ~ 1,86 × 10 222
Einfaches Brainfuck -> unäre Antwort. Sehr suboptimal;).
Das Programm besteht aus einer geraden Anzahl von Nullen; speziell:
von ihnen.
Ursprünglicher Brainfuck-Code:
quelle
1
s im Unary-Programm, die die angeforderte Zeichenfolge ausgeben. Der zweite Codeblock ist das BF-Programm, mit dem er erstellt wurde. Da das Unary-Programm vollständig aus1
s besteht, wird die Wiederholungsanforderung trivial erfüllt.Ruby -
210014281032820670 BytesDies setzt voraus, dass die Ausgabe ein Rückgabewert einer Funktion sein kann (es wurde nicht angegeben, dass die Ausgabe STDOUT sein muss).
Code:
Der Trick besteht darin, die Zeichenfolge aus einer leeren Zeichenfolge unter
""
Verwendung der Anhängeoperation<<
und der ASCII-Codes der Zeichen zu erstellen .Um die Zahlen für die ASCII-Codes zu erhalten, versuche ich, die Zahl in Werte zu zerlegen, die ich leicht erzeugen kann. Zum Beispiel ist ASCII
90
einfach88+1+1
:88
ist okay für sich11**00
ist11^0
, was einfach ist1
Zum Glück beide
++
und--
würde bedeuten ,add
in Rubin, so kann ich schreiben90
als88++11**00++11**00
Es gibt einige Tricks, um zu einigen Zahlen zu gelangen, die einfacher sind als nur das Hinzufügen von Einsen. Hier ist der Code, mit dem ich das oben Genannte generiere (einschließlich aller von mir verwendeten Zuordnungen):
Ich denke immer noch über andere Tricks nach, um die Zeichen zu verringern, die erforderlich sind, um zu einer Zahl zu gelangen.
Beachten Sie Folgendes, wenn Sie das
-rpp
Flag verwenden und wie folgtpp
am Anfang des Codes einfügen:dann kann dies für zusätzliche 2 + 4 Bytes als ein vollständiges Programm funktionieren, aber es wird ein Extra
"
vor und nach der erforderlichen Zeichenfolge gedruckt :Beispiel:
quelle
pp
Edelstein ist ein Doppelbuchstabe ..."
Zeichen in der Ausgabe und 2. die Notwendigkeit der-rpp
Flagge (die nicht wie ist--rrpp
)> <> 174 Bytes
Zum Glück gilt die Einschränkung in gewisser Weise nicht vertikal. Das größte Problem ist jedoch, dass wir jede neue Zeile verdoppeln müssen.
Der Code, der ungefähr so läuft, sieht folgendermaßen aus:
Beachten Sie, dass das Programm keine doppelten Leerzeichen enthält. Im Zeichenfolgenmodus werden durch Drücken von> <> Leerzeichen für leere Zellen eingefügt. Umgekehrt bedeutet dies jedoch, dass eine Lösung mit
g
(Lesen einer einzelnen Zelle aus dem Quellcode) schwieriger ist, da die im Programm enthaltenen Leerzeichen beim Lesen zu NULs werden.(Hinweis: Dies kann 50 Byte kürzer sein, wenn es mit einem Fehler endet , aber ich mag es so.)
quelle
Sclipting ,
186146 BytesUm klar zu sein, gibt es drei Codezeilen, deren Mitte leer ist, da die neue Zeile dupliziert werden muss. Die Byteanzahl basiert auf der UTF-16-Codierung.
Erläuterung
Der Block koreanischer Zeichen am Anfang drückt die Zeichenfolge
"DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012"
. Sie werden feststellen, dass jedes dritte Zeichen ein von uns gewünschtes Zeichen ist. der Rest ist Kauderwelsch. Hier ist der Grund:In Sclipting codieren zwei koreanische Zeichen drei Bytes. Somit codiert jedes koreanische Zeichen effektiv 12 Bits. Damit eine Zeichenfolge beginnt
D
, müssen die ersten 8 Bits sein0x44
. Der Rest spielt keine Rolle, aber da wir jedes Zeichen wiederholen müssen, werden auch die Bits 12 bis 20 angezeigt0x44
. Wir werden also0x44n44n
für einige n einen Wert der Form haben , der in die drei Bytes zerfällt0x44 0xn4 0x4n
.Für das
o
, was ist0x6F
, erhalten wir die Bytes0x6F 0xn6 0xFn
.Da ich faul bin, habe ich mit dem Codieren begonnen
"DDDooo nnnooottt (etc.)"
und dann jedes andere Zeichen durch das vorherige ersetzt, weshalb ich0x444444
="DDD"
für dasD
und0x6F66F6
="of�"
für das bekommeo
. Die�
ist da, weil0xF6
an sich die UTF-8-Codierung ungültig ist.Nun zurück zum Programm. Der Rest des Programms läuft wie folgt ab:
Als Nächstes möchte ich
"..."
als regulären Ausdruck verwenden, damit ich mit dem Schleifenkonstrukt 替 ... 終 drei Zeichen gleichzeitig aus der ursprünglichen Zeichenfolge abgleichen kann. Da jedoch jede Anweisung dupliziert wird, müssen zwei solcher regulären Ausdrucksschleifen ineinander verschachtelt sein. Wenn der Stapel unterläuft, wird ein Laufzeitfehler angezeigt. Deshalb,und starten Sie dann die Schleifen. Auf diese Weise wird die äußere Schleife nur einmal wiederholt, da sie mit dem regulären Ausdruck und
""
der Zeichenfolge""
übereinstimmt, was zu einer einzelnen Übereinstimmung führt. Die innere Schleife läuft einmal für jedes Match"..."
gegen die große Saite. Der Körper der Schleife ist:Die innere Schleife endet hier, sodass jede Übereinstimmung des regulären Ausdrucks durch das erste Zeichen dieser Übereinstimmung ersetzt wird. Dadurch bleibt die gewünschte Zeichenfolge auf dem Stapel.
Dann endet die äußere Schleife, und an diesem Punkt wird die gewünschte Zeichenfolge vom Stapel genommen und die einzige Übereinstimmung
""
der Zeichenfolge""
mit dieser ersetzt, wobei die gewünschte Zeichenfolge erneut auf dem Stapel verbleibt.quelle
Labyrinth , 528 Bytes
Die doppelten Zeilenumbrüche tun weh, aber das beweist zumindest, dass es machbar ist!
Jedes Zeichen wird einzeln gedruckt, indem zuerst der Codepunkt gebildet und dann ein einzelnes Zeichen gedruckt wird. Die Codepunkte setzen sich zusammen aus:
wo
Das ungewöhnliche Verhalten der Labyrinth-Ziffern
33::00&&
wird dabei tatsächlich ausgenutztJedes einzelne Zeichen wird mit dem Mechanismus gedruckt
Die
xx
existieren nur, um das Gitter so aufzufüllen, dass es 5 hoch ist. Zuerst__
drücken wir zwei Nullen, dann treffen wir einen Raster-Rotationsoperatorv
. Wir werfen eine Null und drehen:und wieder:
Wir gehen dann nach rechts in die
.
dritte Zeile und führen den Druckbefehl nur einmal aus.quelle
CJam -
176136 BytesDanke an Sp3000 für das Teilen meiner Programmgröße durch zwei :-)
Erläuterung
HH77++
,GG00++
, ... , die ganzzahlige ASCII - Code der Zeichen berechnen durch Zahlen Zugabe (zum Beispiel: `HH77 ++‘ schiebt 17, 17 und 77 auf den Stapel, dann fügen Sie diese Zahlen 3)]]{{cc}}//
durchläuft die ASCII-Codes und konvertiert sie in Zeichen.Probieren Sie es hier aus
quelle
33cc
, aber ich bin sicher, dass es für einige der anderen bessere Möglichkeiten gibtcc
überall]]{{cc}}//
am Ende machenSelbstmodifizierendes Brainf *** , 72 Bytes
Beachten Sie, dass dies
\x00
ein Literal-NUL
Hex-Byte (leere Zelle) darstellt. Der Quellcode befindet sich auf dem Band links von der Startzelle.Erläuterung
Bevor ich dieses Programm gemacht habe, habe ich eines gemacht, bei dem nur BF-Zeichen in der Quelle verwendet wurden. Es ist möglich! Es ist auch viel länger, da ich für einen ungeraden ASCII-Wert den doppelten Wert erstellen und dann durch zwei teilen wollte. Etwas kürzer wäre es, die gesamte Quelle zu modifizieren, um zunächst ungerade Werte zu generieren.
quelle
DDoo nnoott rreeppeeaatt yyoouurrsseellff!!
(doppelte Leerzeichen)? Ich sehe zwei.
s.Change first '.' to '0'
. Ich habe die Erklärung geändert, um (wieder) zu zeigen, dass die erste.
in eine Null geändert wird.Jelly , 66 Bytes (nicht konkurrierend)
Probieren Sie es online!
Factoid
Das Programm funktioniert weiterhin, wenn Sie jedes zweite Zeichen entfernen.
Probieren Sie es online!
Wie es funktioniert
Gibt ein String-Array zurück. Das Literal beginnt mit a
“
und endet mit a”
, und die Zeichenfolgen werden intern durch begrenzt“
. Das Ergebnis istDas Argument des Links und der Rückgabewert werden auf dieses String-Array gesetzt, und der Rest des Quellcodes wird ausgeführt.
quelle
Gammaplex , 66 Bytes
Gammaplex ist eine 2D-Sprache, die die Position des ersten Zeilenumbruchs als Zeilenlänge verwendet und alle anderen Zeilenumbrüche ignoriert.
quelle
MSM ,
270-160BytesMein erstes MSM-Programm!
Die Zeichenkettenausgabe in MSM erfolgt, indem die einzelnen Zeichen auf den Stapel geschoben und zu einer einzigen Zeichenkette zusammengefügt werden
.
, zDie
.
Anzahl der Zeichen ist eins weniger als die Anzahl der Zeichen. DennDo not repeat yourself!
wir brauchen 22.
s. Zum Glück ist dies eine gerade Zahl, wir haben also 11 DoppelDas Einfügen der Buchstaben erfordert etwas mehr Aufwand. Das Muster
macht den Trick für jeden Charakter
c
. Es wird wie folgt ausgewertetWir brauchen 23 solcher Muster, beginnend mit
!!'',,
und endend mit,DD'',,
gefolgt von den 22 Verknüpfungsbefehlen.
.quelle
Befunge 98, 70 66 Bytes
Probieren Sie es online!
Nach meiner ungültigen Antwort ist hier eine bessere, die tatsächlich zur Herausforderung passt!
(Vielen Dank an Martin Ender, der die Verwendung des
��
Zeichens 0x17 anstelle von vorgeschlagen hat88ff++
)Erläuterung:
quelle
8f+
: tio.run/nexus/…DC ,
348346342306290278 BytesDatei
dnr6.short.dc
(ohne Zeilenumbruch):Lauf:
quelle
BotEngine , 6 × 49 = 294
quelle
Rückhand 54 Bytes
Probieren Sie es online!
Da sich der Backhand-Zeiger bereits bei drei Zellen pro Tick bewegt, müssen wir ihn nur mit auf 2 verringern
v
quelle
netzförmig, nicht konkurrierend, 62 Bytes
Probieren Sie es online!
Erklärung in Teilen:
U
Setzt die Zeigerrichtung auf(2, 0)
, d. h. bewegt2
x-Einheiten und0
y-Einheiten, sodass jedes andere ZeichenU
übersprungen wird , beginnend mit dem nächsten , das übersprungen wird. Dann wird jedes andere Zeichen aufgezeichnet und entspricht:Das ist ein einfaches Ausgabeprogramm.
Andere
Dies konkurriert um die JavaScript-Prämie von WallyWest:
Ich kann beweisen, dass Zahlen unter dieser Einschränkung konstruiert werden können, Zeichenfolgen jedoch nicht. Da keine Literale verwendet werden können, würde durch die Platzierung eines Buchstabens eine leere Zeichenfolge erstellt:
Dann kann nur ein Operator verwendet werden. Die einzigen "gepaarten" Operatoren sind:
Und keiner von diesen kann Zahlen / andere in Strings umwandeln. Es können also keine Zeichenketten ausgegeben werden.
quelle
Alice , 74 Bytes
Probieren Sie es online!
Erläuterung
Der erste Haken ist, dass wir in der Lage sein müssen, den String einzugeben, also wollen wir nur den ersten überspringen
"
. Wir tun dies, indem wir auf die erste"
Zelle springen, da die IP dann eine Zelle verschiebt, bevor die aktuelle Zelle erneut angezeigt wird, so dass die zweite Zelle"
in den Zeichenfolgenmodus wechselt. Aber um dorthin springen zu können, müssen wir10, 0
in dieser Reihenfolge (zweitens oben) oben auf dem Stapel stehen. Dies geschieht mitaa00tt,,
:Diese Rotationsfunktion erzeugt ein Argument. Wenn dieses Argument negativ ist, wird der Wert oben auf dem Stapel um so viele Positionen nach unten verschoben. Wenn das Argument positiv ist, sucht es nach dem Element, das sich an vielen Stellen unter dem oberen Rand befindet, und zieht es nach oben. Beachten Sie, dass im Fall von
Rotate(10)
nicht genügend Elemente auf dem Stapel vorhanden sind, aber im unteren Bereich eine implizite unendliche Anzahl von Nullen vorhanden ist, weshalb eine Null oben endet.Nun können wir mit diesen beiden Argumenten
J
zum ersten übergehen"
. Der zweite wechselt"
in den String-Modus und zeichnet alles aufDDoo nnoott...
. Wenn es das trifft/
, wird die IP nach Südosten umgeleitet und wir gehen in den Ordinal-Modus. Im Moment springt die IP über die drei Zeilen (von denen zwei leer sind) auf und ab, so dass sie zuerst drei weitere Leerzeichen in den Zeilen zwei und drei aufzeichnet und dann den String-Modus verlässt, wenn sie auf die trifft"
. Da wir uns zu diesem Zeitpunkt im Ordinal-Modus befinden, werden alle aufgezeichneten Zeichen als einzelne Zeichenfolge auf den Stapel verschoben (obwohl wir die meisten im Kardinal-Modus aufgezeichnet haben), sodass wir diese Zeichenfolge erhalten (beachten Sie die nachstehenden Leerzeichen). :Jetzt springt die IP weiter auf und ab, was bedeutet, dass sie einen Befehl von jedem anderen Paar ausführt, dh
Y
undt
. Dann trifft die IP das Ende des Gitters in der zweiten Zeile und springt rückwärts durch das Gitter. Diese schaltet auch in dem Zeichenpaar die IP die erste Zeile trifft, so dass , wenn es geht jetzt zurück führt;
,o
und@
. Wenn Sie also alle Leerzeichen und impliziten IP-Umleitungen ignorieren, befindet sich der ausgeführte CodeYt;o@
im Ordinal-Modus.Das
Y
ist der „Extrahieren“ -Befehl , der eine Zeichenkette in die Zeichen in alternierenden Positionen trennt. Da jedes Zeichen wiederholt wird, erhalten wir wirklich nur zwei Kopien der Zeichenfolge, die wir suchen, obwohl die erste Kopie zwei nachgestellte Leerzeichen und die zweite ein nachgestelltes Leerzeichen enthält.t
spaltet diesen abschließenden Raum ab und;
wirft ihn weg . Zum Schluss wirdo
der String gedruckt und@
das Programm beendet.quelle
05AB1E ,
1005852 Bytes-6 Bytes dank Kevin Cruijssen
Probieren Sie es online!
Idempotenzregeln.
quelle
á
die inneren Zeichenfolgen nicht vektorisiert werden, andernfalls könnte es nach dem))
... verwendet werden . Alles entfernená
undεεáá}}
nach dem))
Arbeiten als Alternative verwenden, aber leider werden keine Bytes gespeichert (aber vielleicht können Sie Inspiration daraus finden? ) .. Und„„!!
anstatt zu……!!
arbeiten, da der!
eingebaute die Saiten anscheinend gleich verlässt. Na ja, ich habe es versucht. xD##θθáá
für eine Weile umzugestalten , und aus irgendeinem Grund habe ich nicht darüber nachgedachtεε}}
... Ich habe es versucht€€
, was nicht ganz funktioniert ... Dies ist jetzt die kürzeste Antwort, danke!Stax , 70 Bytes
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
Stax hat zum Glück
::
für jedes n-te das eingebaute . Alles, was ich tun muss, ist, die Saite zu verdoppeln, 2 zu drücken und zu rennen::
. Einfach richtig?Falsch.
Das Drücken dieser Saite ist schwierig. Das erste Anführungszeichen kann verdoppelt werden. Dies
..""
ist ein Länge-2-Literal,."
gefolgt von einem sinnvollen Anführungszeichen. Das Problem ist, dass ich keine Möglichkeit sehe, die Zeichenfolge (die notwendig ist, oder die doppelte Version wird gedruckt) zu beenden, ohne eine neue zu starten.Das Programmende beendet String-Literale. Wenn ich dieses doppelte Wort dort einsetzen kann, gibt es möglicherweise eine nette Problemumgehung. Um irgendwo vom Ende eines Programms zu springen, muss man jedoch
G}
mindestens Folgendes beachten:Das macht ... nichts.
G
Beginnt keinen Block und springt auch nicht zum zweiten}
. Auch hier muss ich ein Zeichen ignorieren:..}}
. Die Ausführung springt von der erstenG
zur zweiten}
, setzt sich bis zum Ende fort, springt zur zweitenG
und von dort zur zweiten zurück}
und setzt sich noch einmal bis zum Ende fort, bevor sie am Anfang des[deduplicate]
Abschnitts mit der doppelten Zeichenfolge auf dem Stapel fortgesetzt wird .Die Deduplizierung ist einfach.
11hh
schob elf und halbierte es zweimal, rundete beide Male ab und lieferte zwei, und::
dann erhalten wir die Ausgabe, die wir brauchen.Oh, oh. Dies druckt nichts. Hier gibt es zwei Probleme: Erstens
..}
bedeutet dies , dass der String.}
am Ende des Programms auf dem Stack liegt, und zweitens ist die normale implizite Ausgabe von Stax jetzt deaktiviert!Das schlimmste Problem ist die Ausgabe. Wenn ein Stax-Programm ordnungsgemäß beendet wird, ohne etwas zu drucken, wird implizit die Oberseite des Stapels gedruckt. Aber wir haben nichts gedruckt ...? Ah, aber wir haben. Nicht abgeschlossene Zeichenfolgenliterale werden gedruckt und nicht verschoben, und selbst diese beiden leeren Zeichenfolgen (von den nicht übereinstimmenden
"
am Ende) reichen aus, um diese Prüfung auszulösen , obwohl sie leer sind. Der Druck muss von Hand erfolgen.Wir brauchen entweder
pp
oderPP
, und in diesem Fall ist das Ignorieren des ersten Durchgangs..pp
nicht akzeptabel, da der String gedruckt wird.p
. Das heißt, wir brauchen unsere gewünschte Ausgabe entweder alleine auf dem Stack oder in den beiden oberen zusammen mit einer leeren Zeichenkette. Letzteres wird erreicht, indem zwei leere Zeichenfolgen (zz
) gedrückt werden und die oberen drei Elementeaa
vor dem Drucken zweimal gedreht werden ( ).Sobald das erledigt ist, haben wir einen Stapel von vier Saiten. Ein Fünftel
.}
wird dann verschoben, bevor das Programm ordnungsgemäß beendet wird. An diesem Punkt wird der Mangel an impliziter Ausgabe sowohl zum Segen als auch zum Fluch, da jetzt nichts mehr gedruckt wird!quelle