Czy jestem numerem własnym?

31

Liczba siebie (zwany również Kolumbijska lub Devlali liczba) jest liczbą naturalną x, przy czym równanie n + <digit sum of n> = xnie ma rozwiązania dla każdej liczby naturalnej n. Na przykład 21 nie jest własnym numerem, jak n = 15wynika z 15 + 1 + 5 = 21. Z drugiej strony, 20 jest liczbą własną, ponieważ nie nmoż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ą xjako dane wejściowe, wypisz prawdziwą wartość, jeśli xjest 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 , 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

Link do piaskownicy

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 Njest 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

Sok
źródło
Wydaje się, że istnieje pewna dyskusja / brak zgody na temat ważnych wyników, więc myślę, że nie miałem jasności co do tego, co zamierzałem. Dodałem zdanie, które, mam nadzieję, powinno wyjaśnić sprawę, odnosząc się do tego meta postu . Przepraszam, jeśli spowodowałem jakieś zamieszanie na ten temat!
Sok
Nie powodując więcej zamieszania, ale myślę, że ta dyskusja jest istotna dla tego, dlaczego doszło do pewnych nieporozumień. Proszę wziąć to pod uwagę przy podejmowaniu przyszłych wyzwań, ponieważ może być trudne publikowanie w językach, które nie mają konstrukcji if / else, jeśli używasz starego konsensusu.
FryAmTheEggman
@FryAmTheEggman Nie zdawałem sobie sprawy, że konsensus się zmienił, czuję się teraz jak głupiec: / Nadal dodałem już jedno wyjaśnienie, zmiana tego wydaje się niewłaściwa. Będę o tym pamiętać przy kolejnym wyzwaniu, które opublikuję. Dzięki
Sok
2
Nie jestem żadnym numerem! Jestem wolnym człowiekiem!
David Richerby
1
@DavidRicherby * wysyła białą piłkę za tobą *
Sok

Odpowiedzi:

7

Java (JDK 10) , 84 bajty

i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}

Wypróbuj online!

Wyjaśnienie

i->{                                    // IntPredicate
  for(int n=i;i-->1;)                   //  for each number below n
    i|=(                                //   keep the sign of
      (""+i).chars().map(x->x-48).sum() //    sum of digits
      +i                                //    plus the number
      ^n                                //    xor n (hoping for a zero)
     )-1>>-1;                           //    changing that into a negative number if equals to zero
  return~i<0;                           //  return i>=0
}

Kredyty

Olivier Grégoire
źródło
1
-1 bajt:n->{int i=n,r=0;for(;i-->0;)r=(""+i).chars().map(x->x-48).sum()+i==n?1:r;return r<1;}
Kevin Cruijssen
2
84 bajtów:i->{for(int n=i;i-->1;)i|=((""+i).chars().map(x->x-48).sum()+i^n)-1>>-1;return~i<0;}
Nevay
5

05AB1E , 8 bajtów

LD€SO+ÊW

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

L          # push range [1 ... input]
 D         # duplicate
  €S       # split each number into a list of digits
    O      # sum digit lists
     +     # add (n + digitSum(n))
      Ê    # check for inequality with input
       W   # min
Emigna
źródło
5

Brachylog , 12 bajtów

¬{⟦∋Iẹ+;I+?}

Wypróbuj online!

Wyjaśnienie

¬{         }    Fails if succeeds, suceeds if fails:
  ⟦∋I             I ∈ [0, ..., Input]
    Iẹ+           The sum of the elements (i.e. digits) of I...
       ;I+?       ... with I itself results in the Input
Fatalizować
źródło
1
Czy false.prawdziwa wartość jest jakąkolwiek obiektywną metodą w inny sposób true.? Ja na przykład tak nie uważam i wygląda na to, że poparłby to meta konsensus
Sok
1
@Sok Dodałem 3 nieciekawe bajty, aby rozwiązać twoje obawy.
Fatalize
5

C (gcc) , 70 67 65 bajtów

i,r,d,j;f(n){for(r=i=n;d=j=--i;r*=d!=n)for(;j;j/=10)d+=j%10;i=r;}

Wypróbuj online!

Aby ogolić kolejne 2 bajty, zwrócona wartość prawdy to już nie 1, ale sama liczba.

gastropner
źródło
4

Oktawa , 49 47 44 bajtów

@(x)arrayfun(@(k)k+sum(num2str(k)-48)-x,1:x)

Wypróbuj online!

Wyjaśnienie:

Próba wykonania operacji na zakresie jest uciążliwa i długa, ponieważ num2strzwraca ł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 4dla zakresu wejściowego 1 ... 4 . Pozbycie się wszystkich -16zabiera dużo bajtów.

Dlatego zrobimy to za pomocą pętli arrayfun. Dla każdej liczby k = 1 .. x , gdzie x jest wejściem, dodajemy ki jego sumę cyfr, i odejmujemy x. 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 20i 21wyjściowych są:

20:  -18, -16, -14, -12, -10, -8, -6, -4, -2, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 2
21:  -19, -17, -15, -13, -11, -9, -7, -5, -3, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 1, 3

Istnieją tylko niezerowe elementy wejściowe 20i co najmniej jeden niezerowy element wejściowy 21. Oznacza to, że 20jest to numer własny, a 21nie jest.

Oktawa traktuje tablicę z co najmniej jednym zerem jako fałszywą, co można zobaczyć w łączu TIO.

Stewie Griffin
źródło
4

MATL , 11 bajtów

t:tFYA!Xs+-

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 = 10jako przykład.

t       % Implicit input, n. Duplicate
        % STACK: 10, 10
:       % Range
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10]
t       % Duplicate
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 10]
FYA!    % Convert to base 10 digits and transpose
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [0 0 0 0 0 0 0 0 0 1
                                              1 2 3 4 5 6 7 8 9 0]
Xs      % Sum of each column
        % STACK: 10, [1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 1]
+       % Add, element-wise
        % STACK: 10, [2 4 6 8 10 12 14 16 18 11]
-       % Subtract, element-wise
        % STACK: [8 6 4 2 0 -2 -4 -6 -8 -1]
        % Implicit display
Luis Mendo
źródło
3

APL (Dyalog) , 14 bajtów

~⊢∊⍳+(+/⍎¨∘⍕)¨∘⍳

Wypróbuj online!

W jaki sposób?

                  range
     (  ⍎¨∘⍕)      digits
     (+/    )      digit sums
   ⍳+              vectorized addition with the range
 ⊢∊                is the input included?
~                  negate
Uriel
źródło
to 16 bajtów. zrobić je 15: +/⍎¨∘⍕->#+.⍎⍕
ngn
3

Galaretka , 6 bajtów

ḟDS+Ɗ€

Dla wejścia n zwraca [n], jeśli n jest własnym numerem, [] jeśli nie.

Wypróbuj online!

Jak to działa

ḟDS+Ɗ€  Main link. Argument: n

     €  Call the link to the left for each k in [1, ..., n].
    Ɗ     Drei; combine the three links to the left into a monadic chain.
 D          Decimal; map k to the array of its digits in base 10.
  S         Take the sum.
   +        Add k to the sum of the k's digits.
ḟ       Filterfalse; promote n to [n], then remove all elements that appear in the
        array to the right.
        This returns [n] if the array doesn't contain n, [] if it does.
Dennis
źródło
Jakie kodowanie łączy te sześć znaków w zaledwie sześć bajtów?
WGroleau
1
Galaretka używa niestandardowej strony kodowej .
Dennis
3

J , 28, 24, 22 21 bajtów

-1 bajt dzięki Conorowi O'Brienowi

-2 bajty dzięki ngn

$@-.(+1#.,.&.":)"+@i.

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

Galen Iwanow
źródło
1
Zdaję sobie sprawę, że jest to stary post, ale "0 i.może być "+i.(-1 bajt).
Conor O'Brien
1
@ ConorO'Brien Dziękujemy! Myślę, że wtedy nie znałem tego rodzaju golfów; teraz go używam (kiedy pamiętam :))
Galen Iwanow
1
-.@e.->$@-.
ngn
@ngn Dziękuję, naprawdę miło!
Galen Iwanow
1
@GalenIvanov także [:( )"+i.->( )"+@i.
ngn
2

Python 2, 70 66 bajtów

lambda x:[i for i in range(x)if i+sum([int(j)for j in`i`])==x]==[]

EDYCJA: -4 dzięki @ user56656

sonrad10
źródło
1
w python2 możesz użyć `i`zamiast str(i)zapisać 4 bajty.
Kreator pszenicy
@ user56656 dzięki, nie wiedziałem o tym
sonrad10
1
Możesz upuścić [i ]wewnątrzsum
Mr. Xcoder
lambda x:[i for i in range(x)if i+sum(map(int,`i`))==x]==[]
B. Eckles
lambda x:all(i+sum(map(int,`i`))-x for i in range(x))
B. Eckles,
2

Pyth , 8 bajtów

!/m+sjdT

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

! / m + sjdT - Pełny program. Pobiera dane wejściowe Q ze STDIN, generuje wartość Prawda lub Fałsz.
  m - Mapa w zakresie [0 ... Q) ze zmienną d.
     jdT - Konwertuj d na bazę 10.
    s - Suma.
   + - I dodaj sumę do samego d.
 / - Policz wystąpienia Q w wyniku.
! - Neguj. Wynik niejawnie wyprowadza wynik.
Pan Xcoder
źródło
Miałem .AmnQ+dsjdT, nie miałem pojęcia /. Wydaje się, że nie używałem Pyth prawidłowo od dłuższego czasu! +1
Sok
@Sok /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.
Pan Xcoder,
Myślę, że Snie jest to wymagane - wejście będzie dodatnią liczbą całkowitą, więc posiadanie 0na liście map nie będzie problemem? Przynajmniej wydaje się, że działa dla danych przypadków testowych.
Sok
@Sok Świetnie, masz rację! Dzięki temu ogoliłem jeszcze jeden bajt.
Pan Xcoder,
W jaki sposób +sjdTdodać sjdTdo d? Nigdy czegoś takiego nie widziałem
RK.
2

Perl 6 , 39 33 bajtów

{!grep $_,map {$_+[+] .comb},^$_}

Wypróbuj to!

Goły blok z niejawnym pojedynczym parametrem, nazywany w ten sposób:

say {!grep $_,map {$_+[+] .comb},^$_}(500);
> False
say {!grep $_,map {$_+[+] .comb},^$_}(525);
> True

Ponieważ n + digits(n) >= nmoż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:

{$_ + [+] .comb}

Które stosujemy do wszystkich wartości aż do naszego celu:

(^$_).map({$_+[+] .comb})

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:

grep $_, map {$_+[+] .comb}, ^$_

Reszta to po prostu przymus, by się chwalić i owijać w blok.

39 bajtów

{!((^$_).map({$_+[+] .comb}).any==$_)}

Link testowy TIO dostarczony przez @Emigna

@nwellenhof wskazał, że użycie grep pozwoli zaoszczędzić 6 bajtów!

Phil H.
źródło
1
Fajne rozwiązanie! Możesz dodać link TIO do celów testowych.
Emigna
1
{!grep $_,map {$_+[+] .comb},^$_}dla 33 bajtów.
nwellnhof
29 bajtów
Jo King
2

Python 3 , 60 , 56 , 55 , 54 bajtów

lambda x:{x}-{n+sum(map(int,str(n)))for n in range(x)}

Wypróbuj online!

-4 użycie all inverse zamiast dowolnego
-1 poprzez zmianę! = Na ^ by @ jonathan-allan
-1 przez użycie zbiorów @ovs

Rick Rongen
źródło
2

Japt -d! , 6 bajtów

N¥U+ìx

Spróbuj


Oryginał, 8 bajtów

Zwraca liczbę wejściową dla wartości true lub 0falsey. Gdyby tylko pusta tablica była falsey w JavaScript, może to być 7 bajtów.

ÂNkUÇ+ìx

Spróbuj


Wyjaśnienie

             :Implicit input of integer U
   UÇ        :Generate the range [0,U) and pass each Z through a function
      ì      :  Digits of Z
       x     :  Reduce by addition
     +       :  Add to Z
  k          :Remove the elements in that array
 N           :From the array of inputs
            :Bitwise NOT NOT (~~), casts an empty array to 0 or a single element array to an integer 

Alternatywny

Ç+ìxÃe¦U

Spróbuj

             :Implicit input of integer U
Ç            :Generate the range [0,U) and pass each Z through a function
  ì          :  Digits of Z
   x         :  Reduce by addition
 +           :  Add to Z
    Ã        :End function
     e       :Every
      ¦U     :  Does not equal U
Kudłaty
źródło
1

Siatkówka , 55 bajtów

.+
*
Lv`_+
_+
$&$.&
^_+
$&¶$&
\d
*
Cms`^(_+)\b.*¶\1\b
0

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

.+
*

Konwertuj dane wejściowe xna jednoargumentowe.

Lv`_+

Utwórz zakres od xdo 1.

_+
$&$.&

Przyrostek wartości dziesiętnej każdego z nich ndo jego wartości jednostkowej.

^_+
$&¶$&

Zrób kopię x.

\d
*

Konwertuj każdą cyfrę dziesiętną nna unarną, dodając w ten sposób cyfry do istniejącej kopii n.

Cms`^(_+)\b.*¶\1\b

Sprawdź, czy xpojawia się w którymś z wyników.

0

Odwróć wynik.

Neil
źródło
1

JavaScript (ES6), 52 51 bajtów

Zapisano 1 bajt dzięki @ l4m2

Zwraca 0 lub 1 .

n=>(g=k=>k?eval([...k+'k'].join`+`)-n&&g(k-1):1)(n)

Wypróbuj online!

Arnauld
źródło
n=>(g=k=>k?n-eval([...k+'k'].join`+`)&&g(k-1):1)(n)
l4m2
1

Haskell , 63 58 bajtów

s 0=0
s x=x`mod`10+s(x`div`10)
f n=all(\x->x+s x/=n)[1..n]

Wypróbuj online!

Cristian Lupascu
źródło
1

Siatkówka , 24 bajty

.+
*

$.`¶$`
\d
*
D`
.\z

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łyby 3i mielibyśmy jednoargumentową reprezentację ___, spowodowałoby to:

0
_1
__2
___3
___

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.

\d
*

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).

D`

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.

.\z

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ć).

Martin Ender
źródło
1

Bash + GNU Coreutils, 91 bajtów

Zwraca prawdę lub fałsz.

e=1;for((i=1;i<=$1;i++));{ [ $(bc<<<`grep -o . <<<$i|tr '\n' +`$i) -eq $1 ]&&e=0; };exit $e
rexkogitans
źródło
1

Kotlin , 48 bajtów

x->(1..x).all{v->"$v".sumBy{it.toInt()-48}+v!=x}

Wypróbuj online!

Wyjaśnienie:

(1..x)      // Range of numbers from 1 to x
.all{v->    // Function expression that checks if ALL values evaluate to tru
"$v"        // Convert the value into a string
.sumBy{it.toInt()-48} // For each character, get the ASCII char value, subtract 48 in order to get it back to the numerical value, and then sum it up
+v          // Add the original number
!=x}        // Ensure that it does not equal the input
Makotosan
źródło
1

Dodaj ++ , 27 bajtów

D,g,@,BDB+A+BK=
L,RbUABkºg!

Wypróbuj online!

Jak to działa

D,g,@,		; Create a monadic function 'g'
		; Example argument:		[15]
	BD	; Digits;		STACK = [[1 5]]
	B+	; Sum;			STACK = [6]
	A+	; Add argument;		STACK = [21]
	BK=	; Equals input;		STACK = [1]

L,		; Create a lambda function
		; Example argument:		[21]
	RbUABk	; Push range;		STACK = [1 2 3 ... 19 20 21]
	ºg	; Any true from 'g';	STACK = [1]
	!	; Logical NOT;		STACK = [0]
Cairney Coheringaahing
źródło
1

Stax , 8 bajtów

Å8avj╒Éπ

Uruchom i debuguj

Wyjaśnienie

Odpowiednik ASCII:

{cE+|+x=f!
{       f     Filter [1..input] with block
 cE           Decimal digits of current value
   +|+        Sum of digits and the current value
      x=      Equals input
         !    Logical not, maps empty array to 1 and non-empty array to 0

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 dla 101danych wyjściowych będzie 91i 100, każdy w osobnej linii.

Uruchom i debuguj

Weijun Zhou
źródło
1

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:

        Implicit input
Đ       Duplicate input
ř       Get [1,2,...,input]
Đ       Duplicate the top of the stack
Ś       Get the sum of the digits of each element in the array
+       Add the top two items on the stack element-wise
∈       Is the input in the list?
¬       Negate the top of the stack
        Implicit print
mudkip201
źródło
1

J , 20 bajtów

#@-.i.+1#.10#.inv i.

Wypróbuj online!

                  i.     Range [0,n-1]
          10#.inv        To base 10
       1#.               Sum the digits
    i.+                  Plus the corresponding number
  -.                     Remove from the input, leaves an empty list if it was a self number.
#@                       An empty list is truthy, so return the length instead.
FrownyFrog
źródło