Zaimplementuj prosty skryptowy kalkulator operacji na liczbach całkowitych.
Pojęcie
Akumulator zaczyna się od 0 i wykonuje na nim operacje. Na koniec programu wypisuje wartość akumulatora.
Operacje:
+
dodaje1
do akumulatora-
odejmuje1
od akumulatora*
mnoży akumulator przez2
/
dzieli akumulator przez2
Przykładowy skrypt
Dane wejściowe ++**--/
powinny dawać dane wyjściowe 3
.
Przykładowa implementacja
def calc(s)
i = 0
s.chars.each do |o|
case o
when '+'
i += 1
when '-'
i -= 1
when '*'
i *= 2
when '/'
i /= 2
end
end
return i
end
Zasady
- To jest golf golfowy , więc najniższa odpowiedź w bajtach wygrywa, ale nie jest wybrana.
- Zachęca się do kreatywnych wdrożeń.
- Standardowe luki są zabronione.
- Otrzymujesz program za pomocą stdin lub argumentów i możesz wyprowadzić odpowiedź za pomocą wartości zwracanej lub stdout.
- Baw się dobrze.
- Podział jest obcinany, ponieważ jest to podział na liczby całkowite.
- Program
-/
powraca-1
.
Przypadki testowe
*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342
code-golf
math
number
arithmetic
dkudriavtsev
źródło
źródło
/
może dawać liczby całkowite.-/
zwrócić?Odpowiedzi:
Python 2, 48 bajtów
Czy
+2
,-2
,*2
, lub/2
. Dzięki temu+2
i-2
zamiast+1
a-1
, pracujemy w podwójnych jednostek, więc ostateczne potrzeby wyjściowe o połowę. Poza tym podział podłogi/
musi teraz zaokrąglić w dół do wielokrotności 2, co jest zrobione&-2
.źródło
0q{2\~-2&}/2/
(2\~
ewaluuje operator z drugim operandem2
,-2&
jest bitowy AND,2/
jest końcowym podziałem na dwa.q{...}/
Jest foreach nad wejściem i0
jest tylko początkowym wartość.)Haskell, 51 bajtów
Przykład użycia:
foldl(#)0 $ "++**--/"
->3
.źródło
Galaretka ,
1817 bajtówWypróbuj online!
Jak to działa
Pierwsze sześć linii definiuje linki pomocnicze o indeksach od 1 do 6 ; zwiększają, nic nie robią, zmniejszają, nic nie robią, zmniejszają o połowę (podłogi) i podwajają.
Główny link -
O0;ṛĿ/
- konwertuje znaki wejściowe na ich punkty kodowe (O
), wstawia wartość 0 (wartość początkowa) do tablicy punktów kodowych0;
, a następnie zmniejsza wygenerowaną tablicę w następujący sposób.Wartość początkowa jest pierwszym elementem tablicy, tzn. Poprzedzonym 0 . Szybkie łącze
ṛĿ
jest wywoływane dla każdego następnego elementu w tablicy, przy czym ostatnia zwracana wartość to lewy argument, a bieżący element - prawy. Sprawdzaṛ
poprawny argument ( ) i monadycznie ocenia łącze z tym indeksem (Ŀ
), stosując w ten sposób żądaną operację.źródło
Python 2, 54 bajty
Dane wejściowe są traktowane jako literał łańcuchowy.
~ord(c)%5%3
odwzorowuje operatorów na odpowiednie odpowiednie operandy.Wcześniej korzystałem,
hash(c)%55%3
co nie dawało spójnych wyników między różnymi wersjami Pythona. Zachęciło mnie to do zbadania innych formuł.źródło
hash
jest specyficzna dla wersji Python - ideone używa wersji 2.7.10, która daje[1, 1, 2, 2]
cztery mapowania, podczas gdy lokalnie w wersji 2.7.12 otrzymuję[2, 0, 1, 0]
SILOS ,
133211 bajtówPobiera kody ASCII operatorów.
Wypróbuj online z przypadkami testowymi:
-/
++**--/
*///*-*+-+
źródło
-/
powinien zwrócić -1 , a nie 0 .Maszyna Turinga - 23 stany (684 bajty)
Wypróbuj tutaj - bezpośredni link
Dane wejściowe nie powinny zawierać żadnego „*”, ponieważ jest to znak specjalny w kodzie maszynowym Turinga. Zamiast tego użyj „x”. Wysyła odpowiedź w formacie binarnym.
Kod nieobjawiony
Objaśnienie stanów:
Inicjalizacja:
te stany są odwiedzane raz na początku każdego uruchomienia, zaczynając od init2
Instrukcje czytania:
te stany będą odwiedzane wiele razy w całym programie
readop: Przechodzi do końca w prawo, dopóki nie odczyta operatora lub „.”. Jeśli uderza operator, zmień na odpowiedni stan (+, -, x, /). Jeśli trafi w „.”, Zmień na „płetwa”.
return: Zwraca głowę do pustej przestrzeni między sumą bieżącą a operatorami. Następnie zmienia się na „readop”.
Operacje:
te operacje wykonują faktycznie brudną robotę
+: Poruszaj się w lewo, dopóki głowa nie odczyta żadnego spacji. Jeśli ta postać to „-”, przesuń się w lewo i zmień na „dec”. W przeciwnym razie zmień na „inc”.
-: Podobne do „+”, z wyjątkiem zmiany na „inc”, jeśli w przeciwnym razie występuje „-” i „dec”.
inc: Jeśli cyfra pod głową to 0 (lub biała spacja), zmień ją na 1 i zmień na „zero”. Jeśli cyfra to 1, zmień ją na 0, a następnie powtórz na następnej cyfrze.
dec: Podobnie jak inc, z tym wyjątkiem, że 1 idzie do 0, 0 idzie do 1, a jeśli głowa czyta biały znak, zmień na „neg”.
x, x0, x1: Przesunięcie bitowe cyfry jeden w lewo. Zmień na „return”.
/, //, div, div0, div1: Przesuń całkowicie na prawo od liczby, a następnie przesuń bitowo jeden w prawo. Jeśli występuje „-”, zmień na „inc”. To symuluje zaokrąglanie w dół liczb ujemnych. W przeciwnym razie zmień na „zero”
neg: umieść „-” po numerze, a następnie zmień na „readop”
zero, zero1, zero2: Usuń wiodące zera i zmień na „readop”
Oczyszczanie: Prezentuje dane wyjściowe
źródło
Perl 6 ,
5352 bajtyWyjaśnienie:
Stosowanie:
źródło
C,
636257 bajtówWandbox
źródło
05AB1E , 20 bajtów
Dzięki Enigma za naprawienie
-/
błędu!Do 16 bajtów, jeśli nie całkowita podziału:
Î"+-*/""><·;"‡.V
.Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
-/
powinien zwrócić -1 , a nie 0 .Î…+-*"><·"‡'/"2÷":.V
za pomocą tej samej liczby bajtów.JavaScript ES6,
8068 bajtówZaoszczędził aż 12 bajtów dzięki Neilowi!
źródło
"c"+
i napisał"c+1 c-1 c*2 c/2|0".split
itp.o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]
, lub myślę, że możesz następnie zapisać kolejny bajt za pomocąo=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o]
.k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)
może i tak będzie działać jeszcze krócej, ale straciłem rachubę ...}
i[o]
, więc w rzeczywistości ma on tylko 66 bajtów. Ponadto wyjaśniono PO;-/
powinien zwrócić -1 , a nie 0 .Rubinowy,
484442 + 1 = 43 bajty+1 bajt dla
-n
flagi. Pobiera dane wejściowe na STDIN.Zobacz to na ideone (używa,
$_
ponieważ ideone nie przyjmuje flag wiersza poleceń): http://ideone.com/3udQ3Hźródło
PHP 76 bajtów
źródło
Python 2,
5856 bajtów-2 bajty dzięki @Lynn
W porządkowe bohaterów
+-*/
są43,45,42,47
modulo 11 są10,1,9,3
modulo 3 to są1,1,0,0
2 mniej te są1,1,2,2
dając kwot musimy dla każdej operacji:r=r+1
,r=r-1
,r=r*2
, ir=r/2
Poprzedni:
źródło
2-ord(c)%11%3
?Mathematica,
837370 bajtów10 bajtów zapisanych z powodu @MartinEnder .
Funkcja anonimowa. Pobiera listę znaków jako dane wejściowe i zwraca liczbę jako dane wyjściowe. Sugestie dotyczące gry w golfa mile widziane.
źródło
SILOS ,
175164 bajtówWypróbuj online!
Zdrowa metoda wprowadzania. Prawidłowy podział na liczby całkowite (zaokrąglenie w kierunku-nieskończoności).
źródło
C #,
8781 bajtówNie golfowany:
Zakłada się, że dane wejściowe są prawidłowe. Dzielenie przez dwa odbywa się poprzez przesunięcie jednego bitu w prawo, ponieważ regularne dzielenie zawsze zaokrągla w kierunku zera, a przesunięcie bitu zawsze zaokrągla w dół. Inkrementacja i dekrementacja umożliwiają wygodne wykorzystanie 1 odległości między kodami ASCII dla
+
i-
.źródło
int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);
(65 bajtów)JavaScript (ES6), 57 bajtów (tablica) / 60 bajtów (liczba całkowita)
Zwracanie tablicy wszystkich wyników pośrednich:
Na przykład wynikiem
"++**--/"
będzie[1, 2, 4, 8, 7, 6, 3]
.Zwracanie tylko wyniku końcowego:
Jak to działa
Oba rozwiązania są oparte na tej samej idei: za pomocą funkcji skrótu idealny
eval(2+c+3)&3
do mapowania różnych znaków operatorac
w[0, 3]
.źródło
JavaScript (ES6), 57
Uwaga: wartość początkowa akumulatora jest ciągiem programu, przy użyciu operacji bitowych (~, >>, <<, |) przy pierwszym użyciu jest przekształcana na 0.
Na marginesie, sprytna odpowiedź @xnor uzyska 40 punktów przeniesionych do javascript:
(jeśli ci się spodoba, głosuj na niego)
Test
źródło
Java, 77 bajtów
Korzysta z 8 strumieni Java.
źródło
r >> 1
nar>>1
zaoszczędzisz 2 bajty?s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);
która da ci 56 bajtówGNU sed,
655957 bajtówEdycja: 2 bajty krótsze dzięki komentarzom Toby'ego Speighta
Biegać:
Wydajność:
sed
Scenariusz przygotowuje wejście dladc
wywołania powłoki na koniec, ten ostatni przyjmując wejście w notacji polskiej tyłu . Przy dzieleniu, jeśli liczba jest ujemna (d0>
), wywoływane jest[1-]
polecenie zmniejszenia zapisane w rejestrze@
. Przykład konwersji:+ - * /
->1+ 1- 2* d0>@2/
.źródło
[1-]
wzorca ...s
zS
. Zapomniałem, że to nie zastępuje stosu rejestru, tylko na niego naciska, wywołując efekt przeciwny do tego, czego chciałem (ponieważ używałem go do każdego/
). Cytaty są nadal potrzebne, ponieważ masz w nich/
symbole, dzięki czemu ciąg interpretowany jest jako ścieżka do pliku :) Ogoliłem jeszcze 1 bajt, usuwając spację po-e
.-e
jako nazwy pliku, więc nie potrzebujesz cudzysłowów/
- spróbuj! Myślę, że rozsądne jest, aby golfista wymagał, aby bieżący katalog roboczy nie zawierał żadnych plików zaczynających się od01s@
lub0-s@
.-e
do tego/
, jednak cytaty są nadal wymagane, jak właśnie zobaczyłem.>
Jest interpretowana bezpośrednio przez powłokę jako operator przekierowania myślę, bo mam ten błąd:cannot create @2/d0: Directory nonexistent
>
. W końcu potrzebujesz cytatów. Przepraszamy za próbę wprowadzenia w błąd! I chociaż dodanie odwrotnego ukośnika wygląda jak jedna postać, należy go podwoić ws///
zastępstwie, więc nie ma żadnej korzyści ...PHP, 75 bajtów
Wykorzystuje zmodyfikowaną wersję odpowiedzi Jörga Hülsermanna .
W dużej mierze opiera się na podstawianiu ciągów znaków, używając prostego wyrażenia regularnego (
~.~
).Zmienna
$s
jest ponownie przypisywana z nową wartością dla każdego znaku. Na koniec wyprowadza wynik.Uwaga : To ma być wykonane przy użyciu
-r
flagi.Wypróbuj tutaj:
Pokaż fragment kodu
Lub spróbuj na: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa
Różnice:
echo$s
używamsprintf($s)
. Oba wykonują tę samą akcję na liczbach. Ponieważ jest to tylko do testowania, jest w porządku.++*+
jako pierwszy argument, który powinien zostać wyświetlony5
.źródło
e
Modyfikator jest z powrotem! : De
, który został zastąpiony przezpreg_replace_callback
i może być wykorzystany do ... ale to nie do końca.Partia, 61 bajtów
Tłumaczenie znakomitej odpowiedzi Python na xnor.
źródło
Pyke,
2422 bajtówWypróbuj tutaj!
Lub 12 bajtów (niekonkurencyjny)
Wypróbuj tutaj!
Dodaj
translate
węzeł - w zasadzie wiele znajdź i zamień.źródło
PHP,
10410282 bajtówPierwsza wersja z eval:
Druga wersja z operatorami trójskładnikowymi:
Bierze ciąg wejściowy jako pierwszy argument z wiersza poleceń.
To „tylko” działa na ciągi wejściowe krótsze niż 10 000 znaków - co powinno być wystarczające. Testowane ze wszystkimi przypadkami testowymi, niestety nie można początkowo zaoszczędzić na inicjalizacji.Druga wersja działa z ciągami o dowolnej długości i bez inicjalizacji. :-)Głównym elementem jest funkcja eval, która manipuluje
$i
na podstawie mapy operacji arytmetycznych, które są dość proste, z wyjątkiem podziału. PHP zwraca liczbę zmiennoprzecinkową podczas używania/
iintdiv
ma za dużo bajtów, więc wykonujemy przesunięcie w prawo .Aktualizacje
$i=$i>>1
do$i>>=1
podziału liczb całkowitych.źródło
Python 3,
986660 bajtówDzięki Tukkax!
Nie tak golfowa jak druga odpowiedź, ale nie mogę z nimi konkurować bez plagiatu.
Mam też rekurencyjne rozwiązanie lambda
7367 bajtów (ulepszone!)źródło
i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i)
. (oczywiście niepoprawnie sformatowane). Myślę też, że powinieneś wspomnieć, że używasz Python3. W Python2input()
miałby wartośćint(raw_input())
.+-
robi 1)R, 201 bajtów
Grał w golfa
Skomentował
Strategia polega na dopracowaniu
+, -, %
operatorów. Podziel ciąg, a następnie przeanalizuj go na długą listę funkcji, które zostaną wprowadzone doReduce()'s
akumulatora.Nie mogłem już grać w golfa. Jeśli ktoś może zabrać się
b=body<-
do pracy, może być kilka bajtów oszczędności (dopracuj każdą funkcjęb
później"-"="+"="/"="*"
). Początkowo próbował zastąpić i przeanalizować ewaluację, ale kolejność operacji i nawiasy były przerażające.źródło
f, ...
w definicjiReduce
funkcji i pozbyciestdin()
sięscan
, ale po prostu starał naiwny podejście, które zrzuciło jeszcze dwa bajty, definiując funkcje nieco inaczej. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/…Lex + C,
78,74, 73 bajtyPierwsza postać to spacja.
Odczytuje z
stdin
, zwraca wynik.Kompiluj z
lex golfed.l && cc lex.yy.c main.c -lm -lfl
testowym głównym:źródło
JavaScript (ES5), 127 bajtów
Nie golfowany:
źródło
Pyth, 23 bajty
Pełny program, który pobiera dane wejściowe jako ciąg i wypisuje wynik.
To jest port odpowiedzi Python @ xnor .
Wypróbuj online
Jak to działa
źródło
u@[yGhG0tG0/G2)CHQ0
19 bajtówPHP, 79 bajtów
źródło
1
; musisz podzielić i pomnożyć przez2