Dylemat Disarium
Disarium jest zdefiniowane jako liczba, której:
suma jego cyfr zasilanych ich odpowiednią pozycją jest równa pierwotnej liczbie
Twoje zadanie :
Masz dziwną obsesję na punkcie liczb zaklasyfikowanych jako disarium. Konieczność podążania ścieżkami disarium jest w tobie tak wielka, że odmawiasz czytania stron nie ponumerowanych w żadnej książce. Masz dwa DUŻE problemy:
- Twój profesor właśnie wyznaczył cię do przeczytania twojego podręcznika od strony
n
do stronym
- W zeszłym tygodniu naprawdę mocno uderzyłeś się w głowę i wydaje się, że nie pamiętasz, jak programowo ustalić, czy liczba jest uważana za disarium.
Najważniejszy jest czas, więc kod określający strony, które należy przeczytać, musi być jak najkrótszy.
Trzeba zidentyfikować wszystkie disarium ciągu integracyjnego zakresie n
through m
.
Przykłady disarium :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
To jest golf golfowy, więc wygrywa najmniej bajtów!
Oto pełna sekwencja A032799 .
n
im
? Istnieje bardzo duże disarium (12157692622039623539), czy odpowiedzi powinny być w stanie go zidentyfikować?Odpowiedzi:
Perl 6 ,
4039 bajtówWypróbuj online!
Jak to działa
źródło
Python2,
98898884 bajtówOkropny. Skróci się.Zaczynam wyglądać lepiejOto moja rekurencyjna próba (86 bajtów):
Dzięki @Rod za oszczędność 4 bajtów!
range
doenumerate
i tak dalej.źródło
enumerate
, możeszint(n)
zamiast tego użyćint(`x`[p])
Perl, 43 bajty
Wypróbuj online!
Regex jest naprawdę potężny.
Wyjaśnienie
Pierwszą rzeczą, jaką robi kod, jest odczytanie dwóch liczb całkowitych na wejściu
<>
i utworzenie zakresu od pierwszej do drugiej za pomocą..
. Następnie wykorzystuje standardowąmap
funkcję iterację tego zakresu, i stosuje następujący kod do każdej wartości:say if$_==eval s/./+$&**$+[0]/gr
. To wygląda jak bełkot i tak jest, ale oto, co się naprawdę dzieje.map
niejawnie przechowuje swoją bieżącą wartość w zmiennej$_
. Wiele funkcji i operacji Perla używa tej wartości, gdy nie podano żadnej. Obejmuje to wyrażenia regularne, takie jaks///
operator podstawienia.Wyrażenie zastępcze składa się z czterech części:
=~
jest stosowany do stosowania wyrażenia regularnego do łańcucha, ale jeśli ten operator jest nieobecny, to wyrażenie regularne jest stosowane do zmiennej niejawnej$_
, która zawiera naszą bieżącą liczbę za pośrednictwemmap
funkcji..
. W efekcie przechwytujemy każdą pojedynczą cyfrę.+
po którym następuje wyrażenie matematyczne, połączone z pewnymi magicznymi zmiennymi Perla, które znacznie ułatwiają wszystko.Specjalna zmienna skalarna
$&
zawsze zawiera całość ostatniego udanego przechwytywania wyrażenia regularnego, która w tym przypadku jest pojedynczą cyfrą. Specjalna zmienna tablicowa@+
zawsze zawiera listę przesunięć pocztowych dla ostatniego udanego dopasowania, tj. Indeks tekstu po dopasowaniu.$+[0]
jest indeksem$_
tekstu bezpośrednio po nim$&
. W przypadku135
, przechwytujemy cyfrę1
, a indeks w135
tekście zaraz potem (mianowicie35
) wynosi 1, co jest naszym wykładnikiem. Chcemy więc podnieść$&
(1) do potęgi$+[0]
(1) i uzyskać 1. Chcemy podnieść 3 do potęgi 2 i uzyskać 9. Chcemy podnieść 5 do potęgi 3 i uzyskać 125.Jeśli dane wejściowe były
135
, wynikowy ciąg to+1**1+3**2+5**3
./g
i/r
./g
mówi tłumaczowi, aby kontynuował zastępowanie po znalezieniu pierwszego (w przeciwnym razie byśmy mieli+1**135
)./r
mówi interpreterowi, aby nie modyfikował oryginalnego ciągu znaków , a zamiast tego zwraca ciąg znaków po zamianach. Jest to ważne, ponieważ w przeciwnym razie nadpisze$_
i potrzebujemy go do celów porównawczych.Po zakończeniu całego podstawienia otrzymujemy wyrażenie matematyczne, które jest oceniane za pomocą
eval
funkcji.+1**1+3**2+5**3
jest obliczany na1 + 9 + 125 = 135
, który jest porównywany z pierwotnym numerem135
. Ponieważ te dwa są równe, kod wypisuje liczbę.źródło
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
jest o 1 bajt krótszy niż$+[0]
:)JavaScript (ES7),
10591898883798281 bajtówDzięki Arnauld za uratowanie 20B i ETHProductions za uratowanie 6B!
Stosowanie
Przypisz funkcję do zmiennej i podaj jako minimum i maksimum jako argumenty. Przykład:
Wydajność
Dalsza gra w golfa
Wygląda na to, że gra w golfa dość dobrze, ale zawsze jest miejsce na poprawę ... Myślę, że.
źródło
d**(e+1)
, abyd**-~e
zapisać dwa bajty.&
zamiast&&
. Jeszcze jeden bajt do przejścia ...JavaScript (Firefox 52+), 68 bajtów
Funkcja rekurencyjna wysyłana przez
alert
. Działa w wersji dla programistów przeglądarki Firefox, którą można pobrać na tej stronie . Poprzednie wersje Firefoksa nie obsługują**
operatora i żadna inna przeglądarka nie obsługuje[for(a of b)c]
składni.Testowy fragment kodu
To używa
.map
zamiast interpretacji tablic, aMath.pow
zamiast tego**
, więc powinno działać we wszystkich przeglądarkach, które obsługują ES6.Pokaż fragment kodu
źródło
05AB1E , 12 bajtów
Zaoszczędź 2 bajty dzięki Emignie
Wypróbuj online!
źródło
ŸvygLySmOyQ—
powinien działać przez 12 bajtów.Python 3, 100 bajtów
Nie najkrótsze podejście, ale całkiem urocze. Na pewno jest wiele disariów; niezły dowód można znaleźć na stronie OEIS. To są wszystkie z nich.
źródło
R, 100 bajtów
Nienazwana funkcja, która przyjmuje
n
im
. Jak zawsze w R, dzielenie liczb całkowitych na wektor cyfr numerycznych jest żmudne i pochłania wiele bajtów. To sprawia, że funkcja jest stosunkowo powolna i działa tylko dla 32-bitowych liczb całkowitych.źródło
Galaretka , 11 bajtów
Wypróbuj online!
Zmniejszono to z 16 do 11, z pewną pomocą @miles!
Wyjaśnienie:
źródło
J
aby uzyskać indeksy. Krótszym sposobem może byćD*J$S⁼
połączenie dwóch linków w jedenCJam , 23 bajty
Wypróbuj online!
Wyjaśnienie
źródło
05AB1E , 18 bajtów
Wypróbuj online!
źródło
Python 2.X, 92 bajty
źródło
(i+1)
, ale nie stanowi to problemu, gdy pozbywamy się nawiasów-~i
.list('k')
, a ja nie mam. Można jednak nadal usunąć białe znaki :)Python 2 , 84 bajtów
Pełne podejście programowe, obecnie tej samej długości co rozwiązanie lambda.
Wypróbuj online!
źródło
input()
. Bardzo dobrze! +1.Japt, 15 bajtów
Przetestuj online!To była współpraca między @obarakon a mną.
Jak to działa
W najnowszej wersji Japt
x
akceptuje funkcję jako argument, co pozwala nam zagrać w inny bajt:Przetestuj online!
źródło
Clojure, 107 bajtów
Implementacja równania jest strasznie długa.
źródło
(.pow(-(int v)48M)
TI-Basic, 85 bytes
źródło
int(log(
every number and then do the powers. Perhaps this is shorter, but I doubt it.FUNC
mode and the window has to be set up to include your input point. Doesn't seem portable enough to me.FUNC
mode, although I do see what you're saying about the input resolution. But, this method is pretty common in golfing. You could alwaysPrompt X,Y
instead.Haskell, 61 bytes
Usage example
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Check each number
i
in the range[n..m]
. The digits are extracted by turningi
into a string (show
) and making each char a one element string (pure
) which is turned into an integer again (read
). Zip those numbers element wise with[1..]
via the function^
and take thesum
.źródło
PHP,
929188 bytes3 bytes saved thanks @AlexHowansky
takes input from command line arguments; prints a trailing comma. Run with
-r
.źródło
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
and"_$n"[index]
produce parse errors while"89"[index]
and$s="$n";$s[index]
are perfectly fine.("_$n")[index]
Mathematica, 59 bytes
Unnamed function taking two integer arguments and returning a list of integers.
(d=IntegerDigits@#)^Range@Length@d
produces the list of digits of a number to the appropriate powers;Tr[...]==#
detects whether the sum of those digit-powers equals the original number.źródło
MATLAB,
8873 bytesOriginal answer:
num2str(n)-'0'
splits an
into a vector of its digits, and1:floor(log10(n))+1
is a vector holding one to the number of digits inn
. Thanks to log for the golf down to an anonymous function, saving 15 bytes.źródło
Haskell,
82 7675 bytesTry it online! Usage:
5 ! 175
This checks each number in the range
n
tom
if its a disarium number and is hence quite slow for bigm
.Faster version: (93 bytes)
Try it online!
źródło
C (gcc), 136 bytes
Header defining pow on TIO because for some reason it didn't auto include pow. My computer did, so I'm going to roll with that.
Try it online!
źródło
MATL, 16 bytes
Try it online!
źródło
Batch, 115 bytes
Batch only has 32-bit arithmetic which has no way of comparing the last disarium number, but if you insist on string comparisons, then for 402 bytes:
źródło
Python 2, 100 bytes
I haven't had a chance to run this yet (doing this on my phone).
źródło
sum
.i
is a Disarium. I have no idea whether this is allowed, but I would say no, since the output gets very blank.Scala,
132129 bytes129 edit: Changing the for loop's variable name from
&
toi
saved three spaces.Explanation
For each value in the input range:
+""
zipWithIndex
to produce a list of tuples containing a char of the digit and its indexComments
Finally got around to learning how
fold
andzipWithIndex
work. I'm unhappy with theint
conversions, but I am pleased with the succinctness offold
andzipWithIndex
.źródło
Octave,
8887 bytesThanks to MattWH for saving a byte (f(x)-48 vs f(x)-'0')
To run:
Explanation
źródło
C
175169 bytesUngolfed version:
Can be shortened in some way, but I don't see it at the moment.
@TuukkaX Thanks for saving 6 bytes.
źródło
n!=0
can be changed ton
.Java
Explanation
źródło
Python 3: 131 Bytes
After creating this code, it's become apparent that there are a limited number of disariums, so it might be more feasible to check for these explicitly rather than using so much list comprehension which is tough on big inputs to this solution.
Try it online!
źródło