Die Kunst der Wortgestaltung
Ersetzen Sie bei einer gegebenen binären Matrix und einer Folge von Buchstaben alle Einsen in der Matrix von links nach rechts durch die Buchstaben der Folge. Sobald die Buchstaben in die Form der Matrix gebracht wurden, drucken Sie die Matrix aus und ersetzen Sie die Nullen durch Leerzeichen. Es ist wahrscheinlich einfacher, nur ein oder zwei Beispiele zu nennen.
Fall: Basisfall ...
Eingang Eins:
[0,0,1,0,0]
[0,1,0,1,0]
[1,0,0,0,1]
[0,1,0,1,0]
[0,0,1,0,0]
"PPCGPPCG"
Ausgang Eins:
P
P C
G P
P C
G
Fall: Wenn die Eingabezeichenfolge länger als die Anzahl der Einsen ist ...
Eingang zwei:
[1,0,0]
[0,1,0]
[1,0,1]
lambda
Ausgang zwei:
l
a
m b
Fall: Wenn die Eingabezeichenfolge kürzer als die Anzahl der Einsen ist ...
Eingang drei:
[1,1,1]
[1,0,1]
[1,1,1]
PPCG
Ausgang drei:
PPC
G P
PCG
Verfügbare Annahmen
- Sie können davon ausgehen, dass die Eingabezeichenfolge niemals leer ist.
- Sie können davon ausgehen, dass die Matrix niemals leer sein wird.
- Sie dürfen nicht davon ausgehen, dass die binäre Matrix niemals ausschließlich aus Nullen besteht.
Regeln
- Wenn die Zeichenfolge kürzer als die Anzahl der Einsen ist, wiederholen Sie die Zeichenfolge. Alle müssen ersetzt werden.
- Wenn die Zeichenfolge länger als die Anzahl der Zeichenfolgen ist, verwenden Sie nur das, was benötigt wird.
- Sie können True / False anstelle von Ganzzahlen / Bits für die Eingabe verwenden.
- Nachgestellte Leerzeichen SIND ERFORDERLICH, alle Nullen müssen durch Leerzeichen ersetzt werden.
- Eine einzelne nachgestellte Zeile ist zulässig.
- Dies ist Code-Golf, die niedrigste Byte-Anzahl gewinnt.
Antworten:
MATL , 11 Bytes
Eingaben sind eine numerische Matrix (mit
;
als Zeilentrennzeichen) und eine Zeichenkette.Probieren Sie es online! Oder überprüfen Sie die Testfälle: 1 , 2 , 3 .
quelle
Vim,
4442 Bytes2 Bytes gespart dank @DjMcMoylex !
Hier ist das
^M
ein wörtlicher Zeilenumbruch, und das^V
istCTRL-VÜbernimmt die Eingabe in diesem Format:
Haftungsausschluss: Wenn die Zeichenfolge länger als ~ 40 Zeichen ist, hat Ihr Computer möglicherweise keinen RAM mehr.
Erläuterung:
Hier ist ein GIF von mir, wie ich das "Programm" "laufe":
quelle
{
anstelle vongg
ein paar ausziehen.Retina ,
4133 BytesProbieren Sie es online!
Die Eingabezeichenfolge wird in der ersten Zeile der Eingabe angegeben, gefolgt von der Matrix. Da Retina kein Konzept für Listen (oder wirklich alles außer Zeichenfolgen) hat, gibt es in der Binärmatrix keine Trennzeichen, außer für Zeilenvorschübe zum Trennen von Zeilen.
Erläuterung
Wandelt Nullen in Leerzeichen um.
Ersetzen Sie das erste
1
Zeichen wiederholt durch das erste Zeichen der Eingabezeichenfolge, während Sie dieses Zeichen gleichzeitig bis zum Ende der Eingabezeichenfolge drehen. Dies ist in Fällen1
hilfreich, in denen die Eingabezeichenfolge mehr als s Zeichen enthält.Verwerfen Sie die erste Zeile, dh die Eingabezeichenfolge.
quelle
(.)(.*)
- Teehee ...JavaScript ES6,
67535049 Bytes3 Bytes dank @ETHproductions gespart 1 weitere dank @Neil
Alter Code, bevor ich wusste, dass String-Matrizen ein gültiges Eingabeformat sind:
Code-Snippet anzeigen
quelle
c=>' '[c]||b[i++%b.length]
, aber leider ist es ein Byte länger ...(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
i
istundefined
, also++i
kehrt zurückNaN
. Sinceb
hat keineNaN
Eigenschaft, gibtb[++i]
zurückundefined
, und der||
Operator führt sein Argument auf der rechten Seite aus und setzt das erste Zeicheni
auf0
und gibt es zurückb
.\d
? Sicherlich.
reicht das aus, da man sich nur mit0
s und1
s auseinandersetzen muss (.
passt nicht zu Zeilenumbrüchen).Perl, 40 Bytes
36 Byte Code +
-i -p
Flags.(Beachten Sie das letzte Leerzeichen und das Fehlen des letzten Zeilenumbruchs).
Um es auszuführen, schreiben Sie die Eingabezeichenfolge nach dem
-i
Flag und geben Sie die Matrix in die Eingabe ein:Wenn Ihr Perl ein bisschen alt ist, müssen Sie möglicherweise ein abschließendes Semikolon (nach dem Leerzeichen) hinzufügen.
quelle
Python 2,
11471 BytesEs stellte sich heraus, dass ich das Rad neu erfunden habe. Ein einfacher doppelter Ersatz für eine mehrzeilige Saite funktioniert ganz gut. Die Zeichenfolge hat den zusätzlichen Vorteil, dass sie Nullen direkt zählen kann, anstatt das wirklich Hässliche
s*len(L)*len(L[0])
für eine verschachtelte Liste tun zu müssenAlte Lösung:
Zuerst konvertieren wir alles + 32 mit
chr
(alle Nullen werden zu Leerzeichen), dann ersetzen wir alles!
mit{}
, um die Verwendung derformat
Funktion zu ermöglichen .WennWenn ich beschließe, zu betrügen undNULL
als Leerzeichen gezählt werden kannNULL
anstelle von Leerzeichen zu verwenden, kann ich die Addition von 32 überspringen, um 12 Bytes zu sparen. (print
wird'\x00'
als Leerzeichen angezeigt )quelle
.replace('\x00',' ')
am Ende fügt 20 Bytes hinzuAPL, 18 Bytes
Dies ist eine Funktion, die eine boolesche Matrix als linkes Argument und eine Zeichenfolge als rechtes Argument verwendet.
Erläuterung:
APL hat ein eingebautes Programm, das so etwas macht
\
(expand). Es funktioniert jedoch nur mit Vektoren und erfordert, dass jedes Zeichen tatsächlich verwendet wird.X←,⍺
: Reduziere die Matrix und speichere das Ergebnis in X.⍵⍴⍨+/X
: Verändern Sie die Form des Zeichenvektors so, dass er die erforderliche Anzahl von Elementen enthält (dies sorgt auch dafür, dass die Zeichenfolge verlängert wird, indem Zeichen bei Bedarf wiederholt werden).X\
: Nimm eines der Zeichen für jedes1
und ein Leerzeichen für jedes0
inX
.(⍴⍺)⍴
: Das Ergebnis so umformen, dass es die Form der ursprünglichen Matrix hat.quelle
PHP,
11091978882818075 Bytes6 Bytes gespart dank @ user59178
Laufen Sie mit
-r
. Erwartet Matrix als mehrzeilige Zeichenfolge im ersten Argument, Zeichenfolge im zweiten Argument.quelle
foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];
Ich habe die Reihenfolge der beiden Ternären vertauscht und daher die Klammern von der zweiten durch Verwenden von<1
anstatt>0
for(;""!=$c=$argv[1][$i++];)
anstelle vonforeach(...)
PowerShell v2 +, 70 Byte
Nimmt das Eingabewort als
$a
und die Matrix als Array von Arrays als$b
(siehe Beispiele unten). Durchläuft$b
die Elemente jeder Zeile und durchläuft sie dann$_|%{...}
. Die innere Schleife ist eineif
/else
-Bedingung, bei der wir entweder$a[$n++]
mod ausgeben und gleich der Länge des Strings nehmen oder ein Leerzeichen ausgeben' '
. Diese werden-join
wieder zu einer Schnur zusammengefügt. Jede der Zeichenfolgen verbleibt in der Pipeline, und die implizite Ausgabe mit Zeilenumbrüchen zwischen erfolgt überWrite-Output
bei Programmabschluss.quelle
Groovy, 63 Jahre alt
quelle
Python 3, 104 (oder 83) Bytes
Es gibt eine kürzere Option (83 Bytes), die jedoch fehlschlägt, wenn die Zeichenfolge mehr als 999-mal kürzer als erforderlich ist:
quelle
next
Liste aufrufen können . Wenn Sie es tuns=iter(list(s)*999)
, tut es (89 Bytes)s.pop(0)
. Scheint, dass ich die falsche Version kopiert habe, das wurde behoben.s[i++%s.length()]
ist eine gute Methode, obwohl ich Python nicht kenne.i++
in PythonPyth, 12 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
ES6, 78 Bytes
Ich habe es versucht
quelle
Common Lisp, 152 Bytes
Verwendung:
Diese Funktion durchläuft jedes Element jeder Zeile des Rasters. Die
format
Steuerzeichenfolge gibt entweder ein Leerzeichen aus, wenn das Element eine 0 ist, oder verbraucht das Zeichenargument, wenn das Element 1 ist. Nach jeder Zeile des Rasters wird eine neue Zeile gedruckt. Wenn die Zeichenfolge zu kurz ist, wird sie von Anfang an wiederholt. Wenn es zu lang ist, wird nur der entsprechende Teil ausgegeben.quelle
Pip , 18 Bytes
17 Byte Code, +1 für
-l
Flag.Nimmt das Array als erstes Befehlszeilenargument
100 010 101
(muss in Anführungszeichen gesetzt werden) und die Zeichenfolge als zweites Befehlszeilenargument. Probieren Sie es online!Erläuterung
quelle
Java,
237233 BytesEdit: 4 Bytes dank Mukul Kumar gespeichert
Golf gespielt:
Ungolfed:
Testen:
quelle
Pyke, 12 Bytes
Probieren Sie es hier aus!
Gibt eine Zeichenmatrix aus
Oder 9 Bytes, nicht konkurrenzfähig.
Probieren Sie es hier aus!
Noch nicht konkurrenzfähiger, 8 Bytes
Probieren Sie es hier aus!
print_grid
Richtet jetzt leere Zeichenfolgen richtig ausdeep_for
Jetzt wird über Fälschungen anderer Art als die Wahrheiten getipptFür den Fall, dass Sie nicht mehr weiterkommen möchten
quelle
Java, 122 Bytes
quelle
Mathematica, 76 Bytes
Unbenannte Funktion von zwei Argumenten, von denen das erste (
#
) ein Array vonTrue
s undFalse
s ist und das zweite (s
) eine Liste von Zeichen ist. Die Helferfunktionwird definiert, wodurch die Züge das erste Zeichen von
s
an das Ende setzen und dann das gerade verschobene Zeichen zurückgeben. Durchf
mehrmaliges Aufrufen werden die Zeichen ders
Reihe nach zyklisch zurückgegeben .Die Kernfunktion ist
Das ruft
f
jedenTrue
Wert im Eingabearray auf und gibt bei jeder falschen Eingabe ein Leerzeichen zurück. (Der{2}
Befehl weist SieMap
an, Elemente der Komponentenlisten des Arrays zu bearbeiten, anstatt diese Listen selbst.)Diese 60 Bytes geben ein Array von Zeichen
s
und Leerzeichen zurück. Der WrapperFügt Zeilenumbrüche zwischen die Listen des jeweiligen Arrays ein und verkettet dann alles.
quelle
C ++, 61 Bytes
quelle