Shifty-Eyes ASCII-Leute lieben es, ASCIIs zu verschieben Ii
:
>_> <_< >_< <_>
Verschieben Sie bei einer Reihe von Shifty-Typen in Abständen oder mit getrennten Linien die Ii
Seite zu Seite, lassen Sie die Wand links und den Himmel rechts:
Ii
Der kürzeste Schalthebel gewinnt den Preis.
Sag was?
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge einer beliebigen Liste dieser vier ASCII-Emoticons enthält, entweder durch Leerzeichen oder durch Zeilenumbrüche getrennt (mit optionalem abschließendem Zeilenumbruch):
>_>
<_<
>_<
<_>
Zum Beispiel könnte die Eingabe sein
>_> >_> <_>
oder
>_> >_> <_>
(Die von Ihnen unterstützte Methode liegt bei Ihnen.)
Jedes Emoticon führt eine andere Aktion für die Zeichen I
und aus i
, die immer so beginnen:
Ii
>_>
verschiebt sichI
nach Möglichkeit um eins nach rechts und danni
um eins nach rechts.<_<
verschiebtI
sich, wenn möglich, um eins nach links und dann, wenn möglich,i
um eins nach links.>_<
verschiebt sichI
nach Möglichkeit um eins nach rechts und danni
nach Möglichkeit um eins nach links.<_>
verschiebt sichI
nach Möglichkeit um eins nach links und danni
um eins nach rechts.
I
kann nicht nach links verschoben werden, wenn es sich am linken Rand der Linie befindet (wie es anfänglich ist), und kann nicht nach rechts verschoben werden, wenn i
es sich direkt nach rechts befindet (wie es anfänglich ist).
i
Kann nicht nach links verschoben werden, wenn er I
direkt nach links liegt (wie am Anfang), kann aber immer nach rechts verschoben werden.
Beachten Sie, dass diese Regeln I
immer links von bleiben i
und I
versucht werden, sie i
für alle Emoticons vorher zu verschieben .
Ihr Programm oder Ihre Funktion muss eine Zeichenfolge der letzten Ii
Zeile drucken oder zurückgeben , nachdem alle Verschiebungen in der angegebenen Reihenfolge angewendet wurden, wobei Leerzeichen (
) oder Punkte ( .
) als Leerzeichen verwendet werden. Nachgestellte Leerzeichen oder Punkte und eine einzelne nachgestellte Zeile sind in der Ausgabe optional zulässig. Mischen Sie keine Leerzeichen und Punkte.
Zum Beispiel die Eingabe
>_> >_> <_>
hat ausgegeben
I...i
da gelten die verschiebungen gerne
start |Ii >_> |I.i >_> |.I.i <_> |I...i
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist höher gestimmte Antwort.
Testfälle
#[id number]
[space separated input]
[output]
Gebrauch .
für Klarheit.
#0
[empty string]
Ii
#1
>_>
I.i
#2
<_<
Ii
#3
>_<
Ii
#4
<_>
I.i
#5
>_> >_>
.I.i
#6
>_> <_<
Ii
#7
>_> >_<
.Ii
#8
>_> <_>
I..i
#9
<_< >_>
I.i
#10
<_< <_<
Ii
#11
<_< >_<
Ii
#12
<_< <_>
I.i
#13
>_< >_>
I.i
#14
>_< <_<
Ii
#15
>_< >_<
Ii
#16
>_< <_>
I.i
#17
<_> >_>
.I.i
#18
<_> <_<
Ii
#19
<_> >_<
.Ii
#20
<_> <_>
I..i
#21
>_> >_> <_>
I...i
#22
<_> >_> >_> >_> <_> <_<
.I...i
#23
<_> >_> >_> >_> <_> <_< >_< <_< >_<
..Ii
#24
>_> >_< >_> >_> >_> >_> >_> >_> <_> <_> <_<
...I.....i
Antworten:
CJam, 33 Bytes
Verwendet den gleichen Algorithmus wie meine Python-Antwort , außer mit 0-Indizierung. Im Wesentlichen:
<
in -1 und>
in 1 konvertierenI
und Anwenden aufi
wechseln, wechseln wir die Position, die wir nach jedem Pfeil aktualisierenVielen Dank an @ MartinBüttner für das Golfen des Ausgabeschritts und das Abheben von 5 Bytes.
Versuchen Sie es online | Testsuite
quelle
Perl,
595654 BytesBeinhaltet +1 für
-p
Führen Sie mit der Eingabe auf STDIN, z
perl -p shifty.pl <<< ">_> <_< >_< <_>"
shifty.pl
:Erläuterung
Die Steuerzeichenfolge wechselt die Anweisungen für
i
undI
und die Regel ist für beide gleich, wenn Sie sie wie folgt formulieren:<
Bewegen Sie sich nach links, wenn links ein Leerzeichen ist>
Bewegen Sie sich nach rechts, wenn rechts ein Leerzeichen oder ein Ende der Zeichenfolge istAlso ich Swap werde
i
undI
bei jedem Schritt in der Zielzeichenfolge so dass ich immer nur die Regel auf einen Buchstaben anwenden muß. Dies ist dasy/iI/Ii/
Ich gehe den Kontrollstring durch
<
und suche und>
benutze eine Substitution, die normalerweise der kürzeste Weg in Perl ist, um etwas Zeichen für Zeichen zu verarbeiten. Um nicht schreiben zu müssen,$var =~
möchte ich die Steuerzeichenfolge in der Perl-Standardvariablen$_
. Und ich möchte auch eine einfache Möglichkeit , zu unterscheiden<
von>
. All dies kann mit erreicht werdenDie Zielzeichenfolge möchte ich auch mit Substitutionen manipulieren und aus dem gleichen Grund möchte ich das
$_
auch.$_
Zwei Dinge gleichzeitig zu sein, scheint unmöglich.Ich kann jedoch meinen Kuchen haben und ihn auch essen, weil das
$_
Innere eines Substitutionskörpers nicht dasselbe bleiben muss wie das$_
Substituierte. Sobald Perl mit dem Ersetzen eines Strings begonnen hat, ändert sich dieser String nicht mehr, selbst wenn Sie die Variable ändern, aus der der String ursprünglich stammt. Sie können also Folgendes tun:Ich möchte das Original nur dann
$_
durch das Initiale ersetzen,"Ii"
wenn der Ersetzungskörper zum ersten Mal ausgeführt wird (ansonsten setze ich die Zielzeichenfolge weiter zurück). Dieser Austausch muss jedoch auch für eine leere Kontrollzeichenfolge erfolgen, sodass der Body selbst für die leere Kontrollzeichenfolge mindestens einmal ausgeführt werden muss. Um sicherzustellen, dass die Substitution am Anfang der Kontrollzeichenfolge eine zusätzliche Zeit lang ausgeführt wird (auch bei leeren Kontrollzeichenfolgen), ändere ich die Substitution in:Ich werde das
y/iI/Ii/
als erstes im Ersetzungscode ausführen. Solange$_
es sich noch um die Steuerzeichenfolge handelt, enthält diese noch keineIi
. Wenn die Transliteration also anzeigt, dass nichts geändert wurde, ist dies mein Auslöser. Initialisieren Sie$_
:Jetzt kann ich das eigentliche Verschieben der Buchstaben durchführen. Da ich mit einem Swap beginne, sollten alle Züge am gemacht werden
i
, nichtI
. Wenn gesetzt$1
ist, gehei
nach rechts:Wenn
$1
nicht gesetzt, gehei
nach linksBeachten Sie, dass am Anfang der Steuerzeichenfolge, wenn ich übereinstimme
^
$1
, nicht festgelegt wird, so dass versucht wird,i
auf der ursprünglichen Zeichenfolge nach links zu verschiebenIi
. Dies wird nicht funktionieren, da dort kein Platz ist, so dass die Anfangszeichenfolge ungestört bleibt (aus diesem Grund habe ich die()
herum>
statt<
)Es bleibt nur ein Problem: Am Ende der äußeren Ersetzung
$_
wird das Ergebnis der äußeren Ersetzung angezeigt, unabhängig davon, was Sie$_
im Ersetzungskörper angestellt haben. Also die Zielzeichenfolge mit der richtigen Platzierungi
undI
geht verloren. In älteren Perls wäre dies ein fataler Fehler. Neuere Perls haben jedoch denr
Modifikator " Erstelle eine Kopie der ursprünglichen Zeichenfolge, ersetze diese und gib die resultierende Zeichenfolge zurück (anstelle der Anzahl der Übereinstimmungen)". Wenn ich das hier benutze, ist das Ergebnis, dass der geänderte Befehlsstring verworfen wird, während das Original$_
nicht durch Perl gestört wird und nach dem Ersetzen übrig bleibt. Jedoch ist das störende, was ich an tue,$_
immer noch erledigt, nachdem Perl in$_
Ruhe gelassen wurde. Also am Ende$_
wird die richtige Zielzeichenfolge sein.Die
-p
Option stellt sicher, dass sich die ursprüngliche Zeichenfolge in befindet,$_
und druckt auch das Finale$_
.quelle
Ii
nichtiI
.^
Match bedeutet, dass ich sie tauschen muss. Die umgekehrte Initialisierung ist also korrekt.LittleLua - 178 Bytes
Einfache Implementierung.
Ungolfed:
Was ist LittleLua?
LittleLua ist in Arbeit, um zu versuchen, die Wettbewerbsbedingungen zwischen meiner bevorzugten Sprache für diese Herausforderungen und esoterischen Sprachen, die oft über extrem leistungsfähige Funktionen verfügen, auszugleichen.
LittleLua ist ein Lua 5.3.6-Interpreter mit einem zusätzlichen Modul (LittleLua.Lua) sowie eingeschränkten Funktions- und Modulnamen. Diese Änderungen werden sich in den nächsten ein oder zwei Tagen ausweiten, bis ich zufrieden bin, aber derzeit sind einige der größten Änderungen zwischen LittleLua und einem Standard-Lua-Interpreter:
Funktionen und Module sind geschrumpft:
Eingebaute Variablen
LittleLua verfügt über mehrere eingebaute Variablen, um einige Aufgaben zu verkleinern:
Eingebaute Funktionen
Derzeit eine bedrückend kleine Liste, aber hier ist es:
quelle
$
, und verwenden Sie das anstelle vonend
odere
- Nicht-A-Za-z
Wort-Zeichen brauchen keine Leerzeichen um sie herum, oder? Das würde ein Byte proend
/e
if
aufi
, ein Byte pro Anwendung zu speichern, undend
zue
zwei Speichern, aber Sie linkselse
allein? Selbst in diesem einfachen Programm (5if
s und 2else
s) verschwenden Sie mehr Bytes,else
als Sie einsparenif
. (Ich nehme an, das ist eine geplante Verbesserung?)Netzhaut ,
10186Probieren Sie es online aus
Dank daavko 15 Bytes gespart!
Nimmt Eingaben getrennt durch Zeilenumbrüche und Ausgaben mit durch Leerzeichen getrennten Augen.
Erläuterung:
Ich werde wie gewohnt Schritt für Schritt erklären. Alle diese Stufen befinden sich im Retina-Ersetzungsmodus. Das bedeutet, dass die erste Zeile ein regulärer Ausdruck und die zweite Zeile eine Ersatzzeichenfolge ist.
Fügen Sie die Initiale
Ii
an das Ende der Eingabe an.Das Backtick trennt die Bühne von den Optionen. Das Optionszeichen
(
gibt an, dass diese Stufe der Beginn einer Schleife von Stufen ist, die wiederholt ausgeführt werden müssen, bis ein vollständiger Zyklus abgeschlossen ist, ohne die Eingabe zu ändern. Da diese offene Klammer niemals geschlossen wird, sind alle verbleibenden Stufen Teil dieser Schleife.Die eigentliche Phase ist sehr einfach: Wenn das erste Zeichen der Zeichenfolge eine neue Zeile ist, löschen Sie sie. Dies dient nur dazu, die Handhabung der leeren Eingabe zu vereinfachen, andernfalls wäre es besser, sie zu den beiden letzten Stufen hinzuzufügen.
Hier
s
bewirkt die Option, dass das Regex-Metazeichen.
mit den Zeilenumbrüchen übereinstimmt. Diese Stufe bewirkt, dass ein>
Lead demI
gefolgt von einem optionalen Leerzeichen entspricht. Dann wird diese Übereinstimmung durch das Zeug nach dem ersetzt>
, gefolgt von dem optionalen Leerzeichen (also der leeren Zeichenfolge, wenn das Leerzeichen nicht übereinstimmen konnte) und dann demI
.Diese Phase ist der vorherigen sehr ähnlich, nur das optionale Leerzeichen befindet sich vor dem
I
, und die Reihenfolge und das Auge sind vertauscht.Die Handhabung
i
ist tatsächlich oftmals einfacher, da wir uns nicht um das optionale Hinzufügen oder Entfernen kümmern müssen, dai
immer nach rechts gewechselt werden kann. Für diei
Fälle stimmen wir sowohl den Unterstrich als auch das Größer / Kleiner-Zeichen ab, machen aber ansonsten eine ähnliche Logik. Dieser fügt ein Leerzeichen vor dem eini
.Ähnlich wie oben, löscht jedoch das Zeichen vor dem Zeichen,
i
wenn es sich um ein Leerzeichen handelt. Andernfalls wird nur das Emoticon entfernt.quelle
s`^_>(.*)i( |$)?
=>s`^_>(.*)i
und dessen Ersetzung$1$#2$* i
=>$1 i
unds`^_<(.*?)( )?i
=>s`^_<(.*?) ?i
und dessen Ersetzung$1i$2
=>$1i
.Python,
142141134122121 BytesDank xnor 19 Bytes gespart.
Beispiel:
Erläuterung:
quelle
i
immer größer bleiben alsI
?I
, Punkte, in einer Zeichenfolge verketteni
, ohne dass Listen und Verknüpfungen erforderlich sind.GNU sed, 81 Bytes
(einschließlich +1 für
-r
Flagge)Dadurch wird aus der Eingabe ein neues sed-Programm erstellt (das durch Entfernen der letzten Zeile angezeigt wird) und auf den Startstatus angewendet
Ii
.Erläuterung
<
und>
ersetzen Befehle, die nachI
links bzw. rechts verschoben werden._
zu arbeiteni
und nichtI
i
wird nicht durch eine rechte Kante begrenzt, fügen Sie also keinen darauf folgenden Platz hinzu oder belegen Sie ihn nichtIi
.s///e
wird immer/bin/sh
als Shell verwendet, daher konnte ich dies nicht so verkürzen,sed '&'<<<Ii
wie ich wollte (das ist eine Bash-Umleitungssyntax).Testergebnisse
quelle
Javascript (ES6)
176 171 168 155 148 147 142141 BytesVerwendungszweck
Degolfed (v6, v7 ist nicht viel anders)
quelle
=>{ ... }
könnte man einen Ausdruck machen und ziemlich viele BytesMATL ,
5655504947 BytesProbieren Sie es online!
quelle
Retina,
91-86BytesIch habe wahrscheinlich nicht die beste Herangehensweise gewählt, also kann man wahrscheinlich mehr Golf spielen. Und nein, ich habe FryAmTheEggman nicht kopiert (ich weiß, dass sie in unseren Ansätzen wirklich ähnlich sind). Ich habe seine Antwort erst gesehen, nachdem ich meine gepostet hatte.
Probieren Sie es online aus
quelle
( |)
Zeile am Ende der letzten Übereinstimmung, da danach kein Leerzeichen mehr vorhanden isti
. Auch in der letzten Match-Zeile brauchen Sie keine schließende Klammer für die Schleife. Die nicht geschlossene Schleife wird am Ende der Datei in Retina automatisch geschlossen.i
und etwas danach ersetzen lassen. Ich habe vergessen, diese zu ändern.Javascript (ES6) 166 Bytes
Mit der Antwort von Charlie Wynn konnte ich 10 Bytes einsparen, indem ich Math.max als M definierte und jedes Mal M aufrief, wenn sein Skript verwendet wurde
(Ich habe diesen Golf nicht geschrieben, Charlie Wynn hier . Ich habe ihn nur modifiziert, um ihn kürzer zu machen.)
quelle
SyntaxError: missing : in conditional expression
Firefox auf. Du könntest es mit beheben_=>{I=0,i=1,M=Math.max;_.split` `.map(m=>(I=(m=m.split`_`)[0]=='<'?M(0,I-1):M(i-1,I+1))+(i=m[1]=='<'?M(I+1,i-1):i+1));(a=Array(i).fill`.`)[I]='I';return a.join``+'i'}
, das genau die gleiche Größe hat.JavaScript (ES6), 115
118Edit: 3 Bytes gespeichert dank CharlieWynn
p
ist die Anzahl der Leerzeichen vorI
;q
ist die Anzahl der Leerzeichen zwischenI
undi
. Beides kann nicht negativ sein.Weniger golfen
Prüfung
quelle
Retina,
61-58Bytes3 Bytes gespart dank @FryAmTheEggman.
Erklärung kommt etwas später.
Probieren Sie es online!
Geänderter Code mit Chargentest.
quelle
Python 2,
9692 BytesZiemlich zwielichtig aussehende Lösung für eine zwielichtige Herausforderung. Eingabe wie
f('>_> <_>')
, Ausgabe wie'I i'
.Überprüfungsprogramm (unter
tests
der Annahme, dass es sich um die mehrzeilige Testfallzeichenfolge handelt):Das Programm liest jeden Pfeil einzeln, beginnend mit
I=1, i=2
und unter Verwendung von 1-basierten Indizes. Die Variablennamen sind ein bisschen irreführend, da sie die Rollen tauschen - nach jedem ZeichenI
wirdi
undi
wirdI
aktualisiert. Ein Zeichen wird nur aktualisiert, wenn es sich weder an die Position des anderen Zeichens noch an die Position 0 bewegen würde.Zum Beispiel machen
>_> <_> >_<
wir:Dies gibt
' Ii'
wie gewünscht.quelle
Lua, 104 Bytes
Verwendungszweck:
quelle
Javascript (ES5),
153 bis125 ByteNimmt eine Eingabe durch Setzen einer Variablen
a
vor dem AusführenEtwas ungolfed:
quelle
Mathematica, 125 Bytes
Reine Funktion mit erstem Argument
#
. Die Idee ist , dass jeder<_
,>_
,<
, und>
in dem Eingang entspricht einen String Ersetzungsregel."<_"|">_"|">"|"<"
ist ein Zeichenfolgenmuster, das mit einem dieser vier Ausdrücke übereinstimmt.StringCases[#,"<_"|">_"|">"|"<"]
findet alle diese Übereinstimmungen. Dann ersetzen wir (/.
) jeweils"<_"
durch die String-Ersetzungsregel".I"->"I."
, jede">_"
durch die Regel"I."->".I"
und so weiter. Dann möchte ich nacheinander jede Ersetzungsregel auf die Zeichenfolge anwenden"Ii"
,StringReplace
suche jedoch nur nach Übereinstimmungen in den Teilen der Zeichenfolge, die nicht ersetzt wurden. Daher haben wirFold
die FunktionStringReplace
über der Liste der Ersetzungsregeln mit dem Startwert belassen"Ii"
.Vielleicht wäre es mit einem Beispiel klarer (
%
bezieht sich hier auf die Ausgabe der vorherigen Zelle):quelle