Wprowadzenie:
Rzućmy okiem na standardowy kalkulator w systemie Windows: w
przypadku tego wyzwania przyjrzymy się tylko następującym przyciskom i zignorujemy wszystko inne:
7 8 9 /
4 5 6 *
1 2 3 -
0 0 . +
Wyzwanie:
Wejście:
Otrzymasz dwa wejścia:
- Jednym z nich jest wskazanie obrotu w krokach co 90 stopni
- Druga to lista współrzędnych reprezentujących przyciski naciskane na obróconym kalkulatorze.
Na podstawie pierwszego wejścia obracamy powyższy układ zgodnie z ruchem wskazówek zegara w krokach co 90 stopni. Więc jeśli dane wejściowe są 0 degrees
, pozostają niezmienione; ale jeśli wejście jest 270 degrees
, zostanie ono obrócone trzy razy w prawo (lub raz w lewo). Oto cztery możliwe układy:
Default / 0 degrees:
7 8 9 /
4 5 6 *
1 2 3 -
0 0 . +
90 degrees clockwise:
0 1 4 7
0 2 5 8
. 3 6 9
+ - * /
180 degrees:
+ . 0 0
- 3 2 1
* 6 5 4
/ 9 8 7
270 degrees clockwise / 90 degrees counterclockwise:
/ * - +
9 6 3 .
8 5 2 0
7 4 1 0
Drugim wejściem jest lista współrzędnych w dowolnym rozsądnym formacie † . Na przykład (tablica liczb całkowitych 2D 0 z indeksem):
[[1,2],[2,3],[0,3],[1,0],[1,1]]
Wyjście: Wyprowadzamy
zarówno sumę, jak i wynik (i znak równości =
).
Przykład:
Jeśli więc wejściem jest 270 degrees
i [[1,2],[2,3],[0,3],[1,0],[1,1]]
, wyjściem będzie:
517*6=3102
Zasady konkursu:
- † Dane wejściowe mogą mieć dowolny rozsądny format. Pierwsze wejście może być
0-3
,1-4
,A-D
,0,90,180,270
, itd. Drugie wejście może być 0-indeksowane tablicę 2D, 1-indeksowane tablica 2D, String, lista obiektów punktowej, itd rozmowy. Możliwe jest nawet zamianę współrzędnych xiy w porównaniu z podanymi przykładowymi danymi wejściowymi. Podaj formaty wejściowe, których użyłeś w swojej odpowiedzi! - Możesz dodawać spacje (tzn.
517 * 6 = 3102
Jeśli chcesz). - Możesz dodać końcowe zera po przecinku, maksymalnie do trzech (tj.
3102.0
/3102.00
/3102.000
Zamiast3102
lub0.430
zamiast0.43
). - Nie możesz dodawać nawiasów w danych wyjściowych, więc
(((0.6+4)-0)/2)/4=0.575
nie jest to poprawny wynik. - Możesz używać innych symboli operandów w swoim języku. Tak
×
lub·
zamiast*
; lub÷
zamiast/
; itp. - Ponieważ kalkulator automatycznie oblicza przy wprowadzaniu argumentu, należy zignorować pierwszeństwo operatora!Tak
10+5*3
spowoduje45
((10+5)*3=45
), a nie25
(10+(5*3)=25
)
(tj10
→+
→5
→*
(obecnie 15 wyświetla się na wyświetlaczu) →3
→=
(teraz wyświetla odpowiedź45
)). Należy o tym pamiętać podczas korzystaniaeval
i podobnych funkcji na wynikowej sumie. - Nie będzie żadnych przypadków testowych do dzielenia przez 0.
- Nie będzie żadnych przypadków testowych zawierających więcej niż trzy cyfry dziesiętne, więc nie trzeba zaokrąglać wyniku.
- Nie będzie żadnych przypadków testowych, w których wiele operandów podąży za sobą, lub w których dwie kropki będą podążać za sobą.
- Nie będzie żadnych przypadków testowych dla liczb ujemnych. Znak minus (
-
) będzie używany tylko jako operand, a nie jako ujemny. .##
Przed przecinkiem nie będzie żadnych przypadków testowych bez numeru wiodącego (tzn.2+.7
Nie będzie to prawidłowy przypadek testowy, ale2+0.7
może być).
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
Input: 270 degrees & [[1,2],[2,3],[0,3],[1,0],[1,1]]
Output: 517*6=3102
Input: 90 degrees & [[3,1],[0,0],[0,1],[3,3],[2,0],[0,3],[0,0],[0,2],[3,0],[2,1]]
Output: 800/4+0.75=200.75
Input: 0 degrees & [[0,0],[1,0],[2,0],[3,0],[1,2],[2,1],[2,2]]
Output: 789/263=3
Input: 180 degrees & [[3,0],[1,0],[1,2],[0,0],[3,2],[0,1],[2,0],[0,3],[2,1],[0,3],[3,2]]
Output: 0.6+4-0/2/4=0.575
źródło
1+-*/+-*/2
da0.5
kalkulator Windows (10).[1,3],
2+.7
?Odpowiedzi:
SOGL V0.12 ,
706967 bajtówWypróbuj tutaj lub wypróbuj wersję, która pobiera dane wejściowe podane w testowych przypadkach
używa
I
operatora SOGL , który obraca tablicę. Następnie odczytuje ciąg znaków jako tablicę JavaScript, a tam, gdzie używana jest operacja, umieszcza poprzednie wyniki w nawiasach, ocenia jako JavaScript, a następnie usuwa nawiasy.źródło
Dyalog APL,
94888685 bajtówWypróbuj online!
Traktuje obroty jako lewy argument,
0-3
a wskaźniki oparte na 1 jako prawy argument, jako listęy x
współrzędnych(1 1)(2 3)(4 5)
itp.Stało się to dość nieładne z powodu praworęcznej oceny wyrażeń w APL.
źródło
C (gcc) , 282
294295296300304306 310bajtyWszystkie optymalizacje muszą być wyłączone i działają tylko w 32-bitowym GCC.
1 bajt dzięki @Orion!
Wypróbuj online!
Prototyp funkcji:
Format wejściowy (jak w TIO):
Wersja bez golfa z komentarzami:
Kod może obsługiwać przypadki takie jak
1+.7
lub-8*4
.Bardzo smutne, że C nie ma
eval
😭.źródło
3*-5
nieważne. Podałem to w regulaminie.double
jefloat
darmowym bajtem. Ponadto nie jestputc()
identyczny zputchar()
? Mogę się jednak mylić.putc
potrzebuje drugiego argumentu, aby określić, do którego strumienia piszesz?JavaScript (ES6),
162160157 bajtówPobiera dane wejściowe jako orientację
o
i tablicę współrzędnych (y, x)a
w składni curry(o)(a)
.Orientacja jest liczbą całkowitą w [0..3] :
Przypadki testowe
Pokaż fragment kodu
źródło
Rubin ,
135 133132 bajtówWypróbuj online!
Orientacja jako liczba całkowita: 0 dla 0 °, 1 dla 90 ° i tak dalej.
źródło
Python 3,
235234230 bajtówTrochę brzydkie, ale działa we wszystkich przypadkach testowych, z wyjątkiem pierwszego, który wydaje się nie pasować do przykładowego kalkulatora. Obracam jako 0-3 (0-270) i mnożę przez 16, aby przesunąć.
eval()
jest wbudowanym programem, który próbuje skompilować ciągi znaków jako kod i obsługuje konwersję symboli tekstowych na operatory.Metoda alternatywna okazała się nieco dłuższa, ale naprawdę podoba mi się ta końcówka SO do obracania tablicy.
źródło
Java 10,
418380378 bajtówPostanowiłem także odpowiedzieć na moje pytanie. Jestem pewien, że można go jeszcze pograć w golfa, stosując inne podejście.
Wprowadź jako
int
(0-3
) iint[][]
(indeksowane 0 / to samo co w opisie wyzwania). Wyprowadza jakfloat
z wiodącym,.0
jeśli wynikiem jest liczba całkowita zamiast liczby dziesiętnej.-2 bajty dzięki @ceilingcat .
Wyjaśnienie:
Wypróbuj tutaj.
źródło
PHP ,
267235229225221213 bajtówWypróbuj online!
6 bajtów dzięki @Kevin Cruijssen.
Kierunki wprowadzania to: 0 to 0, 1 to 90, 2 to 180, a 3 to 270 stopni.
Nie golfił
Obrót jest trudny, moim pomysłem jest ponowne mapowanie symboli w zależności od orientacji. Ponowne mapowanie odbywa się poprzez pomnożenie współrzędnych xiy przez różne kwoty i przesunięcie wyniku. Istnieje więc potrójne na orientację (zapisane w $ rot). Jest prawdopodobnie lepszy sposób, ale w tej chwili nie mogę o tym myśleć!
źródło
&&
aby&
zapisać bajt. I miła odpowiedź, +1 ode mnie! :)if(!is_numeric($s)&$s!='.')
można grać w golfa dalejif(strpos(' /*-+',$s))
(jeśli dobrze rozumiem tę odpowiedź SO ).05AB1E ,
5754 bajtówUżywa współrzędnych 0, podobnych do opisu wyzwania i
[0,1,2,3]
dla[0,90,180,270]
odpowiednio jako wejścia.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Burleska , 122 bajty
Wypróbuj online!
Przyjmuje argumenty jako:
"[[1,2],[2,3],[0,3],[1,0],[1,1]]" 3
źródło