Drucken Sie den Ausdruck And she said, 'But that's his.'
nur mit den folgenden Zeichen: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Keine Interpunktion oder nicht alphabetische Zeichen. Sie können jede gewünschte Programmiersprache verwenden. Leerzeichen sind vollständig erlaubt. Kürzeste Sendung gewinnt.
code-golf
kolmogorov-complexity
restricted-source
Blue-Maned Hawk
quelle
quelle
a-zA-Z
. Theoretisch könnte ichw
Rite undE
Val verwenden, um die erforderlichen Anweisungen zu erstellen, aber keine von+-*,%'"
kann ohne die Verwendung von (mindestens) einer von erstellt werden+-*,%'"0-9
.(programmer-of (language 'lisp))
mag das nicht.Antworten:
Whitespace ,
417414349265 Bytes265 Bytes dank Kevin Cruijssen
Probieren Sie es online!
Erklärt:
quelle
Whitespace is completely allowed.
Ich sehe, Sie haben das wörtlich genommen.NNN
zum Beenden entfernen , da es bereits mit einem Fehler beendet wird, wenn Sie das Addieren vor dem print_char ausführen, sodass es nicht einmal nach dem Jump_to_Label kommt. Warum speichern Sie das63
am Anfang und rufen es in der Schleife ab? Sie können es einfach vor dem Hinzufügen drücken. Und warum ist das Label-nrTTSSSSTN
? Ein Etikett kann sogar leer sein. Wenn Sie also nur ein Etikett verwenden, reicht es aus, nurNSSN
das Etikett zu erstellen undNSNN
zum Etikett zu springen.63
? Ich bin mir nicht 100% sicher, ob es die kürzest mögliche Konstante ist. Wenn ja, stimmt etwas nicht mit meinem Programm zur ständigen Generierung, das ich für eine frühere Herausforderung geschrieben habe. :)102
ist die effizienteste: 281 Bytes (oder hier mit Hervorhebung ). (HINWEIS: Ich habe auch eine Kopie verwendet, um 4 Bytes für das Leerzeichen zwischenehs dnA
(kopiert aus dem Leerzeichen zwischendias ehs
) zu speichern .Perl 5 ,
13310295 BytesProbieren Sie es online!
Erläuterung:
Regexes, Print und Chop gelten
$_
standardmäßig für die Variable .Ersetzt die leere Zeichenfolge durch
And she saidZ ZBut thatZs hisZZGjGGf
.Ersetzt jeweils
Z
mit dem Ergebnis der Auswertungchr oct oct oct ord chop
. Dadurch wird das letzte Zeichen von entfernt$_
, der Schlüsselcode übernommen, dreimal als Oktal interpretiert und wieder in ein Zeichen umgewandelt. Zum Beispielj
→ 106 → 70 → 56 → 46 →.
.Aufgrund der Art und Weise Ersatz Arbeiten, die Modifikationen
$_
vorkommen , dass während des Ersatzes Auswertung verloren gehen, so$_
jetzt istAnd she said, 'But that's his.'GjGGf
.Löscht alle
G
,j
undf
in$_
.quelle
print
mitsay
für -2 Zeichen. Aktueller Metakonsens besagt, dass Befehlszeilen-Flags wie-M5.010
nicht zur Byteanzahl zählen.> <> ,
916915903 BytesZuerst dachte ich, eine Lösung in> <> sei unmöglich, aber dann wurde mir klar ... wer braucht Bedingungen oder Logiksteuerung? : D
Probieren Sie es online
Ich drücke wiederholt Zahlen (die Zahl 15) auf den Stapel, drücke dann die Länge des Stapels und drucke das Zeichen mit diesem ASCII-Wert. Wenn ich die Länge des Stapels verkleinern muss, verkleinere ich den Stapel mit jeweils drei Werten
p
oder mit jeweils einem Wert ,g
wenn ich innerhalb von drei Werten des Ziels bin. Das Programm endet mit einem Aufrufi
(input), der a drückt,-1
da keine Eingabe vorhanden ist, und gibt es dann aus, um einen Fehler zu verursachen.Dies ist das Python 3-Programm, mit dem ich die Lösung erstellt habe, nachdem ich mir überlegt hatte, wie es geht:
Probieren Sie es online
quelle
p
: ein 59 auf dem Stapel erstellen , während aus dem Raum zum Bewegen nach obens
insaid
, dann ist es auf dem Weg in dem Code Platz nach unten ausd
zu,
. (Beachten Sie, dass (15,15) zu diesem Zeitpunkt 15 hat.)l
undp
in das (10,10) - (15,15) -Rechteck einfügen und sie dann dort abrufen,g
wo es am bequemsten ist.8086 Assembly auf IBM PC,
1463845664 BytesErläuterung: Die eigentliche Assemblersprachenquelle ist der Eintrag, nicht der generierte Maschinencode.
Die Schwierigkeit besteht darin, dass die meisten x86-Befehle (wie ADD, SUB, JMP, bedingte Sprünge, Speicherzugriff) zwei Argumente haben und daher ein Komma oder eine Speicheradresse benötigen. Wir können also keine Additionen, Subtraktionen, Ifs oder Schleifen verwenden!
Bei meinem ersten Versuch war ich in der Lage, Zahlen mit einer Kombination aus Inkrement, Dekrement, Multiplikation, Division, Bytetricks und den obskuren BCD-Befehlen (wie AAA, DAS) zu "konstruieren". Danach wurde mir klar, dass diese Idee verwendet werden kann, um selbstprüfenden und selbstmodifizierenden Code zu erstellen.
Versuch 1. (1463 Bytes)
Verwendete die verfügbaren Anweisungen, um ASCII-Codes und die 0xb800-Adresse des Bildschirmpuffers zu erstellen. Die Berechnung jedes Zeichens in der Sequenz wurde von Hand ausgeführt.
Versuch 2. (nicht abgeschlossen)
Es wurde festgestellt, dass für jede Ganzzahl im Bereich 0x40-0x5f ein Opcode vorhanden ist . Dieser Bereich umfasst AZ. So entspricht beispielsweise INC CX 0x41 = 'A'. (Diese Opcode-Tabelle ist sehr praktisch.)
Ich habe versucht, 3 "Daten" -Strings zu konstruieren und übereinander zu legen. Der erste Zustand (in Großbuchstaben), der zweite "verschoben" in die Zone 0x60-0x7f (in Kleinbuchstaben) und der letzte "verschoben" in die Zone 0x20-0x3f (Interpunktion).
Selbstmodifizierender Code würde eine oder drei Schleifen erzeugen, um die Daten zu durchlaufen.
Versuch 3. (845 Bytes)
Wie beim vorherigen Ansatz, jedoch um Daten zu reduzieren, wird die Zeichenfolge nur einmal codiert, wobei "Steuerzeichen" zum Wechseln der Zeichensätze eingemischt werden.
Versuch 4. (664 Bytes)
Wie kann man die Steuerzeichen loswerden, die eine ganze Reihe gepatchter Anweisungen für die Verzweigung benötigen? Angesichts der Tatsache, dass nur zwei Großbuchstaben verwendet werden, fragte ich mich, ob ich die Opcode-Tabelle "umdrehen" könnte, um Kleinbuchstaben mit dem Bereich 0x40-0x4f und Interpunktion mit dem Bereich 0x90-0x9f (durch Subtrahieren von 0xc0) zu codieren. Das "A" und "B" können separat eingegeben werden.
Es kann jedoch nur die Hälfte der Opcodes im Bereich 0x90-0x9f verwendet werden, die nicht mit den benötigten übereinstimmen. Dann dachte ich, ich könnte sie vielleicht mit einem XOR durcheinander bringen, und fand einen, der funktionierte. Und hier ist es.
Golf gespielt:
Zusammenbauen mit
und in DOSBOX ausführen (zuerst CLS ausführen). Sieht aus wie das:
Kommentiert:
quelle
INC AX
während die unkommentierte istINC AL
.label1 db
in einer eigenen Zeile erstellen . Es wird eine Warnung ausgegeben, aber kein Fehler.Perl 6 ,
1299127212201215 BytesVielen Dank an Grimy für -27 Bytes.
-52 Bytes, weil wir die Hasenohren gar nicht gebraucht haben.
Danke an Jo King für -5 Bytes.
Probieren Sie es online!
Gibt den String mit einer nachgestellten Newline aus. Wenn Sie das nicht wollen, ersetzen Sie den letzten
say
durch einenprint
. Sie können die Zeilenumbrüche in der Quelle auch durch Leerzeichen ersetzen.Erläuterung
Dieser Code gibt die Zeichenfolge zeichenweise aus. Jedes Zeichen wird gebildet, indem der entsprechende Zeichencode in die
chr
Funktion eingegeben und beilc
Bedarf mit einem niedrigeren Code versehen wird .Derzeit werden alle Werte durch Generieren einer Zeichenfolge mit der richtigen Anzahl von Zeichen generiert. In einigen Fällen ist die Anzahl der Zeichen die Umkehrung des Zielzeichencodes. Es sollte theoretisch möglich sein, mathematische Funktionen wie
log
undexp
direkt zu verwenden, aber ich fand es nicht sehr einfach, diese zu verwenden.Für die Verwendung als Zahlen, haben wir
e
,pi
undtau
; Auf der rechten Seite vonx
oderxx
sind sie implizit mit Fußböden versehen. Sie haben alle 17 Zeichen in ihrer Zeichenfolgendarstellung, daher verwenden wir diese Optione
für eine minimale Anzahl von Zeichen. Wir haben auchi
(4 Zeichen),False
(5 Zeichen) undNaN
(3 Zeichen). Wir können Stringlängen mit multiplizierenx
;xx
multipliziert eins plus die Stringlänge mit der rechten Seite und addiert eins.chop
Entfernt ein Zeichen aus der Zeichenfolge, falls wir eins vom Ziel entfernt sind.Die print-Anweisungen werden mit verkettet
and
, was eine recht geringe Priorität hat. Es ist fast ein Wunder, dass es existiert; Andernfalls müssten wir ungültige Semikolons verwenden.Ich habe die Ausdrücke für die Charaktere von Hand gefunden. Es könnte sich lohnen, programmgesteuert nach ihnen zu suchen, um kürzere Ausdrücke zu finden.
quelle
Breite ,
6664 BytesProbieren Sie es online!
Druckt zum Debuggen. Hängen Sie
ww
an das Ende des Codes, der den Anfang des Stapels anzeigt und ausgibt, an, um auf stdout zu drucken .Erläuterung
In der Breite korreliert jeder Buchstabe mit einer Zahl, basierend auf der "Breite" gemäß dieser Tabelle . Dies weist jedem Buchstaben eine Zahl von 0 bis 9 zu. Diese Zahlen werden dann verwendet, um tatsächlich Code auszuführen.
Insbesondere ein Buchstabe, der größer als ein Treffer
7
ist, startet ein Zeichenkettenliteral. Es werden Sätze von zwei Buchstaben gleichzeitig gelesen, bis der ursprüngliche Buchstabe erneut gelesen wird. Jeder Satz von zwei Buchstaben wird in ihre Breitenzahlen konvertiert und als Dezimalzahl zwischen 0 und 99 gelesen. Das Zeichen, dem sie entsprechen, ist der Index in der folgenden Zeichenfolge:Zum Beispiel ist der Index
!
1, also01
werden die Zahlen der richtigen Breite sein. Soif
,iI
,jt
usw. werden alle Korrelat zu einem Stringliteral von!
.In diesem Fall habe ich die 31 Zeichen der erforderlichen Ausgabe in die entsprechenden Buchstaben übersetzt und
Q
als Anführungszeichen verwendet. Die Oberseite des Stapels wird zum Debuggen gedruckt, wenn das Programm beendet ist.quelle
x86-Computercode (32-Bit), 256 Byte
Wenn ich meinen Code auf meiner Codepage 437-Konsole drucke, wird Folgendes angezeigt:
Dies enthält einige Leerzeichen, daher hier derselbe Code, wenn ich alle Tabulatorzeichen durch
→
und alle nicht unterbrechenden Leerzeichen (mit Code 255) durch ersetze*
:Hexdump:
Einige Erklärungen zur Funktionsweise:
Nützliche Anweisungen sind:
push imm8
,push imm16
undpush imm32
, gefolgt vonpop
Konstanten erzeugen. Dies kann auch Null (inah
) erzeugen, wenn ein Byte (imm8
) gedrückt wird .and [ecx+32], ah
- Angenommen, ah = 0, setzt dies das Byte auf Null. Es kommt einfach so vor, dass die Länge der Ausgabezeichenfolge 32 beträgt, sodass der Code den Puffer von Ende zu Anfang füllt.or [ecx+32], edx
- Unter der Annahme, dass das Ausgangsbyte auf Null gesetzt ist, werden diese Kopienedx
(4 Bytes) ausgegeben. Ich benutze eine Variante mitdx
stattedx
nahe am Ende des Puffers, da es nicht über den Ausgabepuffer hinaus schreiben soll. Die Beschränkung des Codes macht es unmöglich, einzelne Bytes auf diese Weise zu schreiben!imul edx, [ecx+32], whatever
- Dies ist die Hauptidee des Krieges. Mit genügend Entropie[ecx+32]
und einer beliebigen Anzahl kann jede Ausgabe generiert werden. Ich benutze es, um 2 oder 3 Bytes der benötigten Werte zu generieren. Eine Komplikation ist, wenn es in die Ausgabe geschrieben wird, dass es logischOR
mit dem zu tun hat, was bereits vorhanden ist. Dies machte es manchmal erforderlich, den Speicher erneut auf Null zu setzen.jmp
Befehls wird verwendet, um zurückzukehren. Ich habe es gewählt, weil es codiert ist0xff
, was einem nicht unterbrechenden Leerzeichen in Codepage 437 entspricht. Die Regeln sind ein wenig überstrapaziert, aber ansonsten halte ich die Aufgabe für unmöglich ...Assembly-Quellcode zusammen mit einem C-Programm, das ihn ausführt (verwendet Visual Studio-Syntax):
quelle
dec ecx
+and [ecx+32], ah
Zeug kann ausgeklammert werden.0xff
das Zeichen nicht gegen "Keine Zeichensetzung oder nicht-alphabetische Zeichen"?PostScript,
889874837835 BytesProbieren Sie es online!
Dies verwendet 32 Kopien der ganzen Zahlen
89 25 20 6
. Alle Zeichencodes der Zielzeichenfolge können mit Operationen für diese ganzen Zahlen in Stapelreihenfolge abgerufen werden: Beispiel: 'A' (ASCII 65) ist 89 - (25 & (20 + 6)). Viele 4-Tupel von ganzen Zahlen haben diese Eigenschaft; Diese wurde ausgewählt, weil sie besonders einfach zu generieren sind.Flat ist standardmäßig 1, sodass eine Zeichenfolge mit der Länge 1 erstellt wird (initialisiert auf
\0
).dup
ist keine tiefe Kopie: Es wird ein zweiter Verweis auf dieselbe Zeichenfolge erstellt. rrand schiebt den zufälligen Startwert, der standardmäßig 0 ist["\0", "\0", 0]
. Stack is now .count
Legt die Anzahl der Elemente im Stapel fest, sodass 3 ^ (3 * (5 * 6)) = 89 berechnet wird.4 * 5 = 20, 5 * 5 = 25, 6 = 6. Der Stapel ist jetzt
["\0", "\0", 0, 89, 25, 20, 6]
.Duplizieren Sie den gesamten Stapel fünfmal. So haben wir am Ende 32 Kopien unseres ursprünglichen 7-Elemente-Stapels. Wir brauchen nur 31 Kopien, da die Zielzeichenfolge 31 Zeichen lang ist, aber die zusätzliche Kopie tut nicht weh.
Berechnen Sie einen Zeichencode aus den ersten vier Ganzzahlen, schreiben Sie ihn an den Index 0 der Zeichenfolge und drucken Sie die Zeichenfolge aus.
Unterdrückt die Standardeingabeaufforderung.
quelle
Ruby ,
420 354338 BytesProbieren Sie es online!
In aufsteigender Reihenfolge der Jankiness:
Wörter, die mit einem Großbuchstaben beginnen, können gedruckt werden, indem eine Klasse mit diesem Namen definiert und
display
im Klassendefinitionshauptteil aufgerufen wird.Andere Wörter können angezeigt werden, indem Sie Methoden mit diesem Namen definieren, die ein Symbol zurückgeben, und dieses dann in einen String umwandeln, um den führenden Doppelpunkt zu entfernen.
Andere Zeichen können durch Aufrufen
putc
ihres ASCII-Codes angezeigt werden . Wir können die entsprechenden Zahlen erzeugen, indem wir denString def
Trick erneut verwenden, um einen String zu erhalten, und dann die Summe seiner Bytes unter Verwendung eines durch seine Größe bestimmten Moduls nehmen . Leider haben wir keine Möglichkeit, Methoden für ein Objekt aufzurufen, das nicht in der Klassendefinition dieses Objekts enthalten ist, was die Übergabe von Argumenten erschwert. Der letzte Hack ist also die NeudefinitionString#inspect
, die implizit aufgerufen wird, wenn ein String an diep
Methode übergeben wird, so dass das entsprechende Zeichen als Nebeneffekt berechnet und ausgegeben wird, bevor ein Fehler ausgelöst wird, sodass diep
Ausführung und der Ausdruck von a nicht abgeschlossen werden können Neue Zeile. Dann müssen wir den Fehler im Hauptcode beheben.Bearbeiten: Jordan hat die Anzahl der Bytes deutlich verringert, ähm, hoch mit einigen cleveren Kontrollabläufen, und ich habe ein paar Bytes mehr gespart, indem ich sie
raise
durch einen aus einem Buchstaben bestehenden Methodenaufruf ersetzt habe, der einen NameError auslöst.Bearbeiten 2: Es wurde bemerkt, dass es bei der
print String
Extraktion in eine Methode billiger ist, diese Methode nur mit einer Methodendefinition zu verwenden, als den Klassendefinitionstrick, da Methoden mit einem Titel versehen werden dürfen.quelle
sum size
das sum modulo seine größe bekommt, aber alles andere checkt aus!> <> ,
233122 BytesProbieren Sie es online!
Dies begann als Antwort von mbomb , aber ich entdeckte eine grundlegende Verschiebung, die eine große Anzahl von Bytes spart, also poste ich sie als meine eigene Antwort.
Das Generieren nicht-alphabetischer Zeichen zur Ausgabe erfolgt durch wiederholtes Verschieben von Werten in den Stapel und anschließendes
l
Verschieben der Stapellänge. Dies muss jedoch nicht sofort ausgegeben werden: Mitp
kann dieses Zeichen in jede Zelle eingefügt werden, deren Koordinaten zwischen 10 und 15 liegen, um später mit abgerufen zu werdeng
. In ähnlicher Weise können alphabetische Zeichen in den ursprünglichen Quellcode eingefügt und folgendermaßen gelesen werden: Da der höchste nicht-alphabetische Zeichencode in der Eingabe 46 (.
) beträgt , muss der Stapel nicht höher als die 62 verschoben werden, die zum Speichern benötigt werden alle 31 Zeichen der Ausgabe.Zusätzlich wird a
v
in den Code in Spalte 7 eingefügt. Wenn der Anweisungszeiger das umschließt und trifft,v
wird die Sequenzgo
wiederholt ausgeführt, um die übertragenen Koordinaten zu lesen und die entsprechenden Zeichen auszugeben. Schließlich wird der Stapel leer undg
beendet das Programm mit einem Fehler.Die ersten 7 Byte des Codes werden als die ersten 7 und die letzten 7 übertragenen Koordinaten wiederverwendet. Das Platzieren der
v
in Spalte 9 hätte theoretisch zwei weitere Bytes gespart, die Zeichen jedochAinsv
zu einem 2x2-Quadrat im Code gezwungen , was unmöglich ist. In einer früheren Version wurde Spalte 15 verwendet, für die jedoch eine zusätzliche Zeile im Quellcode erforderlich war und die sechs Byte länger endete.quelle
r
das Verschieben der Ausrichtung ausgebe, wo immer ich will. Allerdings schmerzt Golf dieses Programm mein Gehirn ein bisschen.CJam , 262 Bytes
Probieren Sie es online! Zeilenumbrüche werden hier nur zur Verdeutlichung angezeigt. Jede Zeile steht für ein Zeichen.
Puh, das hat Spaß gemacht. Die Beschränkung auf alphabetische Befehle birgt einige interessante Herausforderungen:
{
und}
gibt es praktisch keine Möglichkeit für den Kontrollfluss (außerf
, dass ich keine Möglichkeit gefunden habe, dies zu nutzen).\
,_
,;
, oder$
, wir haben keine Mittel zur Stapelmanipulation.Dies bedeutet, dass das Hauptziel darin besteht, die relevanten Codepunkte auf den Stapel zu bekommen und sie dann in Zeichen mit umzuwandeln
c
.Das Problem ist, dass uns auch die meisten grundlegenden arithmetischen Befehle sowie ganzzahlige Literale fehlen. Dies ist jedoch in Ordnung, da der
m
Namespace zahlreiche erweiterte mathematische Operationen enthält und viele Variablen für nützliche Zahlen vordefiniert sind.Am Ende habe ich Quadratwurzeln (
mQ
undmq
), die Exponentialfunktionme
und die Basisumwandlung (b
) verwendet, die auch zum Emulieren der Multiplikation verwendet werden können ([X 0] Yb
Berechnet X * Y). Außerdem ist es manchmal einfacher, den Codepunkt in Großbuchstaben zu erstellen. In diesem Fall können Sieel
das resultierende Zeichen in Kleinbuchstaben umwandeln.Mit einigen längeren bin ich immer noch nicht zufrieden. Naja.
Erläuterung
Dies ist eine zeichenweise Erläuterung der Ausgabe. Bevor ich anfange, sind hier ein paar kurze Möglichkeiten, um Zahlen zu machen:
T
,X
,Y
,Z
bzw..A
bis enthaltenK
.Sci
(S
drückt eine Zeichenkette, die ein Leerzeichen enthält,c
holt das erste Zeichen dieser Zeichenkette undi
konvertiert dieses Zeichen in seinen Codepunkt).S
wird auch für Leerzeichen verwendet.GmQ
(ganze Quadratwurzel von 16).AZbYb
(konvertiere 10 zu Base 3, was ergibt[1 0 1]
, und konvertiere das resultierende Zahlenarray zu Base 2, was ergibt, 5).Ymei
(berechne exp (2) und konvertiere in eine ganze Zahl).A
n
d
s
h
e
a
i
,
'
B
u
t
.
quelle
HYbYCtYbc
,HYbXAtYbc
undHYbXBtYbc
.Deadfish ~ , 943 Bytes
Probieren Sie es online!
Keine Schleifen erlaubt
:(
quelle
Böse , 198 Bytes
Probieren Sie es online!
Das hat sehr viel Spaß gemacht.
quelle
Stax ,
133958479 BytesFühren Sie es aus und debuggen Sie es
quelle
MATL ,
187158 BytesProbieren Sie es online!
Mehr lesbare Version: Probieren Sie es online! Manueller Versuch, die Zeichenfolge zu erstellen. Es gibt wahrscheinlich viel Platz zum Golfen, indem man die Saite in bequeme Stücke schneidet
P
undh
mit und eine Saite dreht und baut. Ich hoffe, jemand wird die Herausforderung annehmen, um mich zu übertreffen. Die größte Herausforderung besteht darin , dass Sie nicht verwenden können ,+
oder-
, so Grundrechen ist oft nicht möglich.Höhepunkte:
KQthpYq
: das 25. (KQthp
)Yq
ist 97, entsprechend dem Buchstabena
. Der Buchstabes
(115) wird auf ähnliche Weise aus 113, der 30. Primzahl, erzeugt. Es wird dann ausgiebig in der Zwischenablage wiederverwendetJ
.his
wird verkürzt, indem dash
Vorherige in der Zwischenablage gespeichert wirdJ
. Da die zuvor gespeichertens
, bauen wirhis
in umgekehrter Reihenfolge , so dass wir immer noch die letzte abrufens
verwendeny
, und drehen Sie nach dem GebrauchP
.h
invle
)quelle
v
mit dem, wash
ich früher hatte , in Konflikt geraten würde . Ich schätze, ich sollte das haben, anstatt nur anzunehmen. Vielen Dank für das Heads-up. Ich bin gespannt, ob Sie es besser machen können ...U
bedeutet^2
, dass ich einige Bytes hätteMATL , 118 Bytes
Probieren Sie es online!
Lesbarere Version (jede Zeile entspricht einem Zeichen, mit Ausnahme von Stapel-Neuanordnungsoperationen).
Erläuterung
Das Programm erzeugt die Codepunkte der erforderlichen Zeichen als unabhängige Zahlen. Am Ende werden alle diese Zahlen zu einem Spaltenvektor verkettet, in einen Zeilenvektor umgewandelt und in Zeichen umgewandelt. Das Ergebnis wird implizit angezeigt.
Einige der verwendeten Tricks:
0
also für die meisten Leerzeichen verwendet, da es nur ein Byte kostet (O
).15
verwendet wird (erzeugt wieKUq
), weil es dann durch Zugabe zu wiederverwendet werden kann100
(chard
) zu geben115
(s
). Bei einer anderen Gelegenheit5
für Raum (erzeugt wie verwendet wirdKQ
), so kann er später aus abgezogen werden44
(,
) zu erhalten39
('
).J
wird zum Speichern von Zeichen verwendet, die wiederholt werden: zuersts
dann'
. In ähnlicher WeiseH
speichert100
die Zwischenablage , was nützlich ist, umd
andere Zeichen zu erzeugen.Q
(addieren1
),q
(subtrahieren1
),E
(multiplizieren mit2
) undU
(quadratisch) werden zusammen mit den vordefinierten Literalen in den ZwischenablagenI
(3
) undK
(4
) ausführlich verwendet .h
) und Berechnen seiner Summe (s
) oder aufeinanderfolgender Differenzen (d
).100
(d
) wird als4
Binärzahl generiert und als Dezimalzahl interpretiert.110
(n
) wird aus65
(A
) erhalten, indem in einen String ('65'
: Codepunkte ) konvertiert[54 53]
,1
zu den Codepunkten ([55 54]
) addiert, summiert und addiert wird1
.w
), bubble upb
).quelle
O
stattKWE
für Leerzeichen. Und Sie haben meinen Verdacht bestätigt, dass es wahrscheinlich besser ist, eine andere Zwischenablage zu opfernH
.dc ,
240222209 bytesProbieren Sie es online!
Mein erster Gedanke war derselbe wie bei @seshoumara, schiebe einfach genug Zeug auf den Stapel, um alle ASCII-Werte der Zeichen zu generieren. Dann kam mir der Gedanke, dass ich seitdem
+
,-
und*
als Einzelzeichenoperatoren, diese einfach neu erstellen und arithmetisch verwenden kann! Das wäre doch kleiner!Und ich wäre nicht überrascht, wenn ich noch mehr Bytes abwerfen könnte, aber fürs Erste ... hat dieser verschlungene Ansatz es geschafft, den naiven (ish) zu binden.OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
ist der Teil des Ansatzes, der @ seshoumara ähnelt, aber wir gehen nur auf 46, das ist.
. Wir tun dies, weil wir auf 45 steigen müssen-
, und wir brauchen auch eine Periode in unserer Saite, also ist es (glaube ich) am billigsten, wenn wir für diese Periode nur eine weiter gehen. Unterwegs speichern wir einige Werte: 5, 32, 39, die sich alle später als nützlich erweisen. 5 für nützliche Dinge, 32 und 39 für ihre ASCII-Werte. Ursprünglich habe ich 1-5 gemacht, aber das war teuer, und ich konnte einfach vermeiden, 4 zu verwenden; VerwendenZ
Sie für diese Werte eine dreistellige, zweistellige oder einstellige Zahl (geben Sie einen Wert ein und geben Sie die Anzahl der Stellen ein). Mit 42, 43 und 45 wandeln wir diese Strings (*
,+
, und-
jeweils) und speichert sie als Makros (B
,A
, undC
beziehungsweise). Dies bedeutet, dass*+-
wir diese Operatoren jetzt verwenden können , ohne die Zeichen zu verwenden.Ab hier generieren wir im Grunde genommen die ASCII-Werte mithilfe der Potenz der Mathematik anstelle der bloßen Akkumulation und speichern dabei einige der Wiederholungen. 100, 105 und 115 sind ausreichend, um sie (in Registern oder auf andere Weise) sinnvoll zu speichern. Ursprünglich habe ich den Stapel mit 10s gefüllt und daraus 100s gemacht; Es endete damit, Bytes zu sparen, um den Stapel mit 32s zu füllen und diese später als Leerzeichen zu verwenden. Eine etwas besser lesbare Version des ASCII - Abschnitt:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.18 Bytes gespart durch: Speichern der Nummer 5 als Eingabegrundlinie anstelle eines Registers; die Zahl 32 als Genauigkeit anstelle eines Registers; die Zahl 115 als Ausgangsradix anstelle eines Registers; dann ändern mußte ,
KZ
umIZ
1s zu erzeugen undOZ
zuKZ
2s zu erzeugen.13 weitere Bytes wurden durch Überfluten des Stapels mit 32s entfernt. Einstellgenauigkeit auf 39; Verwenden einer Stapelmanipulation, um ein Speichern 116 zu vermeiden; Ich habe versehentlich Doppelarbeit weggelassen.
quelle
a
um diese Operatoren neu zu erstellen und sie dann mit aufzurufenx
. Dies zeigt das Data-Is-Code-Verhalten von DC. Wenn ich Zeit habe, werde ich Ihren neuesten Trick anwenden, Daten in Parametern statt in Registern zu speichern. Glauben Sie, wir könnten eine noch kürzere Gleichstromlösung erhalten, wenn wir die Art und Weise missbrauchen, in der P mehr Buchstaben gleichzeitig druckt, wenn wir das Glück haben, die benötigte große Zahl nur mit Hex einzugeben?P
16750 oder 0x416E verwenden. Wenn wir zufällig Glück hatten und einer der Teilstrings ausschließlich aus den Werten AF bestand, könnte dies eine Abkürzung für uns bedeuten. Das wäre allerdings ein bisschen Glück! Andernfalls würden wir entweder große Zahlen eingeben, uns diese irgendwie einfallen lassen oder eine Menge addieren und mit 256 multiplizierenP
.Japt , 87 Bytes
Versuch es
Erläuterung
Die erste Zeile generiert die
'
und ordnet sie der Variablen zuU
.Die zweite Zeile ist der
2
Variable zugeordnetV
.In der dritten Zeile wird die
.
Variable generiert und zugewiesenW
.In der letzten Zeile wird die Zeichenfolge dann zeichenweise in umgekehrter Reihenfolge erstellt.
quelle
Qc dGaB
Rot , 272 Bytes
Wenn die doppelten Anführungszeichen erforderlich sind:
Rot , 344 Bytes
Funktioniert nicht in TIO, aber im Red Interpreter.
Erläuterung:
Die Wörter sind trivial - ich drucke sie (drucke ohne Zeilenvorschub) als Literale mit
quote
. Rot hat ein eingebautes Wort für Raum -sp
, sowiecomma
unddot
."
und'
interessanter: I prin sie durch einen Raum , aus dem SubtrahierenB
undG
jeweils ausgehend von einer LiteralB
undG
, sie zuerst Zeichenfolge mit der Umwandlungmold
und dann Zeichen (zu verwenden , um auf sie Subtraktion) Wtihto sp
( Red hat die Umstellung von Prototyp - konvertiert die Zeichenkette auf den Typ vonsp
(das ist das Zeichen).quelle
'
, also ist die 272-Byte-Lösung dieselbe.Forth (Gforth), 351
Schade, dass ich CHAR oder EMIT nicht in Ein-Buchstaben-Wörtern definieren kann, da dies die Verwendung von entweder
:
und;
(zB: C CHAR ;
) oder'
(zB' CHAR ALIAS C
) erfordern würde.In der Tat, wenn ich Wörter definieren könnte, könnte ich tun
: P CHAR EMIT ;
und dann tun, umP x
zu druckenx
. Naja.Ich kann nicht einmal einen Puffer erstellen, diese Zeichenfolge dort schreiben und dann als Eingabe verwenden, da das Schreiben in den Speicher die Verwendung von
!
oder erfordertC!
quelle
AlphaBeta ,
180 177 175163 BytesProbieren Sie es online!
WIP
quelle
Pepe , 266 Bytes
Ich halte den R-Stapel leer und habe 's' auf dem R-Stapel
Dies ist nicht auf TIO, aber Sie können es hier versuchen
quelle
dc , 240 Bytes
Die Hauptidee besteht darin, den Stapel kontinuierlich um 1 (
K
) zu vergrößern und diesX
Größe des Stapels (z
) in benutzerdefinierten Registern zu speichern, wenn er mit jedem eindeutigen ASCII-Code übereinstimmt. Das Drucken (P
) erfolgt durchgehend.Probieren Sie es online!
Ich habe einige Optimierungen vorgenommen, z. B. einen Buchstaben nicht zu speichern, wenn er danach nicht verwendet wird
d
, z. B. das Duplizieren ( ) eines Buchstabens, zlX
.quelle
80186+ Computercode, MS-DOS .COM-Format,
822787 ByteNeben Buchstaben werden nur Tabulatoren und Leerzeichen verwendet. Da die meisten Opcodes im zulässigen Bereich bestimmte Inkremente, Dekremente, Pushs, Pops und registerindirekte ANDs und ORs sind, nutze ich zusätzlich zu IMUL die Tatsache, dass das Stapelregister einen Zeilenumbruch ausführt, wenn es das Ende erreicht des Segments, um den Code in umgekehrter Reihenfolge zu ändern! 80186+ Assembly ist erforderlich, da ich sofort Werte pushe.
Kommentierte Quelle (TASM-Format):
quelle
Befunge-98 (FBBI) ,
125124121 BytesProbieren Sie es online! Ausgabe in eine Datei mit dem Namen
\n
(eine einzelne Zeile). Vielen Dank an Jo King für sein Drehbuch.Die Ausgabe enthält 10 nachgestellte Zeilenumbrüche.
Bei nur einer nachgestellten Zeile +1 Byte durch Ändern der folgenden Zeile:
Probieren Sie es online!
Erläuterung:
Der Anweisungszeiger bewegt sich wie folgt:
Das Programm setzt die nicht alphabetischen Zeichen in Position, bevor diese Zeile in eine Datei ausgegeben wird.
Befunge-98 enthält Anweisungen
a
...f
, die den entsprechenden Hexadezimalwert auf den Stapel schreiben . Um andere Zahlen zu generieren, werden diese Wertey
als Argumente an ("Get SysInfo") übergeben, um Folgendes zu erhalten:Indem Sie den Großteil des Codes auf y = 23 setzen,
ayy
können Sie wiederholt auf die Stapelgröße zugreifen, die dann zum Generieren von Zeichencodes verwendet wird.quelle
Pyth , 210 Bytes
Probieren Sie es online!
Ich fand einige Zahlen, die nur mit Buchstaben ausgedrückt werden konnten (wie
T
= 10,Z
= 0,lG
= Länge (Alphabet) = 26,Cd
= Zeichencode (Leerzeichen) = 32), und einige Funktionen, die nur mit Buchstaben ausgeführt werden konnten (wiet
= Dekrementieren,h
= Inkrementieren,hF
= wiederholtes Anwenden von Inkrementieren = Addieren) und dann einfach eine Brute-Force-Suche durchgeführt, um die kürzesten Kombinationen dieser Funktionen und Zahlen zu finden, die zu jedem der von mir benötigten Buchstaben führten.quelle
16-Bit-x86-Assemblycode, 665 Byte
(Die Binärdatei ist alphabetisch, nicht die Quelle)Ich habe irgendwie vergessen, dass Leerzeichen erlaubt sind. Sicherlich kann der Code dadurch golfen werden.
Bytecode:
Quelle:
Es funktioniert so:
Bewegt den Stapelzeiger über POP AX an das Ende des Codes (POP SP ist nicht möglich, da es nicht alphabetisch ist).
erstellt die Anweisung zum Senden eines DOS-Aufrufs (algorithmisch, da er nicht alphabetisch ist);
konstruiert die nicht-alphabetischen Zeichen;
legt den String auf den Stapel;
Platziert die Dispatch-Anweisung auf dem Stapel genau am Ende des Codes, sodass die Ausführung direkt zu dieser Anweisung fließt.
erstellt die Anweisung zum Drucken einer Zeichenfolge;
zeigt die Zeichenfolge an und sie stürzt sofort ab. : - / (Ein ordnungsgemäßer Exit würde mehr Code erfordern)
quelle
Japt , 74 Bytes
Versuch es
quelle
05AB1E ,
145121109 BytesProbieren Sie es online!
quelle
80186 Maschinencode + DOS, 91 Bytes
Textversion:
Textversion mit Tabulatoren (Code 9)
9
und Leerzeichen (Code 32) ersetzt durch*
:Hexdump:
Der Maschinencode wird in einer Datei mit der Erweiterung angezeigt
.com
. Wenn ich es ausführe, druckt es die erforderliche Nachricht und hängt dann (zufällige Daten werden ausgeführt).Erklärung auf hoher Ebene, was es tut:
,'.$
)int 21
Anweisung zu generieren , die die Nachricht drucktAssembler-Code (kann mit kompiliert werden
tasm
):Es benutzt den
popa
Befehl, um alle Register zupop
füllen , da regular nicht alle benötigten Register füllen kann (zBpop di
ist ein verbotener Opcode).Die Adressen der zu patchenden Bytes liegen im Bereich von 0x100 ... 0x160. Glücklicherweise können sie als Summe von 3 Bytes mit zulässigen Werten dargestellt werden:
bp
si
oderdi
Das Patchen von Bytes in der Nachricht erfolgt logisch
OR
mit 0x20 (Leerzeichen) und einer kleinen Konstante (4, 7, 12 oder 14). Die kleine Konstante wird durch Initialisieren voncx
unddx
auf 9 (Tabulatorzeichen) und AusführenINC
oderDEC
nach Bedarf erhalten.Das Patchen von Code verwendet die
IMUL
Anweisung. Ich habe die benötigten 16-Bit-Konstanten gefunden, um sie mithilfe der Brute-Force-Suche zu multiplizieren.Schließlich wird die Adresse der Nachricht (0x13b) durch Multiplikation erhalten. Um Platz zu sparen, habe ich eine der Konstanten aus einer der Anweisungen genommen, die einen unmittelbaren Wert enthält
0x96d
. Hier9
wählt der Teil eine DOS-Druckfunktion und der6d
Teil ist ein freier Parameter. Es stellt sich heraus, dass dies6d
die einzige Möglichkeit ist, die nach der Multiplikation 0x13b ergeben kann.Demontage des Codeteils:
Unterhaltsame Tatsache: Normalerweise würde ich
offset message
anstelle der13bh
hartcodierten verwenden, aber in diesem Fall generiert tasm, da zum Zeitpunkt der Analyse die Adresse unbekannt ist, einen sofortigen 16-Bit-Offset und verschwendet 1 Codebyte:quelle