Tło:
Standardowa matematyka operacji, taka jak podstawowe dodawanie i mnożenie w świecie rzeczywistym, działa w następujący sposób:
12 + 123 = 135
i
12 * 123 = 1476
To nie jest interesujące i nudne! Wiele szkół interpretuje to już jako praktykę, praktykę, praktykę algorytmów formalnych. Oznacza to dość sztywną i nudną dietę matematyczną i nie jest to cel tego wyzwania. Przygotuj się na zabawę na naszej ukochanej stronie.
Rozważ proces dodawania dwóch dodatnich liczb całkowitych, a następnie ponownego dodawania wszystkich cyfr jego wyniku. Powtarzanie z dodawaniem, dopóki nie zostanie uzyskana tylko jedna cyfra. Na przykład:
- Wynik
12 + 123
to 135. - Dodając wszystkie cyfry 135 otrzymujemy
1 + 3 + 5 = 9
.
Liczba kroków wymaganych do uzyskania wartości jednocyfrowej 9 w tym powtarzanym dodaniu wynosi 2.
Podobnie jak w poprzednim procesie dodawania, mnożenie dwóch dodatnich liczb całkowitych odbywa się w ten sam sposób. Pomnóż wszystkie cyfry wyniku, a następnie powtarzaj ten proces, aż pozostanie tylko jedna cyfra. Weź powyższy przykład:
- Wynik
12 * 123
to 1476. - Pomnóż wszystkie uzyskane liczby 1476
1 * 4 * 7 * 6 = 168
. - Pomnóż ponownie wszystkie otrzymane cyfry 168
1 * 6 * 8 = 48
. - Pomnóż ponownie wszystkie otrzymane cyfry 48
4 * 8 = 32
. - Pomnóżmy jeszcze raz wszystkie uzyskane cyfry 32
3 * 2 = 6
.
Liczba kroków wymaganych do uzyskania wartości jednocyfrowej 6 to powtarzane mnożenie wynosi 5.
Ze względu na to wyzwanie i unikanie niewłaściwego używania notacji matematycznych przedstawiam te dwa fikcyjne notacje: (+)
i (*)
, ale możesz użyć dowolnej notacji, którą lubisz , która działa jak poniżej:
- Proces powtarzanego dodawania w celu uzyskania pojedynczej wartości to
12 (+) 123 = 9
. - Operacja powtarzania procesu mnożenia w celu uzyskania pojedynczej wartości to
12 (*) 123 = 6
.
Wyzwanie:
Wyzwanie polega na napisaniu programu lub funkcji, która może wykonywać obie operacje, jak wyjaśniono w części dotyczącej tła: (+)
i (*)
.
Wejście:
Wejściami programu lub funkcji są dwie dodatnie liczby całkowite i jedna operacja (+)
oraz (*)
. Format danych wejściowych jest arbitralnym wyborem programisty . Możesz formatować wejściowe, na przykład, a (+) b
lub F(a, (+), b)
lub dowolnego formatu chcesz.
Wynik:
Dane wyjściowe programu lub funkcji muszą zawierać wynik operacji i liczbę kroków wymaganych w formacie freestyle zgodnie z życzeniem.
Przypadki testowe (zignoruj format wejściowy i wyjściowy):
81 (+) 31 --> (4 ; 2)
351 (+) 14568 --> (6 ; 3)
21 (*) 111 --> (8 ; 3)
136 (*) 2356 --> (0 ; 2)
Główne zasady:
- To jest golf golfowy , więc najkrótsza odpowiedź w bajtach wygrywa.
Nie pozwól, by esolangi zniechęcały Cię do publikowania odpowiedzi w zwykłych językach. Podejmij wyzwanie, udzielając możliwie najkrótszej odpowiedzi w języku programowania. Jeśli zamieścisz sprytną odpowiedź i jasne wyjaśnienie, Twoja odpowiedź zostanie doceniona (stąd głosy poparcia) niezależnie od używanego języka programowania. - Odpowiedzi dotyczą standardowe zasady , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów itp. Wybór należy do Ciebie.
- Jeśli to możliwe, twój program może poprawnie obsługiwać duże liczby. Jeśli nie, będzie dobrze.
źródło
Odpowiedzi:
Dyalog APL ,
33323029 bajtówRozszerza to APL o zapis prefiksu
+/A n₁ n₂
i×/A n₁ n₂
. (W rzeczywistości możesz użyć dowolnej operacji po lewej stronie/A
.) Zwraca listę {wynik, liczba powtórzeń}.Wypróbuj APL online! (
⍎
został emulowany zee
względów bezpieczeństwa.)Dzięki @ngn za zapisanie bajtu.
0 bajtów (w jest)
Dyalog APL faktycznie ma już pełne wsparcie matematyki Anastasiyan; zamiast
(+)
i(×)
używa+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
i×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
.Spróbuj
81 +{(⊃,≢)⍺⍺{∪⍵,⍨⍺⍺e¨⍕⊃⍵}⍣≡⍺⍺/⍺⍵} 31
i21 ×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/e¨⍕⍵}⍣=⍵⍺⍺⍨⍺} 111
.źródło
⎕FR←1287
(tj użyć IEEE 754-2008 128-bitowy dziesiętny F loating-punktową R ePresentation) oraz⎕PP←34
(tj naciśnij 34 bohaterów P rukuj P recision), można użyć liczb całkowitych poniżej 10³⁴.+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
i×{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
wciąż sporo bajtów? Jestem zdezorientowany, jak to jest 0 bajtów ..: S(+)
byłby Anastasiyan +. Dyalog APL obsługuje matematykę Anastasiyan, ale wykorzystuje inny wieloznakowy glif, tak samo jak*
moc i potrzeba×
namnażania, podczas gdy/
replikacja i potrzeba÷
dzielenia.(+)
ciebie masz+{n←0⋄n,⍺⍺{n+←1⋄⍺⍺/⍎¨⍕⍵}⍣=⍵⍺⍺⍨⍺}
jako dane wejściowe, ale ponieważ OP rzeczywiście stwierdził, że zrobi to dowolny format wejściowy, możesz użyć tej funkcji jako parametru. Hmm, zastanawiam się, czy jest to również możliwe w innych językach programowania, które obsługują funkcje jako dane wejściowe.Haskell, 108 bajtów
Określa funkcję
#
, która pierwsza przyjmujea
ib
i operatorao
. Ciekawostka: działa z dowolnym operatorem (właściwie dowolną funkcją)!źródło
Integer
typ Haskella jest nieograniczony.Pyke, 16 bajtów
Wypróbuj tutaj!
Pobiera mnożenie jako
B
i dodawanie jakos
. Dwa wejścia numeryczne są oddzielone przecinkami.źródło
JavaScript (ES6), 59
Funkcja rekurencyjna, format wejściowy jest dostosowany w celu uproszczenia wywołania rekurencyjnego:
Test
źródło
Python 2, 60 bajtów
Dane wejściowe są ciągami typu
81+31
, dane wyjściowe to krotka ciągu singletonów i licznik (np('4', 2)
.Przetestuj na Ideone .
źródło
f(['81', '31'],'+')
Można zapisać kolejny bajt, ale wydaje się, że rozciąganie reguł jest nieco za daleko ...operator.add
luboperator.mul
odpowiednio;)Pyth, 16 lat
Pobiera dane wejściowe jak
"+ 123 12"
do dodawania i"* 123 12"
mnożenia. Wyjścia jakresult<linefeed>steps
.Wypróbuj tutaj lub uruchom pakiet testowy , ale pamiętaj, że zależy to od eval, więc tylko wariant dodatkowy będzie działał w tłumaczu online. Mnożenie działa poprawnie z tłumaczem offline.
Korzysta z funkcji skumulowanej redukcji, aby utworzyć listę wyników pośrednich, więc
"+ 351 14568"
otrzymujemy[14919, 24, 6]
. Działa to, ponieważ liczby jednocyfrowe są stałym punktem dodawania i mnożenia Anastasiya. Następnie otrzymujemy ostatni element tablicy oraz jej długość.Będzie to działać dla dowolnie dużych liczb, przynajmniej do momentu wyczerpania pamięci.
źródło
R,
175167164140134127126119 119 bajtówNie golfowany:
ifelse
wrócił ! Tak !Nie
Stosowanie :
Bardzo dziękuję @plannapus za grę w golfa na 24 bajty!
-7 bajtów dzięki dobrym pomysłem @Vlo !
źródło
strtoi
! Jeszcze 4 bajty, że mnie pobiłeś.05AB1E ,
2015 bajtówWyjaśnienie
Operator to 1 za dodanie, 0 za pomnożenie.
Wypróbuj online
źródło
Galaretka ,
1110 bajtówDane wejściowe to para cyfr i albo
+
albo×
.Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Kod maszynowy ARM, 48 bajtów
Zrzut szesnastkowy:
Ta funkcja nie zależy od wywołań systemowych ani funkcji bibliotecznych. Jest to kod Thumb-2, który jest kodowaniem instrukcji o zmiennej długości (2 lub 4 bajty) dla 32-bitowego ARM. Zatem maksymalna wartość, którą może przetworzyć, to 2 ^ 32-1. 2 bajty mogłyby zostać upuszczone, gdyby nie były zgodne z AAPCS ( 46 bajtów ), ponieważ nie musielibyśmy układać rejestrów na początku.
Zestaw bez golfa (składnia GNU):
Skrypt testowy w C:
źródło
R,
130124 znakiNieco inne podejście niż @ Frédérica :
Wcięte, z nowymi liniami:
Linia 4 prawdopodobnie potrzebuje więcej wyjaśnień:
Przypadki testowe:
źródło
f
bycie zarówno nazwą funkcji, jak i jednym z jej argumentów :)Oktawa, 85 bajtów
MATLAB, 123, 114, 105, 94 bajtówPostanowiłem przetłumaczyć to na Octace, skorzystać z bezpośredniego indeksowania i zwiększyć możliwości. Pobiera dane wejściowe z formularza:,
f(a,operator)
gdziea = [number1, number2]
ioperator==1
podaje produkt ioperator==2
podaje sumę.Objaśnienia:
g={@prod,@sum}{o}
: Wybiera odpowiednią funkcję, produkt lub sumę i przypisuje ją dog
x=g(a)
przyjmuje sumę lub iloczyn nakładówi=1; ... i++
: Inkrementator zliczający liczbę krokówUsunięto dwie nowe linie, spację i umieściłem obie liczby wejściowe w wektorze zamiast osobnych argumentów. Zaoszczędzono 9 bajtów dzięki pajonk! Usunięto,
k=@(x)...
aby zapisać kolejne 11 bajtów dzięki zlewce =) Wreszcie przetłumaczono całą rzecz na Octave, aby zapisać kolejne 9 bajtów ...źródło
Java,
164159146 bajtówPierwszy argument to tylko licznik, zawsze 0
Drugi argument to metoda, 0 dla ADD i 1 dla MULTIPLY.
Trzeci argument to tablica ciągów znaków, która zawiera wartości do dodania / pomnożenia.
Nie golfił
dzięki @Kevin Cruijssen za skrócenie kilku bajtów.
dzięki @milk za golenie 5 bajtów.
Program testowy
źródło
m==0
może byćm<1
iInteger.parseInt
może byćInteger.decode
.j
na końcu potrzebujesz tego var? Inlining(r+"")
dwukrotny wygląda, jakby ogolił kilka bajtów.Galaretka , 17 bajtów
Wypróbuj online!
Biorąc pod uwagę takie argumenty
x y 1
, oblicza to sumę Anastasiyax (+) y
.Biorąc pod uwagę takie argumenty
x y 0
, oblicza to produkt Anastasiyax (*) y
.Dane wyjściowe są podane jako
[number of steps, result]
.źródło
Python,
160146129 bajtówWkrótce opublikuje wyjaśnienie.
Dane wejściowe mają postać
12+12
lub5*35
(z normalnym+
i*
znakami) i zakładają, że są to jedyne dwa operatory.Może obsłużyć tak duże liczby, jak pozwala na to pamięć komputera.
Jestem prawie na pewno przekonany, że może być dalej.
EDYCJA:
1631 bajtów zapisanych dzięki @Copper.źródło
"+" if "+" in s else "*"
na"*+"["+"in s]
, a następnie zamiast przypisywać got
, po prostu dodaj go bezpośrednio wexec
połączeniu.R, 110 bajtów
Korzystanie z rozdzielacza @plannapus.
function(A,F,B){r=Reduce;x=r(F,A,B);y=1;while(x>9){m=nchar(x);x=r(F,x%%10^(1:m)%/%10^(1:m-1));y=y+1};cat(x,y)}
Wynik
edycja: Nie mogę liczyć.
źródło
Clojure 126 bajtów
Funkcja nazywa się tak:
Oto kod niepoddany golfowi:
Pamiętaj, że Clojure wciąż jest dla mnie nowy, więc prawdopodobnie nie jest to najlepsze rozwiązanie. Mimo wszystko wyzwanie było fajne. Dodatkowo kod działał z bardzo dużymi liczbami bez żadnych trudności.
źródło
Perl 6 53 bajtów
Ponieważ
( 12, &[+], 123 )
jest to akceptowalne dla danych wejściowych, mogę sprowadzić je do 53 bajtów.(
&[+]
jest skrótem od&infix:<+>
„czci” dla operatora dodawania przyrostków numerycznych)Gdyby drugi argument miał być łańcuchem
(+)
, miałby 87 bajtówWyjaśnienie:
Test:
Normalne użycie:
źródło
Python 2,
10797 bajtówAnonimowa funkcja, która pobiera dane wejściowe za pomocą argumentu pierwszego operandu
a
, operatorao
('+'
lub'*'
) i drugiego operandub
i zwraca listę formularza[result, steps]
.Jak to działa
Funkcja anonimowa tworzy ciąg, łącząc operandy z operatorem między nimi, a następnie ocenia go; jest to pierwszy krok opisany w pytaniu. Następnie ta wartość i operator są przekazywane do funkcji rekurencyjnej
g
. Tutaji
używany jest licznik , który jest zwiększany dla każdego połączenia rekurencyjnego. Jeśli wartość wejściowa jest mniejsza niż10
, musi zostać osiągnięta pojedyncza cyfra, więc to ii
są zwracane. Jeśli nie, dane wejściowe są konwertowane na ciąg znaków, a każdy znak w tym ciągu jest łączony z operatorem, co daje pożądane obliczenia, które są następnie oceniane i przekazywane do funkcji rekurencyjnie.Wypróbuj na Ideone
źródło
Groovy, 102 bajty
Degolfed
Wyjaśnienie
Na podstawie doskonałego rozwiązania @Sean Bean dla Java.
p
: Zamknięcie (funkcja, lambda, cokolwiek), które implementuje rozwiązaniet
:p
Zawsze należy wywoływać bieżącą głębokość połączenia (liczbę iteracji)t=1
m
: Operacja do wykonania,0
„dodaj”,1
„pomnóż”d
: Lista operandów, każdy operand jest obiektem typu Stringe
: Elementyd
każdego z nich przekonwertowane na liczbę całkowitąr
: Suma lub iloczyne
, zależnie od operacjim
r > 9
:r > 9
), ponownie wywołaj, zwiększając głębokośćt
i konwertującr
na listę ciągów cyfr (i zwracaj wynik).r
it
jako listę.Program testowy
Wyniki
źródło
Haskell,
7670 bajtówZwraca listę dwóch elementów z wynikiem i liczbą kroków. Działa dla dowolnych dużych liczb. Przykład użycia:
(351#14568)(+)
->[6,3]
.Edycja: Dzięki @BlackCap na 6 bajtów.
źródło
(-48+).fromEnum
zread.pure
R, 91 bajtów
Używając kodu @ Vlo, który korzysta z rozdzielacza @ plannapus, oraz kilku pomysłów, które wygenerowałem podczas gry w golfa w odpowiedzi @ Frédéric, jest to najkrótsza jak dotąd odpowiedź R. (Niezwykle duża liczba odpowiedzi R dzisiaj tutaj ...)
Co najważniejsze, wymaga to, aby dane wejściowe dla operatora były albo
sum
dla (+) alboprod
dla (*). Zgodnie z zasadami wyzwania wydaje się to w porządku.Z wcięciem:
Główne różnice w stosunku do odpowiedzi @ Vlo to:
Reduce
, polegamy na tym, że argument wejściowy jest funkcją i po prostu wywołujemy go jawnie. (Tak, dla funkcji będących obiektami pierwszej klasy!)T
, co ocenia sięTRUE
(aka1
), ale ponieważ nie jest to zmienna Reserved możemy go modyfikować. TakT+T
jest2
. Używamy tego jako naszego licznika.cat
ing wyjściowy, po prostu zwracamy go jako wektor zc
. Oprócz oszczędzania dwóch bajtów, fakt, że wyjście jest wtłaczane do wektora, zapewniaT
klasęnumeric
. Jeśli użyjemycat
, aT
nie zwiększono, otrzymamy błędne dane wyjściowe jak1 TRUE
.źródło
while
pętlę w następujący sposób zmieniaF
się coś innego, aby uniknąć konfliktów nazw:function(A,O,B){x=O(A,B);while({F=F+1;x>9})x=O(x%/%10^(1:nchar(x)-1)%%10;c(x,F)}}
. To niesamowite, ile sztuczek w golfa R wymyśliliśmy w ciągu ostatnich kilku lat :)T
iF
counter-trick w funkcji jest w rzeczywistości nieprawidłowe, ponieważ oznacza to, że funkcję można wywołać tylko raz. Więc ta odpowiedź (i kilka innych moich!) Jest nieprawidłowa, chyba żerm(T)
na końcu jest wyraźne . Będę nadal szukał tego meta postu, aby mieć pewność, że nie wymyśliłem go.T
iF
trik jest całkowicie poprawna, o ile nie modyfikujeszT
aniF
w środowisku globalnym. na przykładf=function(){T=T+1;T}
konsekwentnie zwraca2
. Myślę, że to jest meta słup, do którego odnoszą.Rubinowy, 55 bajtów
Połączenie rekurencyjne. Kiedyś bardzo różnił się od odpowiedzi JavaScript @ edc65, ale kiedy zoptymalizowałem, ostatecznie stał się portem bezpośrednim opracowanym prawie niezależnie od ich odpowiedzi, minus jedna końcowa optymalizacja polegająca na sprawdzeniu ewaluowanego wyniku zamiast długości przekazywanej listy argumentów , co pozwoliło mi przekroczyć liczbę bajtów.
Dane wejściowe to ciąg znaków reprezentujący operator oraz tablica zawierająca operandy.
Wypróbuj online.
źródło
i=0
i zapomniałem przy refaktoryzacji.Perl, 38 bajtów
Obejmuje +2 za
-ap
Uruchom z danymi wejściowymi STDIN i odstępami wokół operatora:
Wyjście to cyfra, a kroki oddzielone są
+A
amath.pl
:Jeśli wyprowadzanie kroków w unary jest prawidłowe, ta 35-bajtowa wersja działa lepiej:
źródło
Mathematica,
10594 bajtówKod.
Stosowanie.
Wyjaśnienie.
Dwie funkcje
x
(dla (+)) iy
(dla (*)) są tworzone jednocześnie, zastępując parametryf
io
wz ich odpowiednimi wartościami. Na
x
,f
staje się#1 + #2
io
stajePlus
; boy
odpowiednio stają się#1 #2
iTimes
. Przepisanie funkcjix
dla ostatniej części objaśnienia:źródło
Java 7,
203195192 bajtówWykorzystuje
long
(maksymalna wartość 2 63 -1). Jeśliint
zamiast tego użyje (maksymalna wartość 2 31 -1), będzie to tylko 1 bajt mniej ( 191 bajtów ):Najprawdopodobniej można go nieco pograć w golfa. Konieczność wydrukowania kroków oraz odpowiedzi dla obu operatorów zajmuje jednak trochę bajtów.
Używa 0 (dla
(+)
) i 1 (dla(*)
).Kod niepoznany i testowy:
Wypróbuj tutaj.
Wynik:
źródło