XKCD # 99 mit dem Titel "Binary Heart" zeigt ein einfaches Bild von Einsen und Nullen, wobei einige Ziffern rot gefärbt sind.
Das rote Herz ist mit bloßem Auge sichtbar, die in der Binärsequenz verborgene Nachricht jedoch nicht. Wenn Sie alle Leerzeichen und Zeilenumbrüche entfernen und die Binärsequenz als 8-Bit-ASCII-Code interpretieren, erhalten Sie die folgende Meldung:
iloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOv
Süß, oder?
Pssst ... Die Zeichenfolge ist keine reine Zeichenfolge-Wiederholung.
Ihre Herausforderung besteht darin, dieses Binärbild mit 21 Stellen und 23 Stellen nach unten zu erstellen. Zwischen jeder Ziffer in jeder Zeile sollte genau ein Leerzeichen und für jede neue Zeile eine neue Zeile stehen. Beachten Sie, dass die letzten Bits nur den Anfang des Buchstabens darstellen e
, da sie 21*23
nicht durch 8 teilbar sind. Sie benötigen auch die richtigen Bits.
Die Funktion oder das Programm sollte keine Eingabe annehmen. Führende und nachfolgende Leerzeichen und Zeilenumbrüche werden akzeptiert.
Das Ergebnis Ihres Codes sollte folgendermaßen aussehen:
0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1
1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1
1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0
1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0
1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0
1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1
0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1
0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1
0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0
1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1
0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0
1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1
0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0
1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1
0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1
1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0
0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0
1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1
1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0
0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0
0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0
1 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1
0 0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Bestenliste
quelle
O
s aus der ASCII-Ausgabezeichenfolge ist!Antworten:
Jelly ,
363332 BytesVielen Dank an @ JonathanAllan für das Golfen mit 3 Bytes!
Probieren Sie es online!
Wie es funktioniert
Der Hauptlink
wird niladisch (dh ohne Argumente) ausgeführt, wenn das Programm ausgeführt wird. Der Rückgabewert wird implizit ausgegeben.
Finden Sie die Indizes der zitierten Zeichen in Jellys Codepage und interpretieren Sie sie als Ziffern einer bijektiven Basis-250-Zahl. Dies ergibt die Ganzzahl 13021639057551959994 .
wandelt die generierte Ganzzahl in eine Binärzahl um. Dies ergibt das Bit-Array 10110100101101100010011110111011001100101011110010100110111010, das der UTF-8-Codierung der um ein Bit nach links verschobenen Zeichenfolge ilOveyOu entspricht .
Eine Verschiebung ist erforderlich, da
B
kein Bit-Array mit einer führenden 0 zurückgegeben werden kann . Andere Optionen umfassen das Negieren der Binärziffern oder das Berechnen des Quadrats in umgekehrter Reihenfolge, aber dieser Ansatz spart ein Byte.formt das generierte Array wie im Bereich von 1 bis 484 , dh es wiederholt den Inhalt des Arrays so oft wie nötig, um eine Länge von 484 zu erreichen .
Dies ist ein bisschen mehr als wir brauchen, um die Verschiebung zu erklären. Wir könnten das erste Bit jetzt entfernen, aber später bedeutet dies, dass alle Bits, die ausgetauscht werden müssen, auf geraden Indizes liegen, wodurch wir das oben genannte Byte speichern können.
Nimmt die Codepunkte der Zeichen zwischen
“
und‘
( [10, 58, 74, 138, 154, 186] ), "hebt" sie dann auf, dh multipliziert sie mit 2 ( [20, 116, 148, 276, 308, 372) ] ).Negiert die Bits an diesen Indizes bedingt. Dies entspricht den O / O- Abweichungen im Originalmuster.
Endlich,
Das Bit-Array wird aus der Warteschlange entfernt (das erste Bit wird entfernt), das verbleibende Array in Zeilen mit 21 Elementen aufgeteilt und die resultierende Matrix als Raster gedruckt.
quelle
O
standardmäßig Großbuchstaben verwenden . Ich denke, dies ist der Fall:“ỊḂr×C)ḃȯ’B¬ṁ483¬“Œ` ° @‘+\¤¦s21G
Jelly ,
41 40 3533 BytesVielen Dank an @Dennis für das Ende
ṖṖCG
! (KomplementC
=1-x
anstelle von logisch nicht¬
)TryItOnline
Wie?
"Farbe" Version, 77 Bytes
TryItOnline
Jelly hat keine Farbausgabe, aber das ist viel einfacher für mich zu sehen (ich bin farbenblind) ...
Wie?
quelle
¬
, können die letzten vier Bytes werdenṖṖCG
. :)complement
?Eigentlich 58 Bytes
Probieren Sie es online!
Erläuterung
Es gibt drei Hauptteile, die ich dementsprechend aufschlüsseln werde.
Teil 1: Aufbau der Base-256-Zeichenkette
Wir werden die Binärzeichenfolge umgekehrt konstruieren, um die stapelbasierte (LIFO-) Struktur von Actually zu nutzen und Komplikationen mit führenden Nullen in der Binärzeichenfolge zu vermeiden. Die Ziel-Binärzeichenfolge lautet also
110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, was einer20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
Dezimalzahl entspricht. In base-256 (unter Verwendung der CP437-Zeichentabelle zur Konvertierung) lautet die entsprechende Zeichenfolge♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Um die ursprüngliche Binärzeichenfolge zu erstellen, erstellen wir die Base-256-Zeichenfolge (unter Ausnutzung des darin enthaltenen Musters) und führen Basisumwandlungen in Dezimal- und Binärzeichenfolgen durch.Die Base-256-Zeichenfolge hat das folgende Format (Leerzeichen und Zeilenumbrüche wurden der Übersichtlichkeit halber hinzugefügt):
Somit kann jeder der 7 Mittelabschnitte gebildet werden, indem das Gerüst verwendet wird
«%s₧ªn%s6û
und die%s
Teile entweder durch≥
oder ersetzt werden÷
.Die spezifische Folge von
≥
s und÷
s, die wir brauchen, ist≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Da wir dies als Liste von Zeichenfolgen der Länge 1 benötigen, wäre die naive Art, dies darzustellen"≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(drücken Sie die Zeichenfolge, machen Sie sie zu einer Liste). Wir können es jedoch etwas besser machen. Indem wir diesen String als Binärzahl interpretieren (wobei≥
repräsentiert1
und÷
repräsentiert0
), erhalten wir eine13542
Dezimalzahl. Indem Sie diese zurück in eine Binärdatei konvertieren (mit den herkömmlichen Methoden1
s und0
s) und in eine Zeichenfolge der Länge 2 indizieren, erhalten Sie die Liste mit einem Byte weniger als mit der naiven Methode.Teil 2: Konvertieren in eine Binärdatei
Dieser Teil ist viel einfacher. Wenn Actually die Fähigkeit hätte, Base-256 direkt in Binärdaten umzuwandeln, würden wir dies verwenden. Leider ist dies nicht der Fall, daher müssen wir Dezimalzahlen als Zwischenformat verwenden.
Der
,
folgende Code stellt den Code aus Teil 1 dar. Zu Erläuterungszwecken habe ich den Code aus Teil 1 durch ersetzt,
, um die Ausgabe aus Teil 1 von STDIN zu lesen. Es ist nicht Teil des eigentlichen endgültigen Codes.Teil 3: Formatieren
Wenn die Herausforderung darin bestand, die Binärzeichenfolge so wie sie ist auszugeben, wären wir fertig. Es müssen jedoch noch einige Formatierungen vorgenommen werden, um die Binärzeichenfolge in ein 21 x 23-Rechteck umzuwandeln.
Wie in Teil 2 stellt das
,
die Ausgabe des vorherigen Teils dar und ist nicht Teil des tatsächlichen Codes.Für diejenigen, die zu Hause den Überblick behalten, ist dies der entsprechende Python 3-Code (481 Byte):
quelle
JavaScript (ES6),
169...136135 Byte2 Bytes dank Andrakis
gespeichert 4 Bytes dank Hedi
gespeichert
35 Bytes dank Neil gespeichertFarbige Version, 249 Bytes (237 Bytes von JS + 12 Bytes von CSS)
Der JS-Code gibt die ASCII-Grafik mit fettgedruckten Tags für das Herz aus. 12 Bytes CSS sind erforderlich, um rot einzufärben. (Ist die Anzahl der Bytes angemessen?)
quelle
s=>s.replace(/./g,'$& ')
. Ich habe an einer ziemlich identischen Lösung gearbeitet.s.replace(/./g,'$& ')
durch ersetzt werdens.split``.join` `
?[...s].join` `
replace(/./g,(c,i)=>c+=++i%21?' ':'\n')
(offensichtlich mit einem wörtlichen Zeilenumbruch dort) spart ein weiteres Byte. Es kann durchaus einen noch besseren Weg geben, diese Idee auszudrücken.05AB1E ,
775453444341 BytesVerwendet die CP-1252- Codierung.
Erläuterung
Probieren Sie es online!
quelle
Sðý42ô»
to spielenS21ô»
, da»
innere Listen implizit durch Leerzeichen verbunden sind (und das•1žä¿*•
sollte jetzt sein•Å¾$6•
, da Ganzzahlen jetzt in base-255 anstelle von base-214 codiert sind).CJam , 48 Bytes
Zusammenarbeit mit @MartinEnder, der mit dem
"uilvey"3/
String knifflige 3 Bytes abgelegt hat . Online-Dolmetscher .quelle
Javascript ES6 REPL ,
124121119113 Bytes6 Bytes gespart dank @ETHproductions
Dies ist ein vollständiges Programm, das in die REPL / Konsole eingefügt werden kann, um das richtige Ergebnis zu erzielen.
Code-Snippet anzeigen
Ausführlicher
Farbiges JavaScript nur Herz, 281 Bytes
Dies funktioniert, indem die Farben alle n Bits gewechselt werden, und nutzt die console.log-Funktion, um Farben zu protokollieren
Farbiges CSS-Herz, 229 + 12 Bytes
Wenn die Verwendung von CSS zulässig ist, kann das farbige Herz noch weiter auf 229 Byte JavaScript-Code und 12 Byte CSS reduziert werden
Code-Snippet anzeigen
quelle
a
und nurnum>>i/64&1
an beiden Orten verwenden können, um 1 Byte zu sparen. Auch++i%21==0?newline:space
ist das gleiche wie++i%21?space:newline
.i=0,r=''
zui=r=''
;''
wird automatisch auf 0 gezwungen.MATL,
5655 BytesProbieren Sie es online
Erläuterung
quelle
PowerShell v2 + (UTF-16) 300 Byte
Korrektur der Anzahl fehlerhafter Bytes dank @Mego
Nicht die kürzeste, aber eine andere Herangehensweise. Ich nahm manuell jede Zeile und schnitt sie in Paare von jeweils (ungefähr) 9-11 signifikanten Bits Länge. Konvertierte jeden dieser Binärwerte in einen
char
(Hinweis: PowerShell verwendet standardmäßig UTF-16, nicht UTF-8) und verwandelte diesen in einen String. Das ist'...'
der Anfang.Wir zerlegen
-split
das dann in Strings der Länge 2 und durchlaufen jedes Paar. Diese Paare werden in einchar
-array-Via aufgeteilt$_[0,1]
, und jedes dieser Paare wird als int umgewandelt+$_
und[convert]
in ein binary (,2
) umgewandeltString
. Das ist-join
zu einer einzigen Zeichenkette zusammengefasst, dann würdePadLeft
man die richtige Länge erhalten, dann ist jedes Element-replace
d mit sich selbst und einem Leerzeichen'$1 '
.Diese Zeichenfolgen
Write-Output
verbleiben alle in der Pipeline, und die Ausgabe erfolgt implizit, wobei standardmäßig eine neue Zeile zwischen den Elementen eingefügt wird.quelle
len("'ږƍƕ๓ƺ֥˄ϝӊ༭ǝ֥ţϝɥޔǮƱϝIJ˲ӷʴ˘ͻ֙ץŻŬɻˌʼֽ͖ҶɻŦʼʞݖɛĽƳ'-split'(..)'-ne''|%{(-join($_[0,1]|%{[convert]::ToString(+$_,2)})).PadLeft(21,'0')-replace'(.)','$1 '}".encode('utf-16be'))
/// 237 Bytes
Probieren Sie es online!
quelle
Python 3,
147144 BytesTeste es bei ideone
Initialisiert
i
auf0
in der Funktionsdeklaration, dann wiederholt sich diese 23 - mal:macht die ganze binäre Zeichenfolge ohne Leerzeichen (siehe unten);
schneidet eine Reihe von innen mit
[i:i+21]
;fügt die Leerzeichen mit
' '.join(...)
;druckt; und
erhöht sich
i
um 21 miti+=21
So erstellen Sie die gesamte Binärzeichenfolge:
Sie wird
"ilOveyOu"
achtmal wiederholt .ersetzt
O
beio
Bedarf durch (bei Indizes[2,14,18,34,38,46]
);- - - Dies wird erreicht
chr(j+30)in' ,0@DL'
, indem 3 Bytegespeichert werden und jedes Zeichen in seine Ordnungszahl umgewandelt wird.
wandelt jede Ordnungszahl in eine binäre Zeichenfolge (
'0bxxxxxxx'
) um;entfernt die führenden
'0b'
von jedem Gebrauch[2:]
;stellt jeweils ein voran
'0'
; undfügt das Ganze mit
''.join(...)
quelle
i=0\nexec(...)
oderi=0;exec(...)
für 137 Bytes.exec("...")
zuexec"..."
undprint(...)
nach wechselnprint...
PHP + HTML + CSS, 173 Bytes Farbige 367 Bytes
CLI nur PHP 173 Bytes
Entspricht dem Inhaltstyp text / html der Kopfgeldspezifikation
b{all:unset;color:red}
stattb{all:unset;color:#911;background:red}
in der ersten VersionPHP + HTML + CSS, 392 Bytes
Herz rot + schwarz, das hübscher aussieht
Rufen Sie möglicherweise die Farbnummer im CSS-Teil auf
Fügen Sie dies hinzu, bevor es schöner aussieht
Erste Version ausgeben, es ist der hässlichste HTML-Code in meinem Leben
rot-schwarzes Herz
375 Bytes für die direkte Erstellung der HTML-Seite mit PHP
quelle
color:#911;background:red
durchcolor:red;
wird die Kopfgeldspezifikation erfüllt und es werden ein paar Bytes gespart.Powershell, 110 Bytes
Erläuterung:
Die erste Zeile des Skripts nimmt die Teilzeichenfolgen und fügt einen Buchstaben
O
dazwischen ein. Das Ergebnis ist die ZeichenfolgeuiloveyOuilOveyouiloveyOuilOveyOuiloveyouilOveyouilOveyOuilOvey
. Beachten Sie, dass das erste und das letzte Zeichen redundant sind.Die Schleife gibt alle erforderlichen
(8..490)
Bits aus den Zeichen der Zeichenfolge sowie ein Leerzeichen oder einen Zeilenvorschub aus.Das Rätsel des Empfängers des Valentinsbriefes
Es ist ersichtlich, dass kleine und große Symbole
O
selbst die Bitcodierung bilden. Es gibt 15 Symbole (Bits). Es gibt nur eine Partition in den Bits, um ASCII-Zeichen zu erhalten:oOOooOOO
+ooOoOOO[o]
. Wir mussteno
statt0
am Ende ein kleines hinzufügen . Diese ASCII-Symbole sind:g.
Wer ist das mysteriös
g.
?quelle
PHP, 121 Bytes
Nervenzusammenbruch
quelle
q / kdb +,
10793855553 BytesLösung:
Beispiel:
Erläuterung:
Anmerkungen:
quelle
Python 3, 199 Bytes:
quelle
Python 3, 170 Bytes
Führt eine String-Wiederholung von "Il% svey% su" durch, wiederholt sie die erforderliche Anzahl von Malen und verwendet dann ein Tupel, um alle O's zu subtrahieren. Anschließend konvertiert es sie in Binär, verwendet das Textwrap-Modul und konvertiert jedes Element des neuen Liste zu Liste, verbindet sich mit Leerzeichen und hängt dann 0 1 1 an, weil das ein Stummel oder so zu sein scheint
quelle
Mathematica, 123 Bytes (275 mit Farbe)
Ich bin nicht sicher, ob die Verwendung
Grid
anstelle der Ausgabe einer Zeichenfolge in Ordnung ist (wenn nicht, handelt es sich um einen nicht konkurrierenden Eintrag).B / W
Farbe
quelle
grid
im Klartext kopieren / einfügen und in den Notizblock einfügen? Wie sieht es aus? Leerzeichen getrennt (Leerzeichen) mit Zeilenumbrüchen, wie die Abbildung zeigt?Ruby 142 Bytes
(Etwas mehr) leserlich:
Ich habe noch keine Möglichkeit gefunden, den Originaltext in Ruby in einer prägnanteren Form zusammenzufassen - es gibt einige großartige Funktionen zur Manipulation von Zeichenfolgen, aber auf alle Arten, die ich ausprobiert habe, werden mehr Zeichen als die Zeichenfolge selbst verwendet. Für jeden Hinweis dankbar, dies ist mein erster Code Golf auf StackOverflow!
quelle
a
), und danna+a+a
...? Noch besser, wenn Ruby die Multiplikation von Strings unterstützta*count
!a+a+a
ist)o
durch ein GroßbuchstabenO
!Rust, 195 Bytes
Ungolfed:
quelle
C (gcc) , 102 Bytes
Heruntergewirtschaftet
Probieren Sie es online!
quelle
K (oK) ,
50 bis48 BytesLösung:
Probieren Sie es online!
Erläuterung:
Port meiner Q / KDB + -Lösung .
Anmerkungen:
quelle
2 14 18 34 38 46
->0x020e1222262e
Pyth, 47 Bytes
Probieren Sie es hier online aus .
quelle
/// 220 Bytes
Probieren Sie es online!
quelle
C ++ 11, nicht konkurrierend,
726687636 Byte (* NIX- oder W10-Schwellenwert 2 erforderlich)Ich weiß, das kann man viel besser spielen. Ich möchte eine kurze c ++ Antwort sehen, verdammt!
Wahrscheinlich habe ich auch ein paar Fehler gemacht, als ich den Herzabschnitt codiert habe.
Ausgabe (Farben fest):
quelle
Python, 473 Bytes
Farbig!
quelle
str.translate
könnte eine bessere Wahl seinFEU , 360 Bytes
Einfach blöde Kompression
quelle