Dies ist die zweite in einer Reihe, die dritte ist Zwei Straßen in einem gelben Wald auseinander (Teil 3)
Dies basiert auf zwei Straßen, die in einem gelben Wald auseinander laufen (Teil 1) , eine frühere Herausforderung von mir. Es wurde ziemlich gut angenommen, aber es war auch ziemlich trivial (eine Java-Antwort in 52 Bytes!) Also habe ich etwas komplexeres gemacht ...
Die Inspiration
Diese Herausforderung ist von Robert Frosts berühmtem Gedicht "The Road Not Taken" inspiriert:
Zwei Straßen gingen in einem gelben Wald auseinander.
Tut mir leid, dass ich nicht beide fahren konnte.
Und ich war ein Reisender, lange stand ich da
und schaute einen herunter, so weit ich konnte
.... 2 Absätze gekürzt ...
Ich werde das mit einem Seufzer erzählen.
Irgendwo in Ewigkeit:
Zwei Straßen gingen in einem Wald auseinander, und ich -
ich nahm den weniger befahrenen,
und das hat den Unterschied ausgemacht.
Beachten Sie die vorletzte Zeile I took the one less traveled by,
. Ihr Ziel ist es, die am wenigsten befahrene Straße in Ihrer Zeichenfolge zu finden. Sie müssen einen von 2 Werten ausgeben, die sich voneinander unterscheiden und angeben, in welche Richtung Sie abbiegen sollen, um die Straße zu nehmen, auf der weniger Verkehr herrscht. Sobald sich die Straße gabelt (die Spur der Sechsecke ändert sich in Zahlen), sind Sie an der Kreuzung. Von dort aus gibt es 2 Pfade, die aus Ziffern bestehen. Der Pfad, dessen Ziffern die niedrigste Summe haben, ist die Straße, die nicht genommen wurde. Beachten Sie, dass die nicht genommene Straße möglicherweise einen größeren Pfad hat, aber eine geringere Pfadsumme. Hier sind einige Beispiele / Testfälle aus einem Programm, das "left" oder "right" für den nicht genommenen Pfad ausgibt:
1 2
1 2
1 2
#
#
#
left (3 < 6)
1 2
2 2
1 1
#
#
#
left (4 < 5)
12 2
11 2
1 1
#
#
#
right (6 > 5)
99 989
99 89
99 99
99 99
#
#
#
#
left (72 < 79)
1111 1110
001 111
11 11
11 11
#
##
##
##
left (9 < 10) (Note: 1111 is interpreted as 1+1+1+1=4, not 1111=1111)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
1 1
0 1
1 1
1 1
1 1
1 1
1 1
#
#
#
#
#
left (6 < 7)
Dinge, die anzunehmen und zu erinnern sind
- Es wird immer 2 Wege geben. Nicht mehr und nicht weniger.
- Sie können zeilenweise eine Eingabe von STDIN, eine Zeichenfolge mit LF-Zeichen oder eine Zeichenfolge mit einem literalen Backslash und einem n übernehmen. Wenn Sie auf andere Weise Eingaben benötigen, bitten Sie in den Kommentaren um Zustimmung.
- Sie müssen sich keine Gedanken über ungültige Eingaben oder verknüpfte Pfade machen. Diese werden niemals in Ihr Programm / Ihre Funktion eingegeben.
- Die Eingabe kann eine beliebige Länge in Breite oder Höhe haben, die unter der Zeichenfolgenbeschränkung Ihrer Sprache liegt.
- Es wird niemals eine
#
und eine Zahl in derselben Zeile geben. - Alle Ziffern im Pfad sind positive ganze Zahlen von 0 bis 9.
- Die Eingabe oder Ausgabe mit einem nachgestellten Zeilenumbruch ist zulässig.
- Siehe meine JS ES6 Antwort unten für ein Beispiel.
- Es wird immer mindestens 1 Leerzeichen zwischen den beiden Pfaden geben.
- Die beiden Pfade haben immer die gleiche Höhe für jede Karte, können jedoch auf anderen Karten unterschiedlich sein.
- Wenn Sie über einen bestimmten Testfall verwirrt sind, teilen Sie mir dies bitte mit.
- 1111 wird als 1 + 1 + 1 + 1 = 4 interpretiert, nicht als 1111 = 1111. Die Karte besteht aus einer Reihe von einstelligen Zahlen, nicht aus Zahlen beliebiger Länge.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
- Standardlücken verboten
Wenn Sie Fragen zu dieser Herausforderung haben, fragen Sie mich in den Kommentaren und viel Glück!
quelle
$("div > h1").map(function(){return $(this).text()}).get().join("\n");
in Ihre Konsole einfügen!let answers = $('div > h1').map(function(){return $(this).clone().children(':not(a)').remove().end().text().replace(/\s+/g,' ').trim()}).get();answers.splice(0, 1);answers.join('\n');
Antworten:
05AB1E ,
2115 BytesAusgänge 0 für links und 1 für rechts.
Probieren Sie es online!
Erläuterung
quelle
Retina , 28 Bytes
Probieren Sie es online!
Druckt
0
für links und1
rechts. Es wird davon ausgegangen, dass in den Zeilen keine Leerzeichen nachgestellt sind.Erläuterung
Wandle jede Ziffer
N
in eine Folge vonN
Einsen um.Jeweils eine Zeile (
%
), die aufeinanderfolgenden (\G
) vom Ende (r
) abgleichen und durch jeweils ersetzen-
(dh den rechten Zweig in-
s umwandeln ).Sortieren Sie alle Zeichen so, dass alle
-
s direkt vor allen1
s stehen.Brechen Sie ein Paar von
-
und wiederholt ab1
.Versuchen Sie, mindestens eine zu finden
1
(wenn ja, befanden sich mehr Gewichte im linken Pfad).quelle
Python 2 ,
95898887 BytesHier ist mein erster Versuch in Python. Auf jeden Fall nicht optimal, aber ein ordentlicher Start.
Probieren Sie es online!
quelle
"#"!=y
mit"#"<y
Chip , 216 Bytes
Probieren Sie es online!
Ein bisschen größer als die Antwort für Teil 1 ...
Überblick
Chip ist eine 2D-Sprache, die von der tatsächlichen Schaltung inspiriert ist und sich mit den Komponentenbits jedes Bytes in einem Bytestrom befasst.
Bei dieser Lösung wird eine fortlaufende Summe der angezeigten Ziffern beibehalten, wobei das Vorzeichen der Eingabe jedes Mal umgedreht wird, wenn eine Whitespace-Strecke auftritt, und dann bei der ersten beendet wird
#
. Also zur EingabeWir bekommen
1 + 1 - 1 - 2 + 2 - 2 + 1 - 1 = -1
. Das Vorzeichen des Ergebnisses wird als Ausgabe angegeben, eine negative Zahl ergibt das Ergebnis1
und eine positive ist0
.Daher
1
bedeutet Ausgabe von , dass der linke Pfad weniger belegt ist, und0
bedeutet rechts.Erläuterung
Auf hohem Niveau funktioniert das so:
Die Hauptdiagonale mit den
@
Elementen ist der Akkumulator, über die Leistung wirda
unten entschieden. (Acht Paare@
bedeuten acht Bits, aber das höchste Bit ist das Vorzeichen, sodass diese Lösung eine maximale Differenz von +127 oder -128 verarbeiten kann. Ein teilweises Überlaufen ist in Ordnung, solange wir vor dem Beenden zurückkommen.)Die vier Zeilen, die wie
Ax]}#--
folgt beginnen, lesen die Eingabe und negieren sie bei einer Ziffer (falls erforderlich) und geben den Wert an die Addierer weiter.Die ersten drei Zeilen entscheiden, ob wir eine Ziffer oder eine Folge von Leerzeichen betrachten und verfolgen, ob die Ziffern negiert werden müssen.
Die verbleibenden Elemente, die unter den Eingaben und den Elementen ganz rechts eingeklemmt sind, behandeln die Beendigungsbedingung und ordnen die Ausgabe ASCII zu (sodass wir Zeichen
'0'
oder'1'
anstelle von Werten0x0
oder0x1
. Diese ASCII-Zuordnung erfordert keine zusätzlichen Bytes, sonst würde ich nicht habe es aufgenommen.)quelle
JavaScript (ES6), 55 Byte
Angenommen, in jeder Zeile sind keine nachgestellten Leerzeichen und Ausgaben
true
fürright
,false
fürleft
. Der Trick besteht darin, jede Ziffer in der Eingabe abzugleichen. Wenn sich in derselben Zeile ein Leerzeichen dahinter befindet, subtrahieren Sie es von der Summe. Andernfalls addieren Sie es zur Summe. Wenn die Endsumme kleiner als 0 ist, ist die richtige Straße diejenige, auf der weniger gefahren wird, und umgekehrt.Versuch es:
quelle
x=
am Anfang setzen, da Ausdrücke nicht erlaubt sind, nur Funktionen, die als Variable und ganze Programme gespeichert sind.Python 3 ,
8594 BytesProbieren Sie es online!
Flüche! Ich habe das Problem nicht nah genug gelesen. Das Update (
''.join()
) wurde hinzugefügt , allerdings auf Kosten von 9 Bytes.quelle
Python 2, 78 Bytes
-1 Byte danke an @math_junkie
Probieren Sie es online aus
Druckt
False
für den linken und denTrue
rechten Pfadquelle
r=-r
stattr*=-1
sollte ein Byte speichernRetina , 180 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Ich dachte, ich würde auch eine regex-only-Lösung ausprobieren (die obige ist eine reine .NET-Regex, die nur Eingaben entspricht, bei denen der richtige Weg eingeschlagen werden sollte, außer
¶
als Abkürzung für\n
).Es ist ärgerlich, sich zu wiederholen, aber genau das passiert, wenn Sie jede mögliche Ziffer einzeln behandeln müssen.
Die Lösung ist eine recht einfache Anwendung von Bilanzkreisen : Zuerst addieren wir die Ziffern im linken Zweig, indem wir die
N
Captures3
für jede Ziffer auf den Stapel schiebenN
. Dann versuchen wir das zu erreichen#
, indem wir3
N
für jede ZifferN
im rechten Zweig von den Stapelzeiten abspringen . Dies ist nur möglich, wenn die Summe der Ziffern im linken Zweig größer ist als die im rechten Zweig (da Sie nicht von einem leeren Stapel abspringen können).quelle
[0-9]
um alle Ziffern abzugleichen, oder\d
?JavaScript (ES6),
106104 Bytes
ist eine Funktion, die zurückkehrt,true
wenn sich die nicht genommene Straße auf der linken Seite befindet. Ungolfed:quelle
PowerShell , 80 Byte
Probieren Sie es online!
(Quietscht nur unter den Python-Antworten.: D)
Ausgänge
True
für den linken undFalse
den rechten Pfad.Nimmt Eingaben als Zeichenfolge an
`n
, die als PowerShell-Entsprechung von "Zeichenfolge mit einem wörtlichen Backslash und einem n" oder als wörtliche mehrzeilige Zeichenfolge definiert ist. Wir schalten dann-split
diese Eingabe ein\s
(Leerzeichen inklusive Zeilenumbrüche) oder#
und filtern alle leeren Ergebnisse heraus-ne''
, so dass wir nur ein Array der Ziffern übrig haben. Diese werden in eine Schleife eingespeist|%{...}
.Bei jeder Iteration nehmen wir zuerst das aktuelle Element
$_
, wandeln es alschar
Array-join
mit einem Pluszeichen um+
und leiten es aniex
(kurz fürInvoke-Expression
und ähnlich füreval
). Das ist in gespeichert,$i
so dass wir die Ziffern auf diesem bestimmten Abschnitt des Pfades richtig zusammenfassen. Wir verwenden dann dieses und sein Negativ als die beiden Elemente eines Arrays($i, -$i)
, in das durch Hin- und Herschalten eines Booleschen Werts indiziert wird. Das heißt, die erste Iteration durch diese Schleife, der erste linke Pfadabschnitt, in den wir indexieren-$i
; das nächste Mal werden wir nehmen$i
; und so weiter. Die werden in$a
mit angesammelt+=
.Schließlich bewerten wir , ob
$a
ist-g
rößeret
han0
. Wenn ja, dann hatte der rechte Pfad eine größere Summe, andernfalls hatte der linke Pfad eine größere Summe. Dieses boolesche Ergebnis verbleibt in der Pipeline, und die Ausgabe ist implizit.quelle
CJam ,
1918 BytesProbieren Sie es online!
Drucke
0
für links und1
rechts.Erläuterung
quelle
Mathematica,
8077 BytesVielen Dank an Martin Ender für das Speichern von 3 Bytes!
Reine Funktion, die eine durch Zeilenumbrüche getrennte Zeichenfolge als Eingabe verwendet und zurückkehrt
True
, um den linkenFalse
und den rechten Pfad zu verwenden. Verdammt diese langen Mathematica-Befehlsnamen; Das ist wie 10 Token.quelle
Pip ,
1918 BytesNimmt Eingaben als einzelne Zeichenfolge in die Befehlszeile auf (wobei Zeilenumbrüche in Anführungszeichen gesetzt und maskiert werden müssen, wenn sie in einer tatsächlichen Befehlszeile ausgeführt werden). Ausgänge
-1
für links,1
für rechts.Probieren Sie es online!Erläuterung
Schleifen über Ziffernläufe und Addieren der Ziffernsummen zu einer Zählung. Das Vorzeichen der Zählung wird jedes Mal gewechselt, mit dem Ergebnis, dass die Werte für die linke Hand negativ und die Werte für die rechte Hand positiv sind. Dann drucken wir das Vorzeichen der Schlusszählung (
-1
oder1
).quelle
Haskell , 64 Bytes
Probieren Sie es online! Verwendung: Die anonyme Funktion verwendet
(>0).f.words
eine durch Zeilenumbrüche getrennte Zeichenfolge als Argument und gibtFalse
links undTrue
rechts zurück.Erläuterung:
Bei einer Eingabe
dass der String ist
" 99 989\n 99 89\n 99 99\n #\n #\n #"
, dannwords
entfernt alle Zeilenumbrüche und Leerzeichen und gibt eine Liste der übrigen Strings:["99","989","99","89","99","99","#","#","#"]
. Die Funktionf
nimmt die ersten beiden Elementea
undb
aus dieser Liste und überprüft , oba
eine Folge von Ziffern ist , indem es die Zeichenfolge „#“ zu vergleichen. (Da das'#'
Zeichen kleiner ist als alle Ziffernzeichen'0'
,'1'
... ist jede Zeichenfolge, die mit einer Ziffer beginnt, lexikografisch größer als"#"
.) Die Funktiong
ordnet jedes Zeichen in einer Zeichenfolge seinem ASCII-Zeichencode zu und gibt ihre Summe zurück. Inf
wenden wirg
aufa
undb
und berechneng a - g b
, dass der Wert des linken Pfads minus dem Wert des rechten Pfads ist, und fügen ihn einem rekursiven Aufruf von hinzuf
um die folgenden Zeilen zu behandeln. Wenn der linke Pfad weiter zurückgelegt wird, ist das Ergebnis vonf
negativ und ansonsten positiv für den rechten Pfad.(>0)
Überprüfen Sie daher , ob das Ergebnis größer als Null ist.quelle
Python 3 , 84 Bytes
Da alle aktuellen Python-Einreichungen Funktionen sind, dachte ich, ich würde ein volles Programm beitragen.
True
Wird gedruckt, wenn der linke Pfad weniger zurückgelegt istFalse
. Probieren Sie es online!Für jede Eingabezeile wird das Leerzeichen aufgeteilt, die Ziffern jedes resultierenden Elements werden summiert und zu einer Liste hinzugefügt, während bei jedem Schritt das Vorzeichen der Liste umgedreht wird. Es liest so lange Eingabezeilen, bis es eine mit einem trifft
#
. An diesem Punkt wirdmap(int,n)
eine Ausnahme ausgelöst und die Schleife verlassen. Dabei wird gedruckt,True
ob die Zählung positiv ist undFalse
ansonsten.quelle
Stapel, 169 Bytes
Druckt
0
für links,-1
für rechts. Hinweis: Liest Zeilen, bis eine mit einem gefunden wird#
, und beendet dann das Lesen. Die Differenz der Pfadsummen ist auf 511 begrenzt (1 Byte hinzufügen, um größere Unterschiede zu unterstützen). Nicht mehr als 9 Stellen in jeder Zeile jedes Pfads (unterstützt eine beliebige Anzahl von Zeilen). Erläuterung: Died
Unterroutine akzeptiert zwei Parameter: Addieren oder Subtrahieren und die Ziffer (n). Es extrahiert die letzte Ziffer durch Modulo durch 10 und die verbleibenden Ziffern durch Teilen durch 10 und ruft sich selbst rekursiv auf, solange noch Ziffern übrig sind. Diec
Unterroutine verwendet drei Parameter: ob addiert oder subtrahiert werden soll, welche Ziffern addiert oder subtrahiert werden sollen und welche weiteren Ziffern addiert werden sollen. Es ruft died
Subroutine zur Behandlung der zu addierenden Ziffern und durchläuft dann die ersten beiden Parameter. Dies bedeutet, dass der Aufruf desc
Unterprogramms mit den Parametern-
und den linken und rechten Ziffern die rechten Ziffern addiert und die linken Ziffern subtrahiert. Schließlich wird das Ergebnis verschoben, um das Vorzeichen zu extrahieren.quelle
Oktave, 46 Bytes
Probieren Sie es online! Eine Funktion, die ein 2D-Zeichenarray
a
als Eingabe verwendet.Erläuterung:
quelle
Java 7,
219216 BytesDiesmal etwas länger als 52 Bytes . ;)
Und kehrt wieder nach
false
rechts undtrue
nach links zurück.Erläuterung:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle