Ostatnim razem, gdy próbowałem wymyślić coś łatwego, co nie było duplikatem, okazało się, że jest to zbyt trudne. Mam nadzieję, że tym razem jest to coś nowego.
Wejście:
Tablica / lista z liczbami całkowitymi / dziesiętnymi. (Lub ciąg reprezentujący tablicę z liczbami całkowitymi / dziesiętnymi.)
Wynik:
Zapętlaj liczby i zastosuj następujące pięć operandów matematycznych w tej kolejności:
- Dodawanie (
+
); - Odejmowanie (
−
); - Mnożenie (
*
lub×
lub·
); - Real / Calculator Division (
/
lub÷
); - Potęgowanie (
^
lub**
).
(UWAGA: Symbole między nawiasami zostały dodane tylko jako wyjaśnienie. Jeśli twój język programowania używa zupełnie innego symbolu dla operacji matematycznej niż w przykładach, to jest to oczywiście całkowicie dopuszczalne).
Kontynuuj, aż dojdziesz do końca listy, a następnie podaj wynik sumy.
Zasady konkursu:
- Potęgowanie przez 0 (
n ^ 0
) powinno dać 1 (dotyczy to również0 ^ 0 = 1
). - Nie ma przypadków testowych dla dzielenia przez 0 (
n / 0
), więc nie musisz się martwić o przypadek na krawędzi. - Jeśli tablica zawiera tylko jedną liczbę, zwracamy ją jako wynik.
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa 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.
Przypadki testowe:
[1,2,3,4,5] -> 0
-> 1 + 2 = 3
-> 3 - 3 = 0
-> 0 * 4 = 0
-> 0 / 5 = 0
[5,12,23,2,4,4,2,6,7] -> 539
-> 5 + 12 = 17
-> 17 - 23 = -6
-> -6 * 2 = -12
-> -12 / 4 = -3
-> -3 ^ 4 = 81
-> 81 + 2 = 83
-> 83 - 6 = 77
-> 77 * 7 -> 539
[-8,50,3,3,-123,4,17,99,13] -> -1055.356...
-> -8 + 50 = 42
-> 42 - 3 = 39
-> 39 * 3 = 117
-> 117 / -123 = -0.9512...
-> -0.9512... ^ 4 = 0.818...
-> 0.818... + 17 = 17.818...
-> 17.818... - 99 -> -81.181...
-> -81.181... * 13 = -1055.356...
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256
-> 2 + 2 = 4
-> 4 - 2 = 2
-> 2 * 2 = 4
-> 4 / 2 = 2
-> 2 ^ 2 = 4
-> 4 + 2 = 6
-> 6 - 2 = 4
-> 4 * 2 = 8
-> 8 / 2 = 4
-> 4 ^ 2 = 16
-> 16 + 2 = 18
-> 18 - 2 = 16
-> 16 * 2 = 32
-> 32 / 2 = 16
-> 16 ^ 2 = 256
[1,0,1,0,1,0] -> 1
-> 1 + 0 = 1
-> 1 - 1 = 0
-> 0 * 0 = 0
-> 0 / 1 = 0
-> 0 ^ 0 = 1
[-9,-8,-1] -> -16
-> -9 + -8 = -17
-> -17 - -1 = -16
[0,-3] -> -3
-> 0 + -3 = -3
[-99] -> -99
code-golf
math
number
arithmetic
array-manipulation
Kevin Cruijssen
źródło
źródło
n ^ 0 = 1
ale0 ^ n = 0
. Konflikt jest rozwiązywany przez ustawienien != 0
obu reguł, ale potem pozostaje0 ^ 0
niezdefiniowany. Istnieje jednak wiele rzeczy, które ładnie układają się w matematyce, jeśli tak0 ^ 0
jest zdefiniowane1
. Zobacz szczegóły w Wikipedii .Odpowiedzi:
Galaretka , 13 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
JavaScript ES7 49 bajtów
Zaoszczędził 9 bajtów dzięki Domowi Hastingsowi, a kolejne 6 dzięki Dziurawej Zakonnicy
Używa nowego operatora potęgowania.
źródło
Infinity
, a nie błąd?Haskell,
76656462 bajtówDzięki @Damien za usunięcie kolejnych dwóch bajtów =)
Wykorzystuje to,
>>
co tutaj po prostu dołącza listę[(+),...]
do siebielength v
razy. Reszta nadal działa tak samo jak stare wersje.Stare wersje:
Te rozwiązania wykorzystują nieskończone listy, ponieważ
cycle[...]
po prostu powtarzają podaną listę w nieskończoność. Potem jest po prostuzip
edytowany z listą liczb, a my po prostufold
( zmniejszamy w innych językach) listę skompresowaną za pomocą lambda, która stosuje operatory do elementu listy akumulatorów / bieżących.źródło
foldl(&)u$zipWith(&)v(flip<$>v>>[…])
?import
do&
, więc to byłoby już raz, ale i tak dzięki!uncurry
. Nie zadziałało, ale zauważyłem, że powinieneś być w stanie zapisać kolejny bajt, używając$
zamiast nawiasów.Pyke,
2221 bajtówWypróbuj tutaj!
źródło
Haskell, 61 bajtów
Tworzy serię transformacji na liście, jak w [dodaj 1, dodaj 2, odejmij 3, ...], zaczynając od 2 dodatków, ponieważ zaczynamy od 0 w zakładce. Następnie robimy coś, co nazywam List Application Fold lub foldl (flip id), który stosuje listę homomorfizmów w szeregu. Zaczyna się od zera, dodaje wartość początkową, a następnie wykonuje wszystkie powyższe obliczone transformacje, aby uzyskać końcowy wynik.
Zauważ, że (flip id) jest taki sam jak (\ x y-> yx), tylko krótszy.
Przykładowe użycie:
źródło
flip id
możesz po prostu użyć&
. Lubflip($)
. Wow, nigdy nie zdawałem sobie sprawy($) = id
&
jest zdefiniowane wData.Function
, więc też potrzebujeszimport
. Być może jakiś tłumacz online domyślnie go importuje, ale musisz określić, którego używasz.TSQL
11611588 bajtówDzięki sugestii Rossa Pressera mogłem zagrać w golfa aż do 88 postaci
Wypróbuj online
źródło
Pyth,
272625 bajtówZestaw testowy.
Pyth używa notacji przedrostkowej:
1+2
jest zapisywany jako+1 2
(miejsce potrzebne do oddzielenia liczb).Dlatego w pierwszym przypadku testowym wyrażeniem byłoby
(((1+2)-3)*4)/5
, które w notacji przedrostkowej byłoby zapisane jako/*-+ 1 2 3 4 5
.W Pyth
c
zamiast podziału zmiennoprzecinkowego jest/
, więc staje sięc*-+ 1 2 3 4 5
.Również w Pyth
-100
jest napisany jako_100
zamiast.Dlatego też, w trzecim przypadku testowego, który
((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)
staje się:*-+^c*-+ _8 50 3 3 _123 4 17 99 13
.Historia
v:P+*lQ\(ssV+R\)Q*"+-*/p"lQ\p"**"
.vs+_XUtQUQ"+-*c^"m:+;d\-\_
.vs+_XUtQUQ"+-*c^":jdQ\-\_
źródło
Właściwie 23 bajty
Wypróbuj online!
W rzeczywistości używa matematycznej notacji postfiksowej, a operatory, które przyjmują tylko dwa argumenty (takie jak operatory dodawania, odejmowania, mnożenia, dzielenia i potęgowania) nie robią nic, gdy na stosie jest tylko jeden element. Zatem przekształcenie danych wejściowych w kod faktycznie jest tak proste, jak odwrócenie danych wejściowych, sformatowanie ich w postaci liczbowej i dołączenie operacji. Następnie można wykonać wynikowy kod, dając pożądany wynik.
Wyjaśnienie:
Przykład przetłumaczonego kodu do wprowadzania
1,2,3,4,5
:źródło
s/Actually uses postfix notation/Actually actually uses postfix notation/
Julia,
5350 bajtówWypróbuj online!
źródło
J, 40 bajtów
Znajduje liczbę wartości potrzebnych do użycia wielokrotności 5 operatorów, niż padów z wartościami tożsamości tych operatorów. Kolejność
+
wynosi 0,-
wynosi 0,*
wynosi 1,%
wynosi 1 i^
wynosi 1, co może być wartością bitową00111
, lub 7 w bazie 10. Następnie działa na tej liście podczas przewijania operatorów.Stosowanie
Wyjaśnienie
źródło
Python 2,
816764 bajtówDane wejściowe to tablica liczb zmiennoprzecinkowych. Przetestuj na Ideone .
Jak to działa
'*+-*/*'[i::5]
wybiera co piąty znak ciągu, zaczynając od znaku o indeksie i , więc daje to,**
jeśli i = 0 ,+
jeśli i = 1 ,-
jeśli i = 2 ,*
jeśli i = 3 i/
jeśli i = 4 . Ponieważ ciąg ma długość 6 , wyrażenie zwróci pusty ciąg, jeśli i> 5 .Inicjujemy zmienną i na 10 . Dla każdej liczby nw tablicy wejściowej konstruujemy ciąg
r<op>=n
, który jestexec
wykonywany.Początkowo i = 10 , podobnie
<op>
jak pusty ciąg i inicjuje r za pomocąr+=n
. Po każdym kroku możemy zwiększać i modulo 5 zi=-~i%5
, więc następnym krokiem będzie pobranie właściwego operatora.Gdy wszystkie liczby wejściowe zostaną przetworzone, a my wypisujemy r , który przechowuje pożądany wynik.
źródło
Matlab -
95 9185 bajtów / oktawa - 81 bajtówDane wejściowe są w takiej formie:
a = ['1' '2' '3' '4' '5'];
Mam nadzieję, że są one objęte „ciągiem znaków reprezentującym tablicę z liczbami całkowitymi / dziesiętnymi”, w przeciwnym razie potrzebne są dodatkowo 2 wartości num2str.Każdy wynik pośredni jest drukowany na konsoli, ponieważ pozwala mi to zaoszczędzić trochę średników.
a(1)
jest wykonywany, więc jego wartość jest następnie zapisywana wans
. Oczywiście używanieans
kodu jest złą praktyką.W Octave
'+-*/^'(mod(i+2,5)+1)
działa również, co oszczędza kolejne 4 bajty, dzięki Adám i Luis Mendo:Dziennik zmian:
źródło
b = '+-*/^'
być golfed sięb='+-*/^'
ifor i = 2:length(a)
dofor i=2:length(a)
(usuwając spacje)? Również być może Porady dotyczące gry w golfa w MATLAB mogą być dla Ciebie interesujące. :)'+-*/^'(mod(i+2,5)+1)
ważny?Mathematica,
676665 bajtówProste
Fold
ze zmiennąi
trzymającą indeks.źródło
+##
Zamiast tego można zapisać bajt zamiast#+#2
CJam, 18 bajtów
Dane wejściowe to tablica liczb zmiennoprzecinkowych. Wypróbuj online!
Jak to działa
źródło
R ,
87 7870 bajtówWypróbuj online!
źródło
do.call
... Prawdopodobnie nie powinienem uważać się za programistę R.Advanced R
autorstwa Hadley Wickam to świetna plaża czytana :)do.call
- uświadomiłem sobie, że szukamget
.Haskell - 74
Przypadki testowe:
Prawdopodobnie może być krótszy; Jednak wsparcie Haskella dla nieskończonych list i funkcji wyższego rzędu sprawia, że bezpośrednie rozwiązanie jest całkiem przyjemne. Wersja
^ :: Double -> Double -> Double
byłaby lepsza do gry w golfa, ale nie mogłem jej znaleźć. Na szczęście nie potrzebowałem pełnej lambda, więc bezsensowny styl ogolił kilka bajtów.źródło
(+)
na liście operatorów i rozpocząćfoldl
z0
przejść całkowicie pointfree i zapisać nazwę funkcji i parametrów:foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])
.PowerShell v2 +, 124 bajty
Długo, ponieważ PowerShell nie ma operatora
^
lub**
, więc musimy wziąć pod uwagę osobną sprawę i użyć wywołania .NET.Pobiera dane wejściowe
$n
jako tablicę, ustawia nasz wynik$o
jako pierwszą cyfrę. Następnie sprawdzamy.count
tablicę i dopóki jest ona większa niż jedna, wchodzimy doif
. W przeciwnym razie pomijamyif
.Wewnątrz
if
pętli przechodzimy przez tablicę1..$y|%{...}
i każdą iterację przywracamy$o
do nowej wartości, wynik innejif/else
instrukcji. Tak długo, jak nasz licznik$i++
nie jest modulo-5 równy 4 (tzn. Nie jesteśmy przy^
operatorze), po prostu bierzemy$o
i łączymy go z odpowiednim symbolem'+-*/'[$x]
i kolejną liczbą w tablicy wejściowej$n[$_]
. Przesyłamy to doiex
(aliasInvoke-Expression
i podobne doeval
), a to zostaje ponownie zapisane w$o
. Jeśli jesteśmy na^
operatora, jesteśmy welse
, więc możemy wykonać[math]::Pow()
połączenia, i że wynik robi re-zapisywane z powrotem do$o
.W obu przypadkach po prostu wysyłamy dane wyjściowe
$o
do potoku i kończymy , z niejawnym wynikiem.źródło
Rdza,
123, 117 bajtówOryginalna odpowiedź:
głupie długie nazwy metod ^^ ahh znacznie lepiej
bez golfa
źródło
Perl 6 ,
70 68 6562 bajtówWyjaśnienie:
Technicznie
* + *
jest to cokolwiek lambda, ale w rzeczywistości jest takie samo, jak&[+]
skrót dla&infix:<+>
zestawu podprogramów, które obsługują dodawanie liczbowe w postaci niepoprawnej.Nie użyłem tego do mnożenia lub potęgowania, ponieważ sposoby na pisanie ich w ten sposób są przynajmniej tak długie, jak to, co mam (
*×*
lub* * *
i* ** *
)Test:
Przetestuj to na ideone.com
(po aktualizacji do wersji Rakudo, która nie pochodzi z półtora roku przed oficjalnym wydaniem widm Perla 6 )
źródło
Python 3,
8893 bajtówZaczęło się od tego, że był znacznie krótszy, ale potem pierwszeństwo operatora pokonało mnie i musiałem podać wiele nawiasów ...
źródło
Oracle PL / SQL,
275254 bajtówDane należy wstawić do tabeli nazywanej
T
kolumnąN
typuNUMBER
Stosowanie:
Wynik:
Wersja 275 bajtów:
źródło
Java 8,
173172167138137118 118113 bajtówWyjaśnienie:
Wypróbuj tutaj.
źródło
double r=a[0];
, abydouble r=a[0],b;
zaoszczędzić kilka bajtów.float
, ale nie maMath.pow
for floatów, stąddouble
zamiast tego. Dzięki za,b
. I zi++<a.length
otrzymuję ArrayOutOfBoundsException wb=a[i];
(chyba że zrobięi++<a.length-1
zamiast tego, który jest o jeden bajt dłuższy niż krótszy).== 4
na> 3
i== 0
na< 1
. Nie jestem pewien, ale myślę, że możesz trochę zaoszczędzić, tworząc zmienną dlai % 5
.<x
lewy, zmniejszając całą funkcję do 137 znaków.Kilka lew może zmniejszyć podejście @ Willmore'a o 23 do 174 bajtów (wymaga php 5.6 lub nowszego). Najbardziej oszczędzającą częścią jest usuwanie niepotrzebnych nawiasów (-10 bajtów).
Ale użycie
**
operatora zamiastpow()
pozwala również na użycieeval
z tablicą do operacji; i kilkoma sztuczkami ...PHP> = 5,6, 82 bajtów
pobiera listę z parametrów wiersza poleceń. Uruchom
php -nr '<code>'
lub wypróbuj online .stara wersja,
161 157 151 145 144 140 137117 bajtówNajbardziej efektywne gra w golfa pochodzi z zapisania wyniku pośredniego bezpośrednio do pierwszego elementu - po przesunięciu poprzedniego wyniku z tablicy.
awaria
pakiet testowy
źródło
If the array contains just a single number, we return that as the result.
jest całkiem jasne. Ale dziękuję za umożliwienie mi ponownej wizyty.PHP ,
135130 bajtówDzięki @titus, -5 bajtów, plus 0 poprawek!
Wypróbuj online!
Mniej golfa:
Naprawdę był rootowaniem dla array_reduce (), aby do tego działać, ale wymaga zbyt wielu znaków, aby pobić bieżący najniższy wynik PHP.
Publikowanie go mimo to na wypadek, gdyby ktoś miał jakieś sugestie!
źródło
$c
trafi0
. Zapisz dwa bajty z anonimową funkcją zamiastw
.eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
jest o sześć bajtów krótszy i powinien rozwiązać problem zerowy.Brachylog , 68 bajtów
To długo… ale nie korzysta z predykatu oceny.
Wyjaśnienie
Główny predykat
Predykat 1
źródło
IBM PC 8087 FPU,
6682 bajtyDo obliczeń wykorzystuje wyłącznie koprocesor matematyczny Intel 8087 komputera IBM.
Wypróbuj offline! (w DOSBox lub cokolwiek innego). Daj znudzonemu chipowi 8087 staremu komputerowi coś do zrobienia, inne niż wszystkie arkusze kalkulacyjne Lotus 1-2-3, które robiłeś w latach 80-tych.
Nie golfowane (niezmontowane):
Wynik:
Wprowadzanie odbywa się za pomocą PROC (x86 najbardziej równoważne funkcji), przy czym BX jest wskaźnikiem do tablicy WORD w pamięci, a CX jest liczbą elementów i zwraca wynik w ST.
* Uwaga: Rzeczywisty kod funkcji to
6682 bajty. Oczywiście kod po prostu do zapisania liczby zmiennoprzecinkowej na konsoli (kod książki kucharskiej) ma 83 bajty. Program testowy i dane są183215 bajtów, co czyni plik wykonywalny .COM305Łącznie 380 bajtów.źródło
APL (Dyalog Unicode) ,
2927 bajtów SBCSAnomymiczna ukryta funkcja prefiksu. Zauważ, że
*
jest to potęgowanie w APL.Wypróbuj online!
Ponieważ APL wykonuje się od prawej do lewej, możemy po prostu odwrócić kolejność argumentów wstawionych operacji i odwrócić całe wyrażenie. Postfiks
⍨
odwraca argumenty. Po wykonaniu idealnego losowania liczb i operacji wystarczy tylko cofnąć, spłaszczyć i ocenić:≢{
…}⊢
Wywołać następującą funkcję z liczbą rzeczywistych liczb jako⍺
i⍵
:'⍨'
ta postać'+-×÷*',¨
dołącz do tego każdy z tych znaków;["+⍨","-⍨","×⍨","÷⍨","*⍨"]
⍺⍴
za pomocą lewego argumentu (liczba cyfr) cyklicznie R eshape że⌽
rewers⍕
format jako ciąg płaski3↓
upuść 3 wiodące znaki (spację i symbol oraz⍨
)⍎
wykonać jako kod APLźródło
Japt , 16 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
c #,
238, 202 bajtówNie widziałem żadnego rozwiązania c #, więc dam jedno. To jest mój pierwszy codegolf. Zacząłem pisać w c # „dwa miesiące temu” (choć do pewnego stopnia znam Javę).
Używa stosu
Przypadki bez golfa i testy
Wynik:
źródło
a, Double.Parse
->a,Double.Parse
;while (s.Count
->while(s.Count
;Pow(l, r)
->Pow(l,r)
). Możesz również usunąćint
przedj=
i umieścić go zaint i=0,j;
. Świetna pierwsza odpowiedź i jeszcze raz witamy. :)PHP,
206,198, 197 bajtówNie golfił
W PHP logika podobna do mojej c # answer ( 202 bajtów ) :).
źródło