Biorąc pod uwagę ciąg N, S, E i W, wyślij łożysko (kąt w kierunku zgodnym z ruchem wskazówek zegara od północy w stopniach), popraw do 5 miejsc po przecinku.
W tradycyjnej notacji kompasu ciąg składa się tylko z 2 takich znaków (takich jak NNW lub ESE). Tutaj musisz również zaakceptować ciągi zawierające wszystkie 4 (jak WNNNSE) . Używanie tylko 2 symboli pozwala ludziom intuicyjnie zrozumieć znaczenie. Dopuszczenie 4 symboli sprawia, że czytanie jest okropne, ale umożliwia krótsze sposoby opisywania namiaru z określoną dokładnością.
(Jak wskazano w uwagach przez user2357112 , okazuje się, można udowodnić, że dla danego łożyska, łańcuch 4 symbol będzie dokładnie taka sama jak długość łańcucha 2 symbolu, tak ja to wyzwanie oparte na fałszywym założeniu. Mam nadzieję, że ten brak praktycznego celu nie umniejsza przyjemności z wyzwania ...)
Dokładna metoda została opisana poniżej i jest równoważna tradycyjnej notacji (rozwija się na niej, a nie zmienia).
Wkład
- Dane wejściowe to pojedynczy ciąg znaków zawierający tylko znaki
NESW
. - Dane wejściowe mogą być ciągiem znaków, jeśli wolisz, pod warunkiem, że nie obejmuje to żadnego przetwarzania wstępnego. Na przykład pobranie zagnieżdżonej listy w
[N, [E, [S, [W]]]]
celu ułatwienia kolejności przetwarzania jest niedozwolone. - Zabieranie różnych postaci jest niedozwolone. Nie możesz wziąć ciąg
1234
zamiastNESW
.
Wydajność
- Dane wyjściowe muszą być liczbą dziesiętną lub reprezentacją ciągu jednego (nie wymierną / ułamkową).
- Zera końcowe nie muszą być wyświetlane. Jeśli łożysko jest
9.00000
, to wynik9
również liczy się jako poprawny do 5 miejsc po przecinku. - Dane wyjściowe mieszczą się w zakresie [0, 360). To znaczy, w tym 0, ale z wyłączeniem 360.
- Poprawność jest sprawdzana poprzez zaokrąglenie wyniku do 5 miejsc po przecinku. Jeśli łożysko ma wartość 0,000005, zaokrągla to do 0,00001. Wyjścia 0,00001 i 0,000005 są poprawne.
- Dane wyjściowe w notacji naukowej dla niektórych danych wejściowych są dopuszczalne. Na przykład
1e-5
zamiast0.00001
.
Konwersja
- Punkty pojedynczemu znakowi kompas
N
,E
,S
iW
odpowiadają 0, 90, 180 i 270 ° odpowiednio. - Przygotowanie jednego z nich do struny powoduje, że łożysko przecina łożysko pojedynczego znaku i łożysko oryginalnego ciągu.
- Wybrano najbliższe z dwóch możliwych dwudzielnych łożysk, tak że NE reprezentuje 45 stopni, a nie 225 stopni.
- Jest to jednoznaczne, chyba że kąt, który ma być podzielony na dwie części, wynosi 180 stopni. Dlatego
NS
,SN
,WE
, iEW
odpowiadają niezdefiniowany łożysk, a wejście nigdy nie kończy się w każdym z nich. Mogą jednak pojawiać się gdziekolwiek indziej w ciągu wejściowym, ponieważ nie powoduje to niejednoznaczności. - Jeśli dwa ostatnie znaki są identyczne, ostatni znak będzie zbędny, ponieważ bisekcja zwróci ten sam kierunek. Ponieważ nic to nie dodaje do notacji, twój kod nie musi sobie z tym poradzić. Dlatego
NN
,EE
,SS
, iWW
odpowiadają niezdefiniowany łożysk, a wejście nigdy nie kończy się w każdym z nich. Mogą jednak pojawiać się gdziekolwiek indziej w ciągu wejściowym.
Przykłady
N: 0
E: 90
S: 180
SE: halfway between S and E: 135
NSE: halfway between N and SE: 67.5
NNSE: halfway between N and NSE: 33.75
NNNSE: halfway between N and NNSE: 16.875
NNNNSE: halfway between N and NNNSE: 8.4375
Przypadki testowe
Przedłożenie jest ważne tylko wtedy, gdy daje poprawne dane wyjściowe dla wszystkich przypadków testowych. Zauważ, że przypadki testowe przekraczają granice tego, co można obsługiwać z podwójną precyzją. W przypadku języków domyślnie ustawionych na pojedynczą precyzję prawdopodobnie będziesz musiał wydać bajty, aby określić podwójną precyzję w celu uzyskania poprawnych wyników.
Wyniki przypadków testowych są zaokrąglone do 5 miejsc po przecinku, a także z dowolną dokładnością. Oba są prawidłowymi danymi wyjściowymi.
WNE 337.5 337.5
WEN 337.5 337.5
WEWEWEWEWEWEWEWEWEWEWEN 330.00001 330.000007152557373046875
NESWNESWNESWNESWNESWNESWNESW 90 89.99999932944774627685546875
NNNNNNNNNNNNNNNNNNNNNNNE 0.00001 0.0000107288360595703125
NNNNNNNNNNNNNNNNNNNNNNNW 359.99999 359.9999892711639404296875
SNNNNNNNNNNNNNNNNNNNNNNNE 90.00001 90.00000536441802978515625
SNNNNNNNNNNNNNNNNNNNNNNNW 269.99999 269.99999463558197021484375
Punktacja
To jest golf golfowy . Wynik to długość kodu źródłowego w bajtach, a najkrótsza wygrana.
Pedanteria
Popełniłem błąd, myśląc, że „North by North West” jest ważnym kierunkiem kompasu. Szczęśliwy błąd, ponieważ doprowadził do pomysłu na wyzwanie, ale potem odkryłem na stronie Wikipedii :
„Tytuł filmu Alfreda Hitchcocka z 1959 roku, North by Northwest, nie jest właściwie punktem orientacyjnym na 32-wiatrowym kompasie, ale film zawiera odniesienie do Northwest Airlines ”.
Okazuje się również, że metoda zastosowana do tego wyzwania jest zgodna tylko z tradycyjnymi punktami kompasu do 16-punktowego kompasu włącznie. 32-wiatrowy kompas opisany na tej stronie jest nieco inny i wygodnie przeoczyłem jego istnienie w tym wyzwaniu.
Wreszcie, dla każdego, kto uważa, że powinienem używać „południowo-wschodniej” zamiast „południowo-wschodniej”,.
WNNNSE
<= jaki byłby wynik dla tego przykładowego wpisu na początku Twojego postu? dla mnie to brzmi nieważnie, ale trudno powiedzieć.WNNNSE
wyjście będzie323.4375
. W sekcji przykładowej znajduje się przewodnik, który miałby zastosowanie w ten sam sposób do tego przypadku.f(N,N,N,S,E)
porządku?Odpowiedzi:
JavaScript (ES6),
8480787472 bajtyZapisano bajt dzięki @Titus, 1 dzięki @Neil
Minęło trochę czasu, ale myślę, że w końcu udoskonaliłem formułę ...
Testowy fragment kodu
Pokaż fragment kodu
Wyjaśnienie
Zacznijmy od najprostszego przypadku: łańcucha jednoznakowego. Wynikiem jest po prostu jego (indeksowana 0) pozycja w ciągu
NESW
, pomnożona przez 90.W przypadku ciągu dwóch znaków wynik znajduje się w połowie drogi między wynikiem pierwszego znaku a wynikiem drugiego. Jest jednak pewien haczyk: jeśli absolutna różnica między nimi jest większa niż 180 (np.
NW
LubWN
), musimy 180 do kąta, aby nie wskazywał przeciwnego kierunku.W przypadku dowolnego dłuższego ciągu wynik leży w połowie między wynikiem pierwszego znaku i wynikiem pozostałej części łańcucha. Można to uogólnić w następujący sposób:
NESW
90 razy.NESW
45 razy plus połowę wyniku z pozostałej części łańcucha; dodać dodatkowe 180, jeśli absolutna różnica między nimi jest większa niż 90.źródło
search
zamiastindexOf
oszczędzać bajt.C # 6,
226217207185 bajtówEdycja: -10 bajtów dzięki pomysłowi „pożyczenia” ze zgłoszenia ETHproductions
-22 bajtów dzięki @Titus
Bez golfa
źródło
b=(b+360)%360;
zamiastb+=b>360?-360:b<0?360:0;
. Zaoszczędź kolejne 12 bajtów dzieląc wszystko przez 90 ireturn b*90;
.b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0)+8)/2%4;
następnie+8
przekaż wyniki do potrójnych wynikówb=(b+f(c)+(b-f(c)>2?12:f(c)-b>2?4:8))/2%4;
PHP,
958886100127104101 bajtówN
(i więcej, ponieważ pozwala to wstawić tłumaczenie do głowy pętli:N
jest prawdą, ale uwzględnia to0
w obliczeniach).strtr
jednym z moich żonglerekJest to oficjalnie pierwszy raz, kiedy korzystam z zerowego operatora koalescencyjnego. Uruchom z
-r
.PHP 7.1
Ujemne przesunięcia ciąg w nadchodzącej wersji PHP pozwoli zaoszczędzić 12 bajtów:
Wymień
strlen($s=$argv[1])
się0
i$s
z$argv[1]
.Darmowe bajty dla (prawie) wszystkich:
(a/2%6+2)%5
a<87?a/2&3^3:3
luba/2&3^3*(a<87)
a&1?a&2|a/4&1:0
a/.8-1&3
źródło
Python 3,
133113 bajtówPoprawiam odpowiedź @ L3viathan, ponieważ właśnie utworzyłem to konto i dlatego nie mogę jeszcze komentować.
źródło
05AB1E ,
48423732 bajtyZaoszczędź 6 bajtów dzięki Emignie. Zaoszczędzono 5 bajtów dzięki pomysłowi Tytusa, aby pracować w zakresie [0,4 [i pomnożyć przez 90 na końcu. Oszczędność 5 bajtów dzięki opanowaniu przez Adnana starożytnej metamorfozy xor / modulo.
Tak więc każdy kąt jest redukowany z zakresu [0,360 [do zakresu [0,4 [podczas wykonywania). Wynik jest następnie mnożony przez 90 i wyświetlany.
Wypróbuj online!
Potencjalne osie gry w golfa:
źródło
NNNNNNNNNNNNNNNNNNNNNNNE
iSNNNNNNNNNNNNNNNNNNNNNNNE
testowych przypadkach.v"NESW"yk90*})R¬U¦vXy+;DX-Ä89›180*+360%U}X
.89›
tak naprawdę oznacza to, że część całkowita jest większa niż 89, co jest równoważne z twierdzeniem, że pełna liczba jest większa lub równa 90 (co nadal działa dobrze, ponieważ dokładnie 90 nigdy nie powinno wystąpić). Obecnie komentarz w objaśnionym kodzie brzmi, jakby sprawdzał na więcej niż 89, podczas gdy twój kod przechodzi przypadki testowe, więc wyraźnie poprawnie sprawdza na więcej niż 90.›
powinien zachowywać się w stosunku do ujemnych wartości zmiennoprzecinkowych. Nie ma tu problemu, ponieważ działa na wartości bezwzględnej, ale wolę nie przyjmować zbyt silnych założeń dla operatora.v"NESW"yk})
zÇ30^5%
:)Python 3,
14614511710797949392 bajtyZadzwoń
f
za pomocą łańcucha.źródło
...0else
które wyrzucają Składnia Błędów.else
i-
też? (może w 3.3.3)d.find
może, jeszcze minutę temu miałem dokładny pomysł; zobacz zaktualizowaną odpowiedź.C 184 bajty
Bez golfa
źródło
d
)?R,
172146 bajtówBez golfa
Wyjaśnił
c("N","E","S","W")
0:3*90
(zamiastc(0,90,180,270)
)z
p
do stopnia odpowiadającego ostatniemu znakowi na wejściul
p
naz
Wypróbuj przypadki testowe na skrzypcach typu R (zauważ, że jest to funkcja, ponieważ
scan
nie działa na skrzypcach typu R)źródło
Outputs 0.00001 and 0.000005 are both correct.
Powinieneś być w stanie zaoszczędzić trochę bajtów, nie zaokrąglającc("N","N","E")
zamiast"NNE"
? Jest to odpowiednik nie zagnieżdżonej listy python["N","N","E"]
.Haskell,
109 105103 bajtówDzięki za -2 bajty @xnor!
źródło
f
wygląda na długą, ale mam problem ze znalezieniem czegoś krótszego. Najbliżej byłof c=90*until(\i->"NESW"!!i==c)(+1)0
(35). Myślę, że można zastąpić'W'
z_
._
!Dyalog APL ,
554538 bajtówRozwiązanie
Wymaga
⎕IO←0
, co jest domyślne w wielu systemach. Pyta o kierunek.Wyjaśnienie
Rozwiązuje ten problem, konwertując każdą literę na liczbę zespoloną 1∠ θ ⇔ a + b · i , a następnie wykonując redukcję sumy od prawej do lewej (forte APL) podczas normalizacji na każdym kroku. Końcowe θ jest następnie konwertowane na stopnie i znormalizowane w zakresie [0, 360):
'NES'⍳⍞
indeksy każdej litery wejściowej w „NES”; N → 0, E → 1, S → 2, cokolwiek innego → 3○2÷⍨
przelicz na kąty w radianach; θ = π · x ∕ 2¯12○
konwertować na liczby zespolone w kole jednostkowym; e i · θ(
...)/
zmniejsz listę za pomocą ... (tzn. wstaw funkcję między elementami ...)+÷(|+)
... znormalizowana suma; x n - 1 + x n ∕ | x n - 1 + x n |12○
przelicz na kąt; θ÷○÷180×
przelicz na stopnie; 1 ∕ π · 1 ∕ 180 · x360|
pozostała część podziału po podzieleniu przez 360Wypróbuj APL online!
Anegdota
Gdyby dane wejściowe i wyjściowe były prostymi jednostkami złożonymi, całe rozwiązanie byłoby po prostu:
Reszta kodu analizuje dane wejściowe i formatuje dane wyjściowe.
źródło
⎕FR←1287
wykorzystuje 128-bitowe zmiennoprzecinkowe, ale TryAPL nie pozwala na to.Common Lisp,
347327 bajtówDzięki @Titus za zdjęcie kilku
To może być bardziej golfa, ale przynajmniej działa (myślę):
Stosowanie:
Funkcja
d
przyjmuje postaćN
,E
,W
, lubS
i zwraca odpowiedni stopień. Funkcjam
otrzymuje odpowiedni łączny stopień dwóch podanych kierunków. Funkcjaf
iteruje podany ciąg, oblicza odpowiedni stopień i drukuje go jako zmiennoprzecinkowy.źródło
Befunge,
183181175 bajtówWypróbuj online!
Wyjaśnienie
Jest to zgodne z algorytmem podobnym do wielu innych odpowiedzi, tylko wykorzystuje obliczenia stałoprzecinkowe emulowane liczbami całkowitymi, ponieważ Befunge nie obsługuje liczb zmiennoprzecinkowych.
Dzięki @Titus za procedurę ASCII-to-int.
źródło
APL (Dyalog Classic) ,
3027 bajtówWypróbuj online!
źródło