Biorąc pod uwagę drogę ascii-art i czas, jaki musiałem, aby ją przekroczyć, powiedz mi, czy pędzę.
Jednostki
Odległość jest w dowolnej jednostce d
. Czas jest w dowolnej jednostce t
.
Droga
Oto prosta droga:
10=====
Te 10
środki 10 d
za t
. To jest ograniczenie prędkości na drodze. Droga ma 5 =
s, więc d
jest 5. Dlatego jeśli przejdę tę drogę w 0,5 t
, przeszedłem 10 d
na t
, ponieważ 5 / 0,5 = 10. Ograniczenie prędkości na tej drodze wynosi 10, więc pozostałem w granicach prędkości.
Ale jeśli przejdę tę drogę w 0,25 t
, poszedłem 20 d
na t
, ponieważ 5 / 0,25 = 20. Ograniczenie prędkości na tej drodze wynosi 10, więc przekroczyłem 10.
Przykłady i obliczenia
Zauważ, że wejście 1 to czas, który potrzebowałem na podróż drogą, a wejście 2 to sama droga.
Oto złożona droga:
Input 1: 1.5
Input 2: 5=====10=====
Najszybszy, jaki mogłem (legalnie) pojechać na pierwszej drodze (pierwsze 5 =
s) to 5 d
na t
. Ponieważ 5 (odległość) podzielona przez 5 (ograniczenie prędkości) wynosi 1, najszybszy, jaki mogłem pojechać na tej drodze, to 1 t
.
Na następnej drodze ograniczenie prędkości wynosi 10, a odległość wynosi również 5, najszybszy, jaki udało mi się przekroczyć, czyli 0,5 (5/10). Sumowanie minimalnych czasów daje wynik 1,5, co oznacza, że poszedłem dokładnie do ograniczenia prędkości.
Uwaga: Wiem, mogłem jechać naprawdę szybko na jednej drodze, naprawdę wolno na innej i nadal przekraczać 1,5, ale zakładam, że tutaj jest najlepiej.
Ostatni przykład:
Input 1: 3.2
Input 2: 3.0==========20===
Pierwsza droga ma 10 długości i ma ograniczenie prędkości 3, więc minimalny czas to 3,33333 ... (10/3)
Druga droga ma 3 długości i ma ograniczenie prędkości do 20, więc minimalny czas to 0,15 (3/20).
Sumując czasy, otrzymałem 3,483333333 ... Przekroczyłem go w 3.2, więc musiałem gdzieś pędzić.
Uwagi:
- Musisz podać jedną wyraźną wartość, jeśli bez wątpienia pędzę, i inną inną wartość, jeśli tak nie jest.
- Twój program lub funkcja może wymagać wejścia lub wyjścia, aby mieć znak nowej linii, ale powiedz to w swoim zgłoszeniu.
- Twoim pierwszym wejściem będzie moja prędkość. Będzie to dodatnia liczba zmiennoprzecinkowa, liczba całkowita lub ciąg.
- Drugim wkładem będzie droga. Zawsze będzie pasować do wyrażenia regularnego
^(([1-9]+[0-9]*|[0-9]+\.[0-9]+)=+)+\n?$
. Jeśli jesteś zainteresowany, możesz przetestować potencjalne dane wejściowe tutaj. - Możesz pobrać dane wejściowe w 2 parametrach funkcji lub programu, w 2 osobnych plikach, ze STDIN dwukrotnie lub z ciągu rozdzielanego spacjami przekazywanego do STDIN, funkcji, pliku lub parametru wiersza polecenia.
- Jeśli chcesz, możesz zmienić kolejność wejść.
- Jakieś pytania? Zapytaj poniżej w komentarzach i życzymy udanego golfa !
^(([1-9]+[0-9]*|(?!0\.0+\b)[0-9]+\.[0-9]+)=+)+\n?$
. (Byłby czystszy z wyglądem, ale wtedy potrzebowałby silnika .Net)Odpowiedzi:
05AB1E ,
2422 bajtówZwraca 1, gdy niewątpliwie przyspiesza, a 0 w przeciwnym razie.
Zaoszczędzono 2 bajty dzięki carusocomputing .
Wypróbuj online!
-§'-å
nie powinno być niczym więcej niż prostym porównaniem, ale z jakiegoś powodu ani›
nie‹
wydaje się, aby działało między wartością obliczoną a drugim wejściem.Wyjaśnienie
Używając
3.0==========20===, 3.2
jako przykładźródło
'=¡õK¹S'=QJ0¡õK€g/O-0.S
za 23 bajty.S
działa, OK. Nie zwróci to jednak 2 unikalnych wartości, ponieważ zwróci 0, gdy dokonasz dokładnie ograniczenia prędkości.a > b
operator odlewania do całkowitej przed porównania pomiędzy pływakiem i int. To bardzo dziwne, rzeczywiście ... I dostał go w dół do 22 bajtów, ale:'=¡€Þ¹S'=Q.¡O0K/O-§'-å
.g>s/
} O-§'-å na 23 z 2 zwracanymi wartościami. Może nadal trzeba coś ulepszyć? Nie wiem co. Ostatnie porównanie naprawdę nas psuje.Python 2 , 71 bajtów
Wypróbuj online!
Dynamiczny system typów Pythona może znieść pewne nadużycia.
Rozdzielenie ciągu wejściowego
s.split('=')
zamieniak
znaki równości wk-1
elementy listy pustych ciągów (z wyjątkiem końca, na którym należy odciąć). Na przykład,Kod iteruje te elementy, aktualizując bieżącą prędkość za
s
każdym razem, gdy widzi liczbę. Aktualizacja jest wykonywana w taki sposóbs=float(c or s)
, że jeślic
ciąg jest niepusty, otrzymujemyfloat(c)
i w inny sposóbc or s
oceniamys
, gdziefloat(s)
po prostu zachowujes
. Zauważ, żec
jest to ciąg znaków is
liczba, ale Python nie wymaga, nie wymaga spójnych typów danych wejściowych ifloat
akceptuje oba.Zauważ też, że zmienna
s
przechowująca prędkość jest taka sama jak pobieranie ciągu wejściowego. Łańcuch jest oceniany na początku pętli, a zmiana go w pętli nie zmienia tego, co jest iterowane. Tak więc ta sama zmienna może zostać ponownie użyta do zapisania podczas inicjalizacji. Pierwsza pętla ma zawszec
liczbę, więcs=float(c or s)
nie przejmuje sięs
początkową rolą łańcucha.Każda iteracja odejmuje bieżącą prędkość od limitu, który zaczyna się jako ograniczenie prędkości. Na koniec ograniczenie prędkości zostało naruszone, jeśli spadnie poniżej
0
.źródło
Python 3 , 79 bajtów
Wypróbuj online!
Na przykład dane wejściowe
3.0==========20===
są konwertowane na ciągi oceniane, a wynik jest porównywany z prędkością wejściową. Każdy
-~
przyrost o1
. Jestem nowy w wyrażeniach regularnych, więc być może istnieje lepszy sposób, na przykład dokonanie obu podstawień naraz. Podziękowania dla Jonathana Allana za wskazanie, jak dopasować wszystko oprócz=
postaci.źródło
"0.5=20==="
, wyjście będzieNone
niezależne od wprowadzonego czasu.([\d|.]+)
to naprawić.JavaScript (ES6), 63 bajty
Stosowanie
Przypisz tę funkcję do zmiennej i wywołaj ją przy użyciu składni curry. Pierwszy argument to czas, drugi to droga.
Wyjaśnienie
Pasuje do wszystkich kolejnych serii znaków, które nie są znakami równości, po których następuje seria znaków równości. Każde dopasowanie jest zastępowane wynikiem funkcji wewnętrznej, która wykorzystuje dwa argumenty: ciąg znaków równości (w zmiennej
d
) i liczbę (zmiennąc
). Funkcja zwraca długość drogi podzieloną przez liczbę, poprzedzoną znakiem +.Powstały ciąg jest następnie oceniany i porównywany z pierwszym wejściem.
Fragment kodu
źródło
GNU C, 128 bajtów
Obsługuje również ograniczenia prędkości niecałkowite.
#import<stdlib.h>
jest potrzebne, aby kompilator nie założył, żeatof()
zwraca anint
.t<s-.001
jest potrzebny do uruchomienia dokładnego przypadku testowego ograniczenia prędkości, w przeciwnym razie błędy zaokrąglania powodują, że myślisz, że przekraczasz prędkość. Oczywiście, jeśli teraz jest czas1.4999
zamiast1.5
, nie bierze pod uwagę tego przyspieszenia. Mam nadzieję, że to w porządku.Wypróbuj online!
źródło
Perl 5 , 43 bajtów
42 bajty kodu +
-p
flaga.Wypróbuj online!
Dla każdej grupy cyfr, po której następuje kilka znaków równości (
[^=]+(=+)
), obliczamy, ile czasu potrzeba na jej przekroczenie (liczba równych wartości podzielona przez prędkość(length$1)/$&
:) i sumujemy te czasy w środku$t
. Na koniec musimy tylko sprawdzić, czy$t
jest to mniej niż czas potrzebny na jego przekroczenie ($_=$t < <>
). Wynik będzie1
(prawda) lub brak (fałsz).źródło
Mathematica, 98 bajtów
Czysta funkcja pobierająca dwa argumenty, liczbę (która może być liczbą całkowitą, ułamkową, dziesiętną, parzystą
π
lub liczbą w notacji naukowej) oraz ciąg zakończony znakiem nowej linii i zwracającyTrue
lubFalse
. Wyjaśnienie na przykładzie przy użyciu danych wejściowych3.2
i"3==========20===\n"
:#2~StringSplit~"="
produkuje{"3","","","","","","","","","","20","","","\n"}
. Zauważ, że liczba kolejnych""
s jest o jeden mniejsza niż liczba kolejnych=
s w każdym przebiegu.//.{z___,a_,b:Longest@""..,c__}:>{z,(Length@{b}+1)/ToExpression@a,c}
to powtarzająca się zasada zastępowania. Najpierw ustawia goz
do pustego sekwencji,a
do"3"
,b
do"","","","","","","","",""
(najdłuższego biegu""
s mogło znaleźć), ac
do"20","","","\n"
; polecenie(Length@{b}+1)/ToExpression@a
ocenia na(9+1)/3
, więc wynikiem zamiany jest lista{10/3, "20","","","\n"}
.Następnie reguła zastępowania ustawia się
z
na10/3
,a
na"20"
,b
na"",""
ic
na"\n"
. Teraz(Length@{b}+1)/ToExpression@a
ocenia to(2+1)/20
, a więc wynikiem zastąpienia jest{10/3, 3/20, "\n"}
. Reguła wymiany nie może znaleźć innego dopasowania, więc się zatrzymuje.Na koniec
Tr[...]-"\n"
(zapisuje bajt, aby zamiast rzeczywistej nowej linii między cudzysłowami wstawiać"\n"
), dodaje elementy listy, uzyskując10/3 + 3/20 + "\n"
, a następnie odejmuje to"\n"
, co Mathematica jest całkowicie szczęśliwy. Na koniec<=#
porównuje wynik z pierwszym wejściem (3.2
w tym przypadku), które dajeFalse
.źródło
"1+2====3.456====π=====\n"
parzyste.Galaretka , 27 bajtów
Wypróbuj online!
Uwaga: zakłada, że regex podane w pytaniu powinna być taka, że ograniczenie prędkości nie może być
0.0
,0.00
itp - podobnie jak nie można0
( potwierdzone jako własność niezamierzonym).W jaki sposób?
źródło
0.0
ponieważ odfiltrowuję wartości, które oceniają jak0
w kodzie, aby wyciągnąć ograniczenia prędkości.Python 3, 90 bajtów
Wyjścia
True
jeśli przekraczasz prędkość,False
jeśli nie. Nie wymaga (ale będzie działał) końcowego znaku nowej linii.Mimo że nie wygląda tak, to poprawnie obsługuje zmienne zarówno w zakresie czasu wejściowego, jak i ograniczeń prędkości, ponieważ wyrażenie regularne służy tylko do oddzielania odcinków drogi.
źródło
MATL ,
3130 bajtówDane wejściowe to: ciąg znaków (ograniczenia prędkości i drogi), a następnie liczba (używana prędkość). Wyjście jest,
1
jeśli niewątpliwie przyspiesza,0
jeśli nie.Wypróbuj online!
Objaśnienie z przykładem
Rozważ dane wejściowe
'3.0==========20==='
i3.2
.źródło
APL, 41 bajtów
To traktuje drogę jako ciąg jako prawy argument, a czas jako lewy argument i zwraca,
1
jeśli przekraczałeś prędkość, a0
jeśli nie, to tak:Wyjaśnienie:
X←⍵='='
: przechowuj wX
wektorze bitowym wszystkich pozycji w⍵
które są częścią drogi.X≠¯1⌽X
: zaznacz każdą pozycję,X
która nie jest równa prawemu sąsiadowi (owijając się), podając pozycje, od których zaczynają się liczby i drogiY←⍵⊂⍨
: podziel⍵
w tych pozycjach (podając tablicę na przemian liczb i ciągów znaków) i zapisz goY
.Y⊂⍨2|⍳⍴Y
: podzielićY
na kolejne pary.{(≢⍵)÷⍎⍺}/¨
: dla każdej pary podziel długość części drogi (≢⍵
) przez wynik oceny części liczbowej (⍎⍺
). Daje to minimalny czas dla każdego segmentu.+/
: Zsumuj czasy dla wszystkich segmentów, aby uzyskać całkowity minimalny czas.⍺<
: Sprawdź, czy podany czas jest krótszy niż minimum, czy nie.źródło
TI-Basic,
168165 bajtówDane wejściowe to droga
Str0
i czas jakoT
. Pamiętaj, aby poprzedzić drogę cytatem, npStr0=?"14========3===
.Wartość wyjściowa wynosi 0, jeśli przyspieszenie, 1, jeśli to możliwe, brak prędkości.
źródło
Bash, 151 bajtów
Uruchomiony jako (na przykład)
$ bash golf.sh .5 10=====
:Wyjaśnienie
Włącz rozszerzone operatory dopasowywania wzorców bash i przypisz drogę do zmiennej
r
.Pętla, aż
r
będzie pusta. Ustawf
nar
ze wszystkimi znakami równości usuniętymi z końca, używając%%
rozszerzenia parametru i+()
rozszerzonego operatora globowania.Przypisz do
s
bieżącej sumy minimalnych czasów dla każdego odcinka drogi. Można to przepisać (być może nieco) bardziej czytelnie jako:Zasadniczo to, co się tutaj dzieje, polega na tym, że używamy ciągu tutaj, aby uzyskać
dc
polecenie wykonania matematyki dla nas, ponieważ bash nie może sam wykonywać arytmetyki zmiennoprzecinkowej.9k
ustawia precyzję, aby nasz podział był zmiennoprzecinkowy, ip
drukuje wynik, gdy skończymy. Jest to kalkulator odwrotnego polerowania, więc to, co naprawdę obliczamy, jest${f##*=}
dzielone przez$[${#r}-${#f}]
plus naszą bieżącą sumę (lub, gdy po raz pierwszy przejdziemy is
nie został jeszcze ustawiony, nic, co daje nam ostrzeżenie na stderr odc
„ s jest pusty, ale nadal drukuje prawidłową liczbę, ponieważ i tak będziemy dodawać do zera).Jeśli chodzi o rzeczywiste wartości, które dzielimy:
${f##*=}
jestf
z największym dopasowaniem wzorca*=
usuniętym z przodu. Ponieważf
jest to nasza obecna droga ze wszystkimi znakami równości usuniętymi z końca, oznacza${f##*=}
to ograniczenie prędkości dla tego konkretnego odcinka drogi. Na przykład, jeśli nasza droga miałabyr
„10 ===== 5 ===”, tof
byłaby to „10 ===== 5”, a więc${f##*=}
byłaby to „5”.$[${#r}-${#f}]
to liczba znaków równości na końcu naszego odcinka drogi.${#r}
jest długościąr
; ponieważf
jest por
usunięciu wszystkich znaków równości na końcu, możemy po prostu odjąć jego długość od,r
aby uzyskać długość tego odcinka drogi.Usuń ten odcinek ograniczenia prędkości drogi z końca
f
, pozostawiając wszystkie pozostałe odcinki drogi i ustawr
na to, kontynuując pętlę, aby przetworzyć kolejny kawałek drogi.Sprawdź, czy czas potrzebny na przejechanie drogi (podany jako
$1
) jest krótszy niż minimalny dozwolony przez ograniczenie prędkości. To minimums
może być zmiennoprzecinkowe, więc wrócimy dodc
porównania.dc
ma operator porównania, ale faktycznie użycie go skończyło się o 9 bajtów więcej niż to, więc zamiast tego odejmuję nasz czas podróży od minimum i sprawdzam, czy jest ujemny, sprawdzając, czy zaczyna się od myślnika. Być może nieeleganckie, ale wszystko jest w porządku w miłości i korzeniach.Ponieważ to sprawdzenie jest ostatnim poleceniem w skrypcie, jego wartość zwrotna również zostanie zwrócona przez skrypt: 0, jeśli to możliwe, przyspieszenie, 1, jeśli zdecydowanie przyspieszenie:
źródło
Python 3.6, 111 bajtów
Mój pierwszy golf golfowy!
Wypróbuj online!
re.split('(=+)',b)[:-1]
Dzieli drogę na kawałki=
.Następnie iteruje wynik, używając
try:s=float(c)
do ustawienia aktualnego ograniczenia prędkości, jeśli bieżącym elementem jest liczba, lubexcept:t+=len(c)/s
do dodania czasu do przemierzenia tego odcinka drogi do łącznej sumy.Wreszcie zwraca czas zajęty do możliwie najszybszego czasu.
źródło
PHP5
207202 bajtówPierwszy wysiłek na odpowiedź na pytanie w golfa, proszę, spokojnie. Jestem pewien, że jeden z was, geniusze, będzie w stanie znacznie to skrócić, wszelkie wskazówki dotyczące gry w golfa są mile widziane.
Wywołaj z
Zwraca wartość true, jeśli przekroczyłeś limit prędkości, w przeciwnym razie wartość false
źródło
Dyalog APL, 27 bajtów
<∘(+/(⍎'='⎕r' ')÷⍨'=+'⎕s 1)
'=+'⎕s 1
jest funkcją, która identyfikuje ciągi'='
za pomocą wyrażenia regularnego i zwraca wektor ich długości (⎕s
prawy operand 0 oznaczałby przesunięcia; 1 - długości; 2 - wskaźniki pasujących wyrażeń regularnych)'='⎕r' '
zastępuje'='
s spacjami⍎'='⎕r' '
wykonuje go - zwraca wektor prędkości÷⍨
w środku dzieli dwa wektory (⍨
zamienia argumenty, więc odległość dzieli się przez prędkość)+/
jest sumąjak dotąd wszystko to 4 pociągi - funkcja bez wyraźnego argumentu
<∘
komponuje „mniej niż” przed tą funkcją; więc funkcja będzie działać tylko na prawym argumencie, a jej wynik zostanie porównany z lewym argumentemźródło
F # (165 bajtów)
Nadal jestem nowy na F #, więc jeśli zrobiłem coś dziwnego lub głupiego, daj mi znać.
źródło
Metoda C # (
137122 bajtów)Wymaga
using System.Linq
dodania 19 bajtów, zawartych w 122:Wersja rozszerzona:
road
Ciąg jest podzielony na=
charakter. W zależności od tego, czy ciąg jest tablicą wynikową, jest pusty, funkcja agregująca ustawiapace
zmienną dla segmentu (oznaczającą czas potrzebny na przejechanie pojedynczego=
) i odejmuje ją od podanego czasu. Wykona to zbyt wiele odejmowań (dla końcowego odcinka drogi), więc zamiast porównywać0
, porównujemy-pace
źródło
R , 100 bajtów
Wypróbuj online!
Zwraca
TRUE
wartości jednoznacznie przyspieszające, aFALSE
być może wartości nieprzydatne.źródło
PowerShell , 71 bajtów
Wypróbuj online!
Skrypt testowy:
Wydajność:
Wyjaśnienie:
5=====10=====
, zamienia elementy, dodaje nawiasy i operatory+(=====)/5+(=====)/10
=
z+1
:+(+1+1+1+1+1)/5+(+1+1+1+1+1)/10
źródło