Verwenden Sie eine Programmiersprache, die Funktionen unterstützt
is_enough(strArr)
das take, strArr
das ein Array sein wird, das aus den folgenden Elementen besteht:
N
Dies ist die Anzahl der Tankstellen auf einer Kreisstrecke- und jedes nachfolgende Element wird die Zeichenfolge sein,
g:c
in derg
ist die Gasmenge in Gallonen an dieser Tankstelle undc
wird die Menge an Gallonen Gas sein, die benötigt wird, um zur folgenden Tankstelle zu gelangen.
Zum Beispiel strArr
kann sein:
["4","3:1","2:2","1:2","0:1"].
Ihr Ziel ist es, den Index der Starttankstelle zurückzugeben, mit dem Sie die gesamte Route einmal umrunden können. Andernfalls geben Sie die Zeichenfolge "unmöglich" zurück .
Für das obige Beispiel gibt es 4 Tankstellen, und Ihr Programm sollte die Zeichenfolge "1" zurückgeben, weil:
Ab Station 1 erhalten Sie 3 Gallonen Benzin und geben 1 für die nächste Station aus.
Dann haben Sie 2 Gallonen + 2 mehr an der nächsten Station und Sie geben 2 aus, so dass Sie 2 Gallonen haben, wenn Sie zur 3. Station kommen.
Sie haben dann 3, aber Sie verbringen 2 damit , zur Endstation zu gelangen.
An der Endstation erhalten Sie 0 Gallonen und geben Ihre letzte Gallone aus, um zu Ihrem Ausgangspunkt zu gelangen.
Das Starten an einer anderen Tankstelle würde es unmöglich machen, die Route zu umgehen, daher lautet die Antwort "1" .
Wenn es mehrere Tankstellen gibt, an denen begonnen werden kann, geben Sie den kleinsten Index (der Tankstelle) zurück. N
wird sein >= 2
.
Richtige Beispielausgaben:
Input: ["4","1:1","2:2","1:2","0:1"]
Output: "impossible"
Input: ["4","0:1","2:2","1:2","3:1"]
Output: "4"
Der Gewinner ist derjenige, der den kürzesten Code verwendet, obwohl er lang sein wird.
N+1
Elemente instrArr
? Dies würdeN
überflüssig machen, falls die Sprache bereits eine Möglichkeit bietet, die Länge des Arrays zu ermitteln, oder? (Es wäre immer noch nützlich für zB C.)is_enough
(9 Zeichen). Drei verwenden einen Namen mit einem Zeichen, und einer benennt die Funktion überhaupt nicht. Könnten Sie bitte klarstellen, was zulässig ist?Antworten:
APL (70)
Erläuterung:
1↓⍵
: Lass das erste Element (Länge) fallen, wir brauchen es nicht{
...}¨
: für jede Tankstelle ...⎕ML←3
:⎕ML
innerhalb der inneren Funktion auf 3 gesetzt (ändert das Verhalten von⊂
)⍵⊂⍨⍵≠':'
: Teilen Sie die Zeichenfolge auf:
⍎¨
: bewerten Sie jedes Teil-/
: subtrahiere die zweite Zahl von der ersten (was einen Nettoeffekt für jede Tankstelle ergibt)K←
: Speichern Sie sie in K.Z←⍳⍴K
: Holen Sie sich die Indizes für die Tankstelle (1
auf Länge vonK
), speichern Sie inZ
⌽∘K¨Z
: umK
jeden Wert von drehenZ
, wodurch ein Array von Arrays erhalten wird¯1⌽
: Drehen Sie dieses Array um 1 nach links (um das unveränderte zuerst statt zuletzt zu setzen).+\¨
: Machen Sie eine laufende Summe für jedes innere Array0∧.≤¨
: Überprüfen Sie für jede laufende Summe, ob negative Werte vorhanden sindZ/⍨
: Wählen Sie ausZ
den Elementen aus, für die die laufende Summe keine negativen Werte hatte×⍴G←
: speichern inG
. WennG
irgendwelche Elemente hat::⊃G
: gibt das erste Element von zurückG
.⋄'impossible'
: Andernfalls kehren Sie zurückimpossible
.quelle
Bash
178170161157Eher geradlinig.
Abstand:
quelle
Ruby, 111
Hier ist eine Ruby-Lösung mit
eval
:Anwendungsbeispiel:
BEARBEITEN : Funktionsname und Rückgabetyp korrigiert.
quelle
Rubin 132
Prüfung:
quelle
Python, 131
Ich finde diesen Einzeiler ziemlich befriedigend.
quelle
reduce()
hier Ich erhalte eine FehlermeldungNameError: name 'reduce' is not defined
reduce
befindet sich noch in der Standardbibliothek, aber es wurde in dasfunctools
Modul verschoben .from functools import reduce
danke bekommen`i`
hierstr(i)
Python 3.GolfScript (72 Zeichen)
Online-Demo
Dies führt den offensichtlichen Brute-Force-Ansatz durch. Das interessanteste Bit IMO ist die Bestimmung, ob die Teilsummen einer Anordnung von Delta-Kraftstoff jemals unter 0 fallen:
Dies spart 1 Zeichen gegenüber dem offensichtlicheren
Wenn die Ausgabe bei 0 anstatt bei 1 indiziert wäre, wäre ein alternativer Ansatz zum Drehen des Arrays vorzuziehen:
Dieser Ansatz lässt sich jedoch nicht leicht auf die Indizierung bei 1 anwenden:
oder
quelle