Liczba siebie (zwany również Kolumbijska lub Devlali liczba) jest liczbą naturalną x
, przy czym równanie n + <digit sum of n> = x
nie ma rozwiązania dla każdej liczby naturalnej n
. Na przykład 21 nie jest własnym numerem, jak n = 15
wynika z 15 + 1 + 5 = 21
. Z drugiej strony, 20 jest liczbą własną, ponieważ nie n
można znaleźć takiej, która spełnia taką równość.
Ponieważ ta definicja odnosi się do sumy cyfr, jest zależna od podstawy. Na potrzeby tego wyzwania rozważymy tylko 10 własnych numerów bazowych, które są sekwencją A003052 w OEIS. Liczby własne binarne ( A010061 ) i podstawowe 100 ( A283002 ) również zostały zapisane .
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą x
jako dane wejściowe, wypisz prawdziwą wartość, jeśli x
jest liczbą własną w bazie 10, a w przeciwnym razie wartość falsey. Aby wyjaśnić wartości prawdy i falseya, zapoznaj się z tym meta postem na ten temat .
Możesz napisać pełny program lub funkcję, a dane wejściowe i wyjściowe mogą być dostarczane na zwykłych kanałach. Standardowe luki są oczywiście zakazane.
To jest golf golfowy , więc im krótsza odpowiedź (w bajtach), tym lepiej!
Przypadki testowe
Prawda:
1
3
5
7
9
20
31
86
154
525
Falsey:
2
4
6
8
10
15
21
50
100
500
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Odpowiedzi:
Oktawa , 37 bajtów
Port mojej odpowiedzi MATL.
Wypróbuj online!
źródło
Java (JDK 10) , 84 bajty
Wypróbuj online!
Wyjaśnienie
Kredyty
źródło
n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
05AB1E , 8 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
Brachylog , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
false.
prawdziwa wartość jest jakąkolwiek obiektywną metodą w inny sposóbtrue.
? Ja na przykład tak nie uważam i wygląda na to, że poparłby to meta konsensusC (gcc) ,
706765 bajtówWypróbuj online!
Aby ogolić kolejne 2 bajty, zwrócona wartość prawdy to już nie 1, ale sama liczba.
źródło
Oktawa ,
494744 bajtówWypróbuj online!
Wyjaśnienie:
Próba wykonania operacji na zakresie jest uciążliwa i długa, ponieważ
num2str
zwraca łańcuch ze spacjami jako separatory, jeśli jest więcej niż liczba wejściowa. Odejmowanie 48 dałoby zatem coś w rodzaju:1 -16 -16 2 -16 -16 3 -16 -16 4
dla zakresu wejściowego 1 ... 4 . Pozbycie się wszystkich-16
zabiera dużo bajtów.Dlatego zrobimy to za pomocą pętli
arrayfun
. Dla każdej liczby k = 1 .. x , gdzie x jest wejściem, dodajemyk
i jego sumę cyfr, i odejmujemyx
. Zwróci tablicę z wynikiem tej operacji dla każdej liczby w k . Jeśli dowolna z liczb w tablicy jest zerem, liczba nie jest liczbą własną.Dla danych wejściowych
20
i21
wyjściowych są:Istnieją tylko niezerowe elementy wejściowe
20
i co najmniej jeden niezerowy element wejściowy21
. Oznacza to, że20
jest to numer własny, a21
nie jest.Oktawa traktuje tablicę z co najmniej jednym zerem jako fałszywą, co można zobaczyć w łączu TIO.
źródło
MATL , 11 bajtów
Dane wyjściowe to niepusta tablica, co jest prawdą, jeśli wszystkie jej wpisy są niezerowe, i fałsz, jeśli zawiera jedno lub więcej zer.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe , w tym test na prawdziwość / fałszerstwo.
Wyjaśnienie
Rozważ dane wejściowe
n = 10
jako przykład.źródło
APL (Dyalog) , 14 bajtów
Wypróbuj online!
W jaki sposób?
źródło
+/⍎¨∘⍕
->#+.⍎⍕
Galaretka , 6 bajtów
Dla wejścia n zwraca [n], jeśli n jest własnym numerem, [] jeśli nie.
Wypróbuj online!
Jak to działa
źródło
Pari / GP , 32 bajty
Wypróbuj online!
źródło
Haskell , 46 bajtów
Wypróbuj online!
źródło
J ,
28, 24, 2221 bajtów-1 bajt dzięki Conorowi O'Brienowi
-2 bajty dzięki ngn
Wypróbuj online!
Wyjaśnienie:
i.
lista 0 .. n-1( )"+
dla każdej pozycji na liście.,.&.":
przekonwertować na listę cyfr,1#
znajdź ich sumę+
i dodaj go do przedmiotu$@-.
wyklucz listę z argumentu i znajdź kształtźródło
"0 i.
może być"+i.
(-1 bajt).-.@e.
->$@-.
[:(
)"+i.
->(
)"+@i.
Python 2,
7066 bajtówEDYCJA: -4 dzięki @ user56656
źródło
`i`
zamiaststr(i)
zapisać 4 bajty.[
i]
wewnątrzsum
lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
Pyth , 8 bajtów
Zestaw testowy.
Jeśli dozwolona jest zamiana wartości prawda / fałsz, możemy upuścić
!
i zamiast tego otrzymać 7 bajtów. Jedna z sugestii Sok pomogła mi w golfie 2 bajty.Wyjaśnienie
źródło
.AmnQ+dsjdT
, nie miałem pojęcia/
. Wydaje się, że nie używałem Pyth prawidłowo od dłuższego czasu! +1/
zasadniczo liczy wystąpienia elementu na liście. Mogę również użyć}
, który sprawdza, czy obiekt pojawia się na liście, ale myślę, że to ta sama liczba bajtów.S
nie jest to wymagane - wejście będzie dodatnią liczbą całkowitą, więc posiadanie0
na liście map nie będzie problemem? Przynajmniej wydaje się, że działa dla danych przypadków testowych.+sjdT
dodaćsjdT
dod
? Nigdy czegoś takiego nie widziałemPerl 6 ,
3933 bajtówWypróbuj to!
Goły blok z niejawnym pojedynczym parametrem, nazywany w ten sposób:
Ponieważ
n + digits(n) >= n
możemy po prostu obliczyć liczbę kolumbijską dla wszystkich liczb do wartości naszego zapytania i sprawdzić, czy któraś z nich jest zgodna. Oblicza to liczbę kolumbijską dla danych wejściowych:Które stosujemy do wszystkich wartości aż do naszego celu:
Ale zależy nam tylko na tym, czy któreś z nich pasują, a nie na tych wartościach, więc jak wskazał @nwellenhof, możemy grep:
Reszta to po prostu przymus, by się chwalić i owijać w blok.
39 bajtów
Link testowy TIO dostarczony przez @Emigna
@nwellenhof wskazał, że użycie grep pozwoli zaoszczędzić 6 bajtów!
źródło
{!grep $_,map {$_+[+] .comb},^$_}
dla 33 bajtów.Python 3 ,
60,56,55, 54 bajtówWypróbuj online!
-4 użycie all inverse zamiast dowolnego
-1 poprzez zmianę! = Na ^ by @ jonathan-allan
-1 przez użycie zbiorów @ovs
źródło
Japt
-d!
, 6 bajtówSpróbuj
Oryginał, 8 bajtów
Zwraca liczbę wejściową dla wartości true lub
0
falsey. Gdyby tylko pusta tablica była falsey w JavaScript, może to być 7 bajtów.Spróbuj
Wyjaśnienie
Alternatywny
Spróbuj
źródło
Siatkówka , 55 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj dane wejściowe
x
na jednoargumentowe.Utwórz zakres od
x
do1
.Przyrostek wartości dziesiętnej każdego z nich
n
do jego wartości jednostkowej.Zrób kopię
x
.Konwertuj każdą cyfrę dziesiętną
n
na unarną, dodając w ten sposób cyfry do istniejącej kopiin
.Sprawdź, czy
x
pojawia się w którymś z wyników.Odwróć wynik.
źródło
JavaScript (ES6),
5251 bajtówZapisano 1 bajt dzięki @ l4m2
Zwraca 0 lub 1 .
Wypróbuj online!
źródło
n=>(g=k=>k?n-eval([...k+'k'].join`+`)&&g(k-1):1)(n)
Haskell ,
6358 bajtówWypróbuj online!
źródło
Perl 5
-a
, 34 bajtówWypróbuj online!
źródło
Rubinowy , 38 bajtów
Wypróbuj online!
źródło
Siatkówka , 24 bajty
Wypróbuj online!
Może to być 18 bajtów z wejściem podanym w unarnym, ale w drugiej odpowiedzi Retina również używana jest liczba dziesiętna, więc pomyślałem, że użycie wartości dziesiętnej zapewni bardziej sprawiedliwe porównanie.
Wyjaśnienie
Konwertuj dane wejściowe na jednoargumentowe, używając
_
jako cyfry jednoargumentowej.Na każdej pozycji w łańcuchu (tj. Na początku, na końcu i między każdą parą znaków) wstaw::
$.`
długość prefiksu (lub pozycję dopasowania o indeksie zerowym),¶
kanał,$`
sam prefiks (tj. jednostkowa reprezentacja pozycji zerowanej). Np. Jeśli dane wejściowe byłyby3
i mielibyśmy jednoargumentową reprezentację___
, spowodowałoby to:Innymi słowy, otrzymujemy jeden wiersz dla każdej liczby od 0 do wejścia (włącznie), który zawiera zarówno jedno-, jak i dziesiętną reprezentację tej liczby.
Konwertujemy każdą cyfrę na unarną, która skutecznie oblicza sumę cyfr na każdym wierszu i dodaje ją do samej liczby (wszystkie w jedności).
Deduplikuj linie. To tak naprawdę nie usuwa duplikatów linii, ale po prostu usuwa je z pustych linii. Więc jeśli dowolna liczba od 0 do wejścia plus jego suma cyfr jest równa wejściu, ostatni wiersz zostanie wyczyszczony. W przeciwnym razie ostatnia linia pozostanie na miejscu.
Sprawdź, czy w ostatnim wierszu nadal znajduje się znak. Nie możemy użyć
$
, ponieważ to również pasuje przed końcowym przesuwem linii (dokładnie tam, gdzie nie chcemy patrzeć).źródło
Bash + GNU Coreutils, 91 bajtów
Zwraca prawdę lub fałsz.
źródło
Kotlin , 48 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Dodaj ++ , 27 bajtów
Wypróbuj online!
Jak to działa
źródło
Eliksir ,
6665 bajtówWypróbuj online!
źródło
Stax , 8 bajtów
Uruchom i debuguj
Wyjaśnienie
Odpowiednik ASCII:
fcE+|+x=
to program Stax, który wypisuje wszystkie liczby, których suma cyfr dodana do siebie równa się wejściu. Na przykład dla101
danych wyjściowych będzie91
i100
, każdy w osobnej linii.Uruchom i debuguj
źródło
Pyt , 7 bajtów
Wypróbuj online!
Jeśli dozwolona jest zamiana wartości prawda / fałsz, dozwolone jest
¬
usunięcie końca na 6 bajtów.Wyjaśnienie:
źródło
J , 20 bajtów
Wypróbuj online!
źródło