Sagen Sie mir bei einer ascii-art Straße und der Zeit, die ich brauchte, um sie zu überqueren, ob ich beschleunigt habe.
Einheiten
Entfernung ist in der willkürlichen Einheit von d
. Die Zeit ist in der willkürlichen Einheit von t
.
Die Straße
Hier ist eine einfache Straße:
10=====
Das 10
bedeutet 10 d
per t
. Das ist das Tempolimit für die Straße. Die Straße hat 5 =
s, also d
ist es 5. Wenn ich diese Straße in 0,5 überquere t
, bin ich 10 d
pro gefahren t
, weil 5 / 0,5 = 10. Das Tempolimit dieser Straße ist 10, also bin ich innerhalb des Tempolimits geblieben.
Aber wenn ich diese Straße in 0,25 überquere t
, habe ich 20 d
pro gefahren t
, weil 5 / 0,25 = 20. Das Tempolimit dieser Straße ist 10, also bin ich 10 über das Tempolimit gefahren.
Beispiele und Berechnungen
Beachten Sie, dass Eingabe 1 die Zeit ist, die ich zum Befahren der Straße benötigt habe, und Eingabe 2 die Straße selbst ist.
Hier ist eine komplexe Straße:
Input 1: 1.5
Input 2: 5=====10=====
Die schnellste, die ich (legal) auf der ersten Straße hätte fahren können (die ersten 5 =
s), ist 5 d
per t
. Da 5 (Distanz) geteilt durch 5 (Geschwindigkeitsbegrenzung) 1 ist, ist die schnellste, die ich auf dieser Straße hätte fahren können, 1 t
.
Auf der nächsten Straße ist das Tempolimit 10 und die Distanz 5, die schnellste, die ich überqueren konnte, ist 0,5 (5/10). Die Summe der Mindestzeiten ergibt 1,5, was bedeutet, dass ich genau das Tempolimit erreicht habe.
Hinweis: Ich weiß, dass ich auf einer Straße sehr schnell und auf einer anderen sehr langsam gefahren bin und immer noch die 1,5 überquert habe, aber nehme hier das Beste an.
Ein letztes Beispiel:
Input 1: 3.2
Input 2: 3.0==========20===
Die erste Straße ist 10 km lang und hat ein Tempolimit von 3, die Mindestzeit beträgt also 3.33333 ... (10 / 3.)
Die zweite Straße ist 3 lang und hat ein Tempolimit von 20, die Mindestzeit beträgt also 0,15 (3/20).
Die Summe der Zeiten ergibt 3.483333333 ... Ich habe es in 3.2 überschritten, also musste ich irgendwo beschleunigen.
Anmerkungen:
- Sie müssen einen eindeutigen Wert ausgeben, wenn ich zweifellos beschleunige, und einen anderen Wert, wenn ich nicht beschleunige.
- Für Ihr Programm oder Ihre Funktion ist möglicherweise eine Eingabe oder Ausgabe erforderlich, um einen nachgestellten Zeilenumbruch zu erhalten.
- Ihre erste Eingabe wird meine Geschwindigkeit sein. Es wird ein positiver Gleitkommawert oder eine Ganzzahl oder eine Zeichenfolge sein.
- Ihre zweite Eingabe wird die Straße sein. Es wird immer mit dem regulären Ausdruck übereinstimmen
^(([1-9]+[0-9]*|[0-9]+\.[0-9]+)=+)+\n?$
. Bei Interesse können Sie hier mögliche Eingaben testen. - Sie können 2 Parameter einer Funktion oder eines Programms in 2 separaten Dateien, zweimal aus STDIN oder aus einer durch Leerzeichen getrennten Zeichenfolge, die an STDIN übergeben wird, einer Funktion, einer Datei oder einem Befehlszeilenparameter eingeben.
- Wenn Sie möchten, können Sie die Reihenfolge der Eingaben ändern.
- Irgendwelche Fragen? Fragen Sie unten in Kommentaren und glücklich Code- Golfing!
^(([1-9]+[0-9]*|(?!0\.0+\b)[0-9]+\.[0-9]+)=+)+\n?$
. (Es wäre sauberer mit einem Lookbehind gewesen, aber dann würde es .NET-Engine benötigen)Antworten:
05AB1E ,
2422 BytesGibt 1 zurück, wenn zweifellos zu schnell gefahren wird, und 0, wenn nicht.
2 Bytes dank Carusocomputing gespart .
Probieren Sie es online!
-§'-å
weder sollte nicht mehr als ein einfacher Vergleich sein müssen, aber aus irgendeinem Grunde›
noch‹
scheint Arbeit zwischen dem berechneten Wert und dem zweiten Eingang.Erläuterung
Unter Verwendung
3.0==========20===, 3.2
als Beispielquelle
'=¡õK¹S'=QJ0¡õK€g/O-0.S
für 23 Bytes.S
funktioniert, OK. Das gibt jedoch keine 2 eindeutigen Werte zurück, da es 0 zurückgibt, wenn Sie genau das Tempolimit erreicht haben.a > b
Operator setzt vor dem Vergleich zwischen float und int eine Ganzzahl um. Es ist sehr merkwürdig , ja ... ich es bekommen hätte , obwohl zu 22 Byte nach unten:'=¡€Þ¹S'=Q.¡O0K/O-§'-å
.g>s/
} O-§'-å bei 23 mit 2 Rückgabewerten gekürzt werden. Vielleicht gibt es dort noch einiges zu verbessern? Ich sehe aber nicht was. Dieser letzte Vergleich bringt uns echt durcheinander.Python 2 , 71 Bytes
Probieren Sie es online!
Pythons dynamisches Typensystem kann ziemlich viel Missbrauch vertragen.
Aufspalten des Eingabestring
s.split('=')
drehtk
Gleichheitszeichen ink-1
leeren Zeichenfolge Listenelemente (außer am Ende, wo man abgeschnitten werden muss). Beispielsweise,Der Code durchläuft diese Elemente und aktualisiert die aktuelle Geschwindigkeit
s
jedes Mal, wenn eine Zahl angezeigt wird. Das Update erfolgt wies=float(c or s)
, wo , wennc
eine nicht leere Zeichenfolge ist, erhalten wirfloat(c)
und sonstc or s
ausgewertets
, wofloat(s)
gerade hälts
. Beachten Sie, dassc
es sich um eine Zeichenfolge unds
eine Zahl handelt, für Python jedoch keine einheitlichen Eingabetypen erforderlich sindfloat
.Beachten Sie auch, dass die Variable, in
s
der die Geschwindigkeit gespeichert ist , mit der Variable identisch ist, die die Eingabezeichenfolge verwendet. Die Zeichenfolge wird ausgewertet, wenn die Schleife beginnt. Wenn Sie sie innerhalb der Schleife ändern, ändert sich auch nicht, worüber iteriert wird. Dieselbe Variable kann also zum Speichern einer Initialisierung wiederverwendet werden. Die erste Schleife hat immerc
eine Zahl, daher ists=float(c or s)
dies
ursprüngliche Rolle der Schleife als Zeichenfolge unerheblich.Bei jeder Iteration wird die aktuelle Geschwindigkeit von der zulässigen Geschwindigkeit abgezogen, die als Geschwindigkeitsbegrenzung beginnt. Am Ende wurde das Tempolimit verletzt, wenn dieses unterschritten wird
0
.quelle
Python 3 , 79 Bytes
Probieren Sie es online!
Beispielsweise wird die Eingabe
3.0==========20===
in die Zeichenfolge konvertiertausgewertet und das Ergebnis mit der Eingangsgeschwindigkeit verglichen. Jedes
-~
erhöht sich um1
. Ich bin neu in Regexes, also gibt es vielleicht einen besseren Weg, als beide Substitutionen gleichzeitig zu machen. Vielen Dank an Jonathan Allan für den Hinweis, wie alles außer dem=
Charakter zusammenpassen soll.quelle
"0.5=20==="
, erfolgt die AusgabeNone
unabhängig von der eingegebenen Zeit.([\d|.]+)
kann es beheben.Javascript (ES6), 63 Byte
Verwendung
Weisen Sie diese Funktion einer Variablen zu und rufen Sie sie in der aktuellen Syntax auf. Das erste Argument ist die Zeit, das zweite ist die Straße.
Erläuterung
Stimmt mit allen aufeinanderfolgenden Zeichenfolgen überein, die keine Gleichheitszeichen sind, gefolgt von einer Folge von Gleichheitszeichen. Jede Übereinstimmung wird durch das Ergebnis der inneren Funktion ersetzt, die zwei Argumente verwendet: die Folge von Gleichheitszeichen (in Variable
d
) und die Zahl (Variablec
). Die Funktion gibt die Länge der Straße zurück, die von der Zahl abweicht, der ein + vorangestellt ist.Die resultierende Zeichenfolge wird dann ausgewertet und mit der ersten Eingabe verglichen.
Stapel-Snippet
quelle
GNU C, 128 Bytes
Behandelt auch nicht ganzzahlige Geschwindigkeitsbegrenzungen.
#import<stdlib.h>
wird benötigt, damit der Compiler nicht annimmt, dassatof()
einint
.t<s-.001
wird benötigt, um den genauen Geschwindigkeitsbegrenzungstestfall zum Laufen zu bringen, da sonst Rundungsfehler den Eindruck erwecken, dass Sie beschleunigt haben. Wenn die Zeit jetzt1.4999
statt ist1.5
, wird diese Geschwindigkeit natürlich nicht berücksichtigt. Ich hoffe das ist okay.Probieren Sie es online!
quelle
Perl 5 , 43 Bytes
42 Byte Code +
-p
Flag.Probieren Sie es online!
Für jede Gruppe von Ziffern, gefolgt von Gleichheitszeichen (
[^=]+(=+)
), berechnen wir, wie viel Zeit benötigt wird, um sie zu überqueren (Anzahl der Gleichheitszeichen geteilt durch die Geschwindigkeit:)(length$1)/$&
und addieren diese Zeiten$t
. Am Ende müssen wir nur überprüfen, ob dies$t
weniger als die Zeit ist, die Sie benötigt haben, um es zu überqueren ($_=$t < <>
). Das Ergebnis ist1
(wahr) oder nichts (falsch).quelle
Mathematica, 98 Bytes
Reine Funktion mit zwei Argumenten, einer Zahl (die eine Ganzzahl, ein Bruch, eine Dezimalzahl
π
oder eine Zahl in wissenschaftlicher Notation sein kann) und einer Zeichenfolge mit Zeilenende und Rückgabe vonTrue
oderFalse
. Beispielhafte Erklärung anhand der Eingaben3.2
und"3==========20===\n"
:#2~StringSplit~"="
produziert{"3","","","","","","","","","","20","","","\n"}
. Beachten Sie, dass die Anzahl der aufeinanderfolgenden""
s um eins niedriger ist als die Anzahl der aufeinanderfolgenden=
s in jedem Lauf.//.{z___,a_,b:Longest@""..,c__}:>{z,(Length@{b}+1)/ToExpression@a,c}
ist eine sich wiederholende Ersetzungsregel. Zuerst setzt esz
auf die leere Sequenz,a
auf"3"
,b
auf"","","","","","","","",""
(die längste Folge von""
s, die es finden konnte) undc
auf"20","","","\n"
; Der Befehl wird zu(Length@{b}+1)/ToExpression@a
ausgewertet(9+1)/3
, und das Ergebnis der Ersetzung ist die Liste{10/3, "20","","","\n"}
.Als nächstes setzt die Ersetzungsregel
z
auf10/3
,a
auf"20"
,b
auf"",""
undc
auf"\n"
. Wird nun zu(Length@{b}+1)/ToExpression@a
ausgewertet(2+1)/20
, und so ist das Ergebnis der Ersetzung{10/3, 3/20, "\n"}
. Die Ersetzungsregel kann keine andere Übereinstimmung finden, daher wird sie angehalten.Schließlich werden die Elemente der Liste
Tr[...]-"\n"
hinzugefügt (es wird ein Byte gespart, um zwischen den Anführungszeichen einen tatsächlichen Zeilenumbruch zu verwenden"\n"
)10/3 + 3/20 + "\n"
, und das wird erhalten und dann abgezogen"\n"
, was Mathematica vollkommen gerne tut. Schließlich<=#
vergleicht das Ergebnis mit dem ersten Eingang (3.2
in diesem Fall), der AusbeutenFalse
.quelle
"1+2====3.456====π=====\n"
gerade sein.Gelee , 27 Bytes
Probieren Sie es online!
Hinweis: geht davon aus, dass der Regex in der Frage gegeben sollte so sein , dass eine Geschwindigkeitsbegrenzung nicht sein kann
0.0
,0.00
usw. - so wie es nicht sein kann0
( bestätigt als unbeabsichtigte Eigenschaft).Wie?
quelle
0.0
da ich Werte herausfiltere, die wie0
im Code ausgewertet werden, um die Geschwindigkeitsbegrenzungen aufzuheben.Python 3, 90 Bytes
Ausgänge,
True
wenn Sie beschleunigen,False
wenn Sie nicht sind. Benötigt keine nachgestellte Newline (funktioniert aber damit).Obwohl es nicht so aussieht, wie es aussehen würde, behandelt es Schwebungen sowohl in der Eingabezeit als auch in den Geschwindigkeitsbegrenzungen korrekt, da die Regex nur zum Trennen der Straßensegmente verwendet wird.
quelle
MATL ,
3130 BytesEingaben sind: eine Zeichenfolge (Geschwindigkeitsbegrenzungen und Straßen), dann eine Zahl (verwendete Geschwindigkeit). Die Ausgabe erfolgt,
1
wenn zweifellos,0
wenn nicht.Probieren Sie es online!
Erklärung mit Beispiel
Betrachten Sie Eingaben
'3.0==========20==='
und3.2
.quelle
APL, 41 Bytes
Dies nimmt die Straße als String als rechtes Argument und die Zeit als linkes Argument und gibt zurück,
1
wenn Sie beschleunigt haben und0
wenn nicht, wie folgt:Erläuterung:
X←⍵='='
: InX
einem Bitvektor alle Positionen speichern⍵
, die Teil der Straße sind.X≠¯1⌽X
: Markieren Sie jede PositionX
, die nicht mit der Position des rechten Nachbarn übereinstimmt (umlaufend), und geben Sie die Positionen an, an denen Zahlen und Straßen beginnenY←⍵⊂⍨
:⍵
An diesen Positionen teilen (mit einer Reihe von abwechselnden Nummern und Strassenfolgen) und in speichernY
.Y⊂⍨2|⍳⍴Y
:Y
in aufeinanderfolgenden Paaren aufgeteilt.{(≢⍵)÷⍎⍺}/¨
: Teilen Sie für jedes Paar die Länge des Straßenteils (≢⍵
) durch das Ergebnis der Bewertung des Zahlenteils (⍎⍺
). Dies gibt die minimale Zeit für jedes Segment an.+/
: Summieren Sie die Zeiten für alle Segmente, um die minimale Gesamtzeit zu erhalten.⍺<
: Überprüfen Sie, ob die angegebene Zeit unter dem Mindestwert liegt.quelle
TI-Basic,
168165 BytesEingabe ist die Straße als
Str0
und die Zeit alsT
. Stellen Sie sicher, dass Sie der Straße ein Zitat voranstellen, zStr0=?"14========3===
.Ausgang ist 0, wenn beschleunigt wird, 1, wenn möglicherweise nicht beschleunigt wird.
quelle
Bash, 151 Bytes
Laufen als (zum Beispiel)
$ bash golf.sh .5 10=====
:Erläuterung
Aktivieren Sie die erweiterten Mustervergleichsoperatoren von bash und weisen Sie die Straße einer Variablen zu
r
.Schleife bis
r
ist leer. Mit der Parametererweiterung und dem erweiterten Globenoperator auf setzenf
,r
wobei alle Gleichheitszeichen am Ende entfernt sind.%%
+()
Weisen Sie
s
für jedes Straßensegment eine laufende Summe der Mindestzeiten zu. Dies kann (vielleicht etwas) besser lesbar umgeschrieben werden als:Im Grunde genommen verwenden wir hier einen Here-String, um den
dc
Befehl zu erhalten, Mathe für uns auszuführen, da Bash keine Fließkomma-Arithmetik alleine ausführen kann.9k
Legt die Genauigkeit so fest, dass unsere Division Gleitkomma ist, und gibtp
das Ergebnis aus, wenn wir fertig sind. Es ist ein Umkehrpoliturrechner, also wird das, was wir wirklich berechnen${f##*=}
, durch$[${#r}-${#f}]
plus unsere aktuelle Summe (oder, wenn wir das erste Mal durchlaufen und) geteilts
noch nicht festgelegt wurden, nichts, was uns eine Warnmeldung über stderr gibtdc
). s Stack ist leer, gibt aber trotzdem die richtige Zahl aus, da wir sowieso auf Null addieren würden).Was die tatsächlichen Werte anbelangt, die wir teilen,
${f##*=}
ist dies so, dassf
die größte Musterübereinstimmung*=
von vorne entfernt ist. Daf
unsere aktuelle Straße am Ende alle Gleichheitszeichen entfernt hat, ist dies${f##*=}
die Höchstgeschwindigkeit für diesen bestimmten Straßenabschnitt. Wenn unsere Straßer
zum Beispiel '10 ===== 5 === 'wäre, dannf
wäre sie '10 ===== 5' und so weiter${f##*=}
wäre auch '5'.$[${#r}-${#f}]
ist die Anzahl der Gleichheitszeichen am Ende unseres Straßenabschnitts.${#r}
ist die Länge vonr
; Da am Endef
nurr
alle Gleichheitszeichen entfernt sind, können wir seine Länge vonr
der Länge dieses Straßenabschnitts subtrahieren .Entfernen Sie diesen Abschnitt der Geschwindigkeitsbegrenzung vom Ende der Straße
f
, lassen Sie alle anderen Abschnitte der Straße übrig, und stellen Sie ihnr
auf diese ein. Setzen Sie die Schleife fort, um den nächsten Abschnitt der Straße zu verarbeiten.Prüfen Sie, ob die Zeit, die wir für die Fahrt auf der Straße benötigt haben (angegeben als
$1
), unter dem von der Geschwindigkeitsbegrenzung zugelassenen Minimum liegt. Dieses Minimums
kann ein Schwimmer sein, also wenden wir uns zudc
erneut dem Vergleich zu.dc
Es gibt zwar einen Vergleichsoperator, der jedoch 9 Bytes mehr enthält. Stattdessen subtrahiere ich unsere Reisezeit vom Minimum und überprüfe, ob er negativ ist, indem ich prüfe, ob er mit einem Bindestrich beginnt. Vielleicht unelegant, aber alles ist fair in Liebe und Codegolf.Da diese Prüfung der letzte Befehl im Skript ist, wird auch sein Rückgabewert vom Skript zurückgegeben: 0, wenn möglicherweise eine Geschwindigkeitsüberschreitung vorliegt, 1, wenn definitiv eine Geschwindigkeitsüberschreitung vorliegt:
quelle
Python 3.6, 111 Bytes
Mein erster Code Golf!
Probieren Sie es online!
re.split('(=+)',b)[:-1]
Teilt die Straße in Stücke von=
.Anschließend wird das Ergebnis durchlaufen , wobei
try:s=float(c)
das aktuelle Tempolimit festgelegt wird, wenn es sich bei dem aktuellen Element um eine Zahl handelt, oderexcept:t+=len(c)/s
die Zeit zum Durchlaufen dieses Straßenabschnitts zur kumulierten Summe hinzugefügt wird.Schließlich wird die Zeit zurückgegeben, die zur schnellstmöglichen Zeit benötigt wird.
quelle
PHP5
207202 BytesErster Versuch bei einer Code Golf Antwort, bitte schont mich. Ich bin mir sicher, dass ein Genie von Ihnen dies erheblich verkürzen kann. Golftipps sind willkommen.
Mit aufrufen
Gibt true zurück, wenn Sie unter dem Tempolimit waren, andernfalls false
quelle
Dyalog APL, 27 Bytes
<∘(+/(⍎'='⎕r' ')÷⍨'=+'⎕s 1)
'=+'⎕s 1
ist eine Funktion, die Strecken'='
mit einer Regex identifiziert und einen Vektor ihrer Länge zurückgibt (⎕s
der rechte Operand 0 würde Offsets bedeuten; 1 - Längen; 2 - Indizes von Regexen, die übereinstimmen).'='⎕r' '
Ersetzt'='
s durch Leerzeichen⍎'='⎕r' '
führt es aus - gibt einen Geschwindigkeitsvektor zurück÷⍨
in der Mitte werden die beiden Vektoren geteilt (⍨
die Argumente werden vertauscht, sodass die Entfernung durch die Geschwindigkeit geteilt wird)+/
ist Summealles ist bisher ein 4-Zug - eine Funktion ohne explizites Argument
<∘
komponiert "kleiner als" vor dieser Funktion; Daher wird die Funktion nur auf das rechte Argument angewendet und das Ergebnis wird mit dem linken Argument verglichenquelle
F # (165 Bytes)
Ich bin noch neu in F #. Wenn ich also etwas Seltsames oder Dummes getan habe, lass es mich wissen.
quelle
C # -Methode (
137122 Bytes)Erfordert das
using System.Linq
Hinzufügen von 19 Bytes, die in den 122 enthalten sind:Erweiterte Version:
Die
road
Zeichenfolge wird auf das=
Zeichen aufgeteilt. Abhängig davon, ob ein String das resultierende Array leer ist, legt die Aggregatfunktion diepace
Variable für das Segment fest (was die Zeit angibt, die zum Durchlaufen eines einzelnen Segments benötigt wird=
) und subtrahiert sie von der angegebenen Zeit. Dies führt zu einer zu großen Anzahl von Subtraktionen (für das endgültige Straßensegment). Anstatt mit zu vergleichen0
, vergleichen wir mit-pace
quelle
R , 100 Bytes
Probieren Sie es online!
Gibt
TRUE
für eindeutig beschleunigende Werte zurück,FALSE
für möglicherweise nicht schnelle.quelle
PowerShell , 71 Byte
Probieren Sie es online!
Testskript:
Ausgabe:
Erläuterung:
5=====10=====
, tauscht Elemente aus, fügt Klammern und Operatoren hinzu+(=====)/5+(=====)/10
=
durch+1
:+(+1+1+1+1+1)/5+(+1+1+1+1+1)/10
quelle