Einführungen
Eine 2 × n-Boolesche Matrix kann als Zeichenfolge der vier Zeichen dargestellt werden . ':
. Die Zeichenfolge hat eine "obere Reihe" und eine "untere Reihe", wobei Punkte Einsen und Leerzeichen Nullen darstellen. Zum Beispiel die 2 × 6-Matrix
1 0 1 0 0 1
0 0 0 1 0 1
kann dargestellt werden als ' '. :
. Ihre Aufgabe ist es, eine Matrix in dieser "komprimierten Form" zu nehmen und ihre Einträge wie ein Förderband einen Schritt im Uhrzeigersinn zu drehen.
Eingang
Ihre Eingabe ist eine einzelne Zeichenfolge über den Zeichen . ':
. Ihre Länge beträgt garantiert mindestens 2.
Ausgabe
Ihre Ausgabe soll die Eingabezeichenfolge sein, wobei jedoch jeder Punkt um einen Schritt im Uhrzeigersinn gedreht wird. Genauer gesagt befinden sich die Punkte in der oberen Reihe weiter rechts, mit Ausnahme des am weitesten rechts stehenden Punkts, der sich nach unten bewegt. Die Punkte in der unteren Reihe bewegen sich einen Schritt nach links, mit Ausnahme des am weitesten links stehenden Punkts, der nach oben bewegt wird. Insbesondere muss die Ausgabezeichenfolge dieselbe Länge wie das Original haben, und Leerzeichen sind von Bedeutung.
Beispiel
Betrachten Sie die Eingabezeichenfolge :..:'.
, die der 2 × 6-Matrix entspricht
1 0 0 1 1 0
1 1 1 1 0 1
Die gedrehte Version dieser Matrix ist
1 1 0 0 1 1
1 1 1 0 1 0
das entspricht der Zeichenfolge ::. :'
.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Sie können entscheiden, ob die Eingabe und Ausgabe in Anführungszeichen gesetzt werden soll, und in beiden Fällen ist auch eine nachgestellte Zeile zulässig.
Testfälle
Diese Testfälle sind in doppelte Anführungszeichen eingeschlossen.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(Flip 2 Teile, damit ich erhöhen kann, weniger Regexp und einfacher Test, speichern Sie prev c in q)Perl,
706964636160 BytesBeinhaltet +2 für
-lp
Führen Sie mit der Eingabezeichenfolge auf STDIN aus, z
rotatedots.pl
:Erläuterung
Leerzeichen werden
im obigen Code nicht konvertiert. Für die Berechnungen
/2
und*2
es wird sich so verhalten und werden0
. In den anderen Positionen ist es Teil des "oder", aber die 1 Bits des Leerzeichens sind eine Teilmenge der einen Bits von0
und haben den gleichen Effekt, als0
ob sie mit einer der Ziffern verknüpft wären. Nur wenn das Zeichen, mit dem es verknüpft ist, ein Leerzeichen ist, bleibt es ein Leerzeichen, anstatt ein zu werden0
. Aber das ist0
in Ordnung, da sowieso wieder in den Weltraum konvertiert worden wäre.quelle
Netzhaut , 66
Erläuterung
Beginnend mit der Eingabe:
In den ersten 4 Schritten wird die Matrix erstellt, wobei für die oberen / unteren Zeilen
1
/e
für true bzw.0
/f
für false verwendet wird. Obere und untere Reihe sind miteinander verschachtelt. Dies würde eine Zeichenkette ergeben wie:Durch diese 4 Stufen wird jedoch auch die untere Reihe 1 nach links verschoben, indem einfach die Reihenfolge der Buchstaben und Ziffern umgekehrt wird:
Die
T
Ransliterationsstufe kehrt die Hexadezimalziffern nur für das erste und das letzte Zeichen um, dh ersetzt0-9a-f
durchf-a9-0
. Dies hat zur Folge, dass das Zeichen von links unten in die oberste Zeile und das Zeichen von rechts oben in die unterste Zeile verschoben wird:In der nächsten Stufe wird dann jedes Buchstaben-Ziffern-Paar vertauscht, wodurch die obere Reihe 1 nach rechts verschoben wird. Bisher war dies der Fall
(\D)(\d)
, aber es stellt sich heraus, dass dies(.)(\d)
ausreichend ist, da die Ersetzungen immer von links nach rechts erfolgen und die letzten beiden Ziffern nicht fälschlicherweise damit übereinstimmen, da das vorletzte Zeichen bereits ersetzt wurde. Die Matrix wurde nun wie erforderlich vollständig gedreht:Die letzten 4 Stufen werden dann wieder in das ursprüngliche Format übersetzt:
Probieren Sie es online aus.
Alle Testfälle, einer pro Zeile , werden
m
zurT
Zeile hinzugefügt, um die getrennte Behandlung jeder Eingabezeile zu ermöglichen.quelle
Jelly,
323029 BytesBeachten Sie das nachfolgende Leerzeichen. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Wir beginnen mit der Betrachtung der Eingabezeichenfolge (zB
:..:'.
) und ihrer Umkehrung.Für jedes Zeichen in der oberen Reihe prüfen wir, ob es dazu gehört
':
, und für jedes Zeichen in der unteren Reihe, ob es dazu gehört.:
. Dies ergibt das 2D-Array von Booleschen WertenDas ist die Matrix aus der Frage, mit umgekehrter unterer Reihe.
Wir entfernen den letzten Booleschen Wert jeder Zeile, kehren die Reihenfolge der Zeilen um, stellen die Booleschen Werte in der ursprünglichen Reihenfolge voran und kehren schließlich die oberste Zeile um.
Dies ergibt die gedrehte Matrix aus der Frage.
Schließlich betrachten wir jede Spalte von Booleschen Werten als Binärzahl und Index
'.:
, um die entsprechenden Zeichen zu erhalten.Wie es funktioniert
quelle
Pyth,
38362 Bytes dank Jakube!
Probieren Sie es hier aus oder starten Sie die Test Suite .
Erläuterung:
quelle
L,hb_eb
ist ein Byte kürzer und.DR2T
erzeugt auch das kartesische Produkt und ein paar weitere Paare, tut dies aber nicht und in einer Ziffer und hilft, Platz zu sparen..D
Trick ist wirklich cool!Python 3,
145141130 BytesErläuterung
Die golfed Lösung die folgende Eigenschaft Zip verwenden:
zip('ABCD', 'xy') --> Ax By
sozip(a[:l],a[l:])
kann durch ersetzen seinzip(a,a[l:])
und dass die Definition entfernen , damit derl
Ergebnisse
quelle
Pyth, 66 Bytes
Probieren Sie es hier aus!
Erläuterung
Dies kann in 3 Teile zerlegt werden:
Eingabe konvertieren
Das ist ziemlich trivial. Jedes Zeichen wird folgendermaßen zugeordnet:
Das erste ist ein Leerzeichen.
Wir erhalten eine Liste von 2 Tupeln, die wir transponieren, um die 2 Zeilen der Matrix zu erhalten, die dann abgeflacht werden.
Code
Drehen
Wir haben die Matrix als flaches Array in
J
und die Breite der Matrix inK
. Die Rotation kann beschrieben werden als:Code
Konvertiere es zurück
quelle
Python 3,
166154153150146138137135132127 BytesEdit: Ich habe die Verwendung
zip
von Erwans Python-Antwort am Ende der Funktion ausgeliehen.und ihre Idee,Es stellte sich heraus, dass Umkehrungen für meine Funktion keine gute Idee waren. Ich habe meine Verwendung[::-1]
Umkehrungen zu verwenden , obwohl ich meine eigene Wendung legte.format
für das weitere Golfen geändert . Verschobena
undb
direktzip
zum weiteren Golfen (Ungolfing bleibt unverändert, da die Trennung vona
undb
dort nützlich ist, um Unordnung in meiner Erklärung zu vermeiden)Edit: Borrowed
(some number)>>(n)&(2**something-1)
aus dieser Antwort von xnor auf der Musik - Intervall Solver Herausforderung . Die Unordnung, die ist,zip(*[divmod(et cetera, 2) for i in input()])
kann wahrscheinlich besser golfen werden, obwohl ich die Zweckmäßigkeit mag, die es von der Verwendung von zwei Tupelnt
und gewährtv
.Ungolfed:
quelle
Ruby,
166163 BytesYuck ...
transpose
ist zu lang.Hier verwendete Tricks:
sprintf('%02b',x)
zu konvertieren"0"
,"1"
,"2"
,"3"
in"00"
,"01"
,"10"
, und"11"
jeweils. Überraschenderweise muss das zweite Argument nicht zuerst in eine Ganzzahl umgewandelt werden.Die Rotation erfolgt über
a[1].push a[0].pop;a[0].unshift a[1].shift;
, was ich zumindest für ein wenig clever hielt (wenn auch nicht übermäßig ausführlich in Ruby). Die Symmetrie ist jedenfalls ästhetisch schön: Pquelle
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
→.map{|x|f[x.join.to_i 2]}*''
Javascript ES6 125 Bytes
Ich ordne jedes Zeichen einem zweistelligen binären Äquivalent zu
und ich stelle sie mir übereinander vor
Ich speichere das bis n
Für jedes Zeichen (0-3) von n überprüfe ich seine Nachbarn und addiere das höchstwertige Bit des linken Nachbarn zum niedrigstwertigen Bit des rechten Nachbarn. Wenn i == 0 (erstes Zeichen), verwende ich ein eigenes Bit niedrigerer Ordnung anstelle des höherwertigen Bits des linken Nachbarn.
Wenn n [i + 1]> - 1 bedeutet dies, dass wir 0,1,2,3 haben. Wenn dies falsch ist, treffen wir das letzte Element.
In diesem Fall verwende ich das höchstwertige Bit des Charakters anstelle des niedrigeren Bits des rechten Nachbarn
Ordne das zurück zu
.':
landen und verbinde das Array wieder miteinanderquelle
MATL ,
4039 BytesProbieren Sie es online! Die verknüpfte Version wurde aufgrund von Änderungen in der Sprache nach dem
v
Posten&v
dieser Antwort von ersetzt .quelle
JavaScript, 311 Byte
Kann wahrscheinlich viel verbessert werden:
quelle
s[i-1]
? Das könnte einige Bytes einsparen.s[i+1]
.<
statt==
verwenden, sparen Sie möglicherweise einige Byte. Vielleicht möchten Sie auch Tipps zum Golfen in JS und Tipps zum Golfen in ES6<
anstelle von==
JavaScript (ES6),
237210204188182178 BytesDank an @Downgoat für das Speichern von 16 Bytes in der 188-Byte-Revision
Update: Ich hatte eine Gehirnwelle und reduzierte die erste Operation auf
s
einen einzigenmap
Anruf anstatt auf zwei separateHübscher Druck u. Erklärung
quelle
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
arbeiten?Perl,
144142137131 BytesByte für die
-n
Flagge hinzugefügt .Ziemlich derselbe Algorithmus wie meine Ruby-Antwort , nur kürzer, weil ... Perl.
Widerlich,
@a=(shift@b,@a)
ist kürzer alsunshift@a,shift@b
.Leider sind diese gleich lang:
Danke an Ton Hospel für 5 Bytes und msh210 für ein Byte!
quelle
..@a
anstelle von verwenden..$#a
? (Vielleichtoct
stirbt oder gibt 0 oder so etwas zurück. Ich habe es nicht ausprobiert.)//g
sprintf
ist soooo lang.map$_%2,/./g
und mussmap$_/2|0,//g
fast kürzer sein (ungetestet)Python 3,
294287283 BytesWaaayyyyyy zu lange, aber ich werde versuchen, einige Bytes Golf:
quelle
Lua, 139 Bytes
Verwendungszweck:
quelle