Wydrukuj cyfrowy katalog główny

19

Różni się to od Mojego Słowa, które może pokonać Twoje Słowo, ponieważ jest mniej złożone i wymaga jedynie obliczenia go, a nie porównania.

Aby znaleźć cyfrowy pierwiastek, weź wszystkie cyfry liczby, dodaj je i powtarzaj, aż otrzymasz liczbę jednocyfrową. Na przykład, jeśli numer był 12345, należy dodać 1, 2, 3, 4, i 5, coraz 15. Następnie dodajesz 1i 5, dając ci 6.

Twoje zadanie

Biorąc pod uwagę całkowitą N (0 < N <= 10000) za pomocą standardowego wejścia , drukowanie cyfrowe pierwiastek N .

Przypadki testowe

1 -> 1
45 -> 9
341 -> 8
6801 -> 6
59613 -> 6
495106 -> 7

Pamiętaj, że to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
1
Może podzadanie tego wyzwania .
nimi
3
Bardzo blisko związane z tym wyzwaniem ... może wystarczająco blisko, by zrobić dupek.
AdmBorkBork
8
Mów dokładniej number. W szczególności. czy dane wejściowe muszą 0być obsługiwane?
Ton Hospel
2
@TimmyD Myślę, że to jest o wiele czystsze wyzwanie bez dodawania litery do konwersji liczb całkowitych, obliczania funkcji dla dwóch wartości i uwzględnienia literału STALEMATE. Lepiej byłoby zamknąć drugą jako duplikat tego.
Martin Ender
3
@MartinEnder Cofnąłem mój głos, uważam, że niesprawiedliwe jest zamknięcie dobrego wyzwania jako duplikatu innego, bardziej złożonego wyzwania.
Erik the Outgolfer

Odpowiedzi:

17

Galaretka , 7 5 4 3 bajtów

ḃ9Ṫ

TryItOnline! lub wszystkie przypadki testowe

W jaki sposób?

Korzeń cyfrowych jest znane przestrzegać wzorze (N-1) + 1% 9.
To jest taka sama jak w ostatniej cyfry bijective podstawą 9
(i w związku z realizacją tego 0ḃ9=[]i []Ṫ=0tego uchwyty krawędziowe przypadku zero).

ḃ9Ṫ - Main link: n
ḃ9  - convert to bijective base 9 digits (a list)
  Ṫ - tail (get the last digit)
Jonathan Allan
źródło
13

JavaScript (ES6), 16 10 bajtów

n=>--n%9+1

Przypadki testowe

Johan Karlsson
źródło
6

MATL , 3 bajty

9X\

Wypróbuj online!

Wiele (teraz usuniętych odpowiedzi) próbowało użyć modulo 9, aby uzyskać wynik. Jest to świetny skrót, ale niestety nie działa w przypadku wielokrotności 9. MATL ma funkcję modulo w interwale [1, n]. Korzystając z tego modulo, mamy 1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1itd. Ta odpowiedź po prostu pobiera wejściowy modulo dziewięć za pomocą tego niestandardowego modulo.

DJMcMayhem
źródło
6

Mathematica, 27 11 bajtów

Mod[#,9,1]&

Mathematica Modprzyjmuje trzeci parametr jako przesunięcie wynikowego zakresu modułu. Pozwala to uniknąć zmniejszenia wartości wejściowej i zwiększenia wartości wyjściowej.

Martin Ender
źródło
6

Python, 16 20 bajtów

+4 bajty, aby obsłużyć zerowy przypadek krawędzi.

lambda n:n and~-n%9+1

repl.it

Jonathan Allan
źródło
1
Łał. Jest to tak łatwe, że można go przenieść na dowolny język. Możesz nawet~-input()%9+1
Karl Napf
1
Niestety nie działa dla 0.
Emigna
@KarlNapf Czy to nie będzie potrzebne print?
Jonathan Allan
@JonathanAllan Ah, być może. Właśnie przetestowałem to w środowisku REPL i to zrobiło.
Karl Napf
1
@ anonimowy użytkownik, który próbował edytować - faktycznie złamałby kod (wprowadził 0wynik 9zamiast zamiast 0, co jest pokrywane przez n andczęść kodu), a ponadto byłby liczony jako 19 bajtów, a nie 13 ( ponieważ printnależy liczyć i).
Jonathan Allan
4

Julia, 12 bajtów

!n=mod1(n,9)

lub

n->mod1(n,9)

mod1jest alternatywą dla modktórej mapy zakresu [1, n]zamiast [0, n).

Martin Ender
źródło
4

PHP, 15 bajtów

<?=--$argn%9+1;

Poprzednia wersja PHP, 55 bajtów

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;
Jörg Hülsermann
źródło
Dokładnie jak to zrobiłem!
CT14.IT
@ CT14.IT Mogę usunąć ten post, jeśli chcesz. Twój usunięty post został 1 minutę wcześniej i zapomniałeś tylko pętli while
Jörg Hülsermann
Nie, usunięta odpowiedź była błędna, ponieważ nie przeczytałem poprawnie pytania na początek, nie próbowałem zsumować wygenerowanej liczby
CT14.IT
2
Możesz dodać sztuczkę z innymi odpowiedziami<?=--$argv[1]%9+1?>
Crypto
3

Haskell, 35 34 bajtów

until(<10)$sum.map(read.pure).show

Wypróbuj na Ideone.

Wyjaśnienie:

until(<10)$sum.map(read.pure).show
                              show  -- convert int to string
               map(         ).      -- turn each char (digit) into
                        pure        --    a string 
                   read.            --    and then a number
           sum.                     -- sum up the list of numbers
until(<10)$                         -- repeat until the result is < 10
Laikoni
źródło
3

Perl, 15 bajtów

Obejmuje +2 za -lp

Podaj dane na STDIN

root.pl <<< 123

root.pl

#!/usr/bin/perl -lp
$_&&=~-$_%9+1

Jest to rozwiązanie nudny, że już zostały dostarczone w wielu językach, ale przynajmniej ta wersja obsługuje 0też

Bardziej interesujące wykonywanie powtarzających się dodatków (choć w innej kolejności) jest w rzeczywistości tylko 1 bajt dłuższy:

#!/usr/bin/perl -p
s%%$_+=chop%reg
Ton Hospel
źródło
3

R 72 72 29 bajtów

Edycja: Podziękowania dla @rturnbull za zgolenie dwóch bajtów.

n=scan();`if`(n%%9|!n,n%%9,9)
Billywob
źródło
Niedawno dowiedziałem się, że ifelsemożna go zastąpić `if`identycznym zachowaniem, co pozwala zaoszczędzić kilka bajtów.
rturnbull
@rturnbull Zawsze zastanawiałem się, jak to ifdziała. Czy możesz podać przykład lub dodać go do Porady dotyczące gry w golfa?
Billywob
Najprostszym sposobem na zrozumienie tego jest to, że nie jest wektoryzacji ifelse. W takim przypadku `if`(n%%9|!n,n%%9,9)zapewnia identyczne zachowanie do opublikowanego kodu. O ile wiem, takie zachowanie jest nieudokumentowane! Dodam komentarz do wątku ze wskazówkami.
rturnbull
3

Siatkówka , 7 bajtów

{`.
*
.

Wypróbuj online!

Widzę wiele rozwiązań matematycznych, ale w Retinie proste podejście wydaje się najlepsze.

Wyjaśnienie

{`sprawia, że ​​cały program działa w pętli, dopóki łańcuch się nie zmieni. Pętla składa się z dwóch etapów:

.
*

Konwertuj każdą cyfrę na unarną.

.

Policz liczbę znaków (= przekonwertuj liczbę jednostkową na dziesiętną).

Działa to, ponieważ konwersja każdej cyfry na unarską bez separatora między cyframi tworzy pojedynczą liczbę jednoargumentową, która jest równa sumie wszystkich cyfr.

Lew
źródło
2

Brachylog , 9 bajtów

#0|@e+:0&

Wypróbuj online!

Wyjaśnienie

#0            Input = Output = a digit
  |           OR
   @e         Split the input into a list of digits
     +        Sum
      :0&     Call this predicate recursively

Alternatywne podejście, 11 bajtów

: I: {@ e +} i # 0

Ten używa meta-predykatu i - Iteratedo wywoływania Irazy predykatu {@e+}na wejściu. Spowoduje to wypróbowanie wartości Iod 0do nieskończoności, dopóki nie sprawi, że wynik ibędzie pojedynczą cyfrą, co będzie #0prawdziwe.

Fatalizować
źródło
2

JavaScript (ES6), 41 38 bajtów

Zaoszczędzono 3 bajty, dzięki Bassdrop Cumberwubwubwub

Bierze i zwraca ciąg znaków.

f=s=>s[1]?f(''+eval([...s].join`+`)):s

Przypadki testowe

Arnauld
źródło
4
Możesz zmienić s.split``na[...s]
Bassdrop Cumberwubwubwub
2

CJam , 19 13 bajtów

r{:~:+_s\9>}g

Interpretator

Wyjaśnienie:

r{:~:+_s\9>}g Code
r             Get token
 {:~:+_s\9>}  Block: :~:+_s\9>
   ~          Eval
  :           Map
     +        Add
    :         Map
      _       Duplicate
       s      Convert to string
        \     Swap
         9    9
          >   Greater than
            g Do while (pop)

Podziękowania dla 8478 (Martin Ender) za -6 bajtów.


CJam, 6 bajtów

ri(9%)

Sugerowany przez 8478 (Martin Ender). Interpretator

Myślałem o tym, ale Martin właśnie to zrozumiał. Wyjaśnienie:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment
Erik the Outgolfer
źródło
Mapowanie i zmniejszanie za pomocą jednego polecenia można zapisać z prefiksem :, więc możesz to zrobić :~:+. Nie przeszkadza również uruchomienie bloku co najmniej raz, dzięki czemu można użyć gpętli zamiast wpętli.
Martin Ender
@MartinEnder r{_,1>}{:~:+`}wdziała, ale nie wiem, jak, u licha, mam go gtutaj użyć .
Erik the Outgolfer
Np. Tak: r{:~:+_s\9>}g(oczywiście rozwiązanie w formie zamkniętej ri(9%)jest znacznie krótsze.
Martin Ender
@MartinEnder O Boże, naprawdę, jestem takim początkującym ...
Erik the Outgolfer
Drugi nie działa na wielokrotnościach 9
ThePlasmaRailgun
2

Java 7, 63 bajty

int f(int n){int s=0;for(;n>0;n/=10)s+=n%10;return s>9?f(s):s;}

Funkcja rekurencyjna, która po prostu pobiera cyfry za pomocą mod / div. Nic fajnego.

Tani port

z Jonathana Allana miałby marne 28 bajtów:

int f(int n){return~-n%9+1;}
Geobity
źródło
1

Python 2, 54 51 bajtów

i=input()
while~-len(i):i=`sum(map(int,i))`
print i 

Podziękowania dla Olivera i Karla Napfa za pomoc w oszczędzeniu 3 bajtów

Daniel
źródło
Można zmienić while len(i)>1, aby while~-len(i)zapisać jeden bajt.
Oliver Ni
Myślę, że można pominąć zaznaczenia input()i zmusić wejście do umieszczenia w cudzysłowie, aby zaoszczędzić 2 bajty.
Karl Napf
@KarlNapf Nie sądzę, że możesz to zrobić, gdy wejście jest liczbą całkowitą.
Erik the Outgolfer
@EriktheGolfer, op powiedział, że dane wejściowe można traktować jako ciąg znaków
Daniel
1

Python, 45 bajtów

f=lambda x:x[1:]and f(`sum(map(int,x))`)or x

Traktuje argument jako ciąg.

Loovjo
źródło
1

05AB1E , 6 bajtów

[SODg#

Wypróbuj online!

Wyjaśnienie

[        # infinite loop
 S       # split into digits
  O      # sum digits
   Dg#   # if length == 1: break
Emigna
źródło
1

C, 64 29 bajtów

Port C z odpowiedzi Jonathana Allana (ze specjalnym przypadkiem 0).

f(i){return i>0?~-i%9+1:0;}

Poprzedni 64-bajtowy kod:

q(i){return i>9?i%10+q(i/10):i;}
f(i){i=q(i);return i>9?f(i):i;}

qpobiera sumę krzyżową i fpowtarza przyjmowanie sumy krzyżowej do jednej cyfry.

Karl Napf
źródło
1

Siatkówka , 15 bajtów

.+
$*
1{9}\B

1

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Wyjaśnienie

.+
$*

Konwertuj dane wejściowe na jednoargumentowe.

(1{9})*\B

Weź modulo oparte na 1, usuwając dziewiątki, które mają za sobą co najmniej jeszcze jedną postać.

1

Policz pozostałą liczbę 1, aby przekonwertować z powrotem na dziesiętne.

Martin Ender
źródło
1

Perl 6 , 29 bajtów

{($_,*.comb.sum...10>*)[*-1]}

Rozszerzony:

{ # bare block lambda with implicit parameter 「$_」
  ( # generate a sequence

    $_,         # starting with the input
    *.comb.sum  # Whatever lambda that splits into digits, and finds sum
    ...         # keep doing that
    10 > *      # until it is less than 10

  )[ * - 1 ] # get the last value
}
Brad Gilbert b2gills
źródło
1

Współczynnik , 24

Sprytna , matematyczna odpowiedź.

[ neg bitnot 9 mod 1 + ]

63 dla głupiego rozwiązania iteracyjnego:

[ [ dup 9 > ] [ number>string >array [ 48 - ] map sum ] while ]
kot
źródło
1

Labirynt , 8 bajtów

?(_9%)!@

używając równania (n-1)%9+1:

  • ? odczytuje dane wejściowe jako dziesiętne i wypycha je na stos
  • ( zmniejsza górną część stosu
  • _ przesuwa zero na górę stosu
  • 9 popchnij stos stosu razy 10 cyfr (w tym przypadku 9)
  • % wyskakuje y, wyskakuje x, przesuwa x% y
  • ) zwiększa górę stosu
  • ! wyskakuje na górze stosu i wyrzuca go jako ciąg dziesiętny
  • @ kończy program
Robert Hickman
źródło
1

Pyth - 7 4 6 7 bajtów

Nie najlepsza, ale wciąż przewyższa przyzwoitą liczbę odpowiedzi:

|ejQ9 9

Podobnie jak poprzednia wersja, ale obsługuje również przypadki wielokrotności 9, używając logicznego lub.


Ta wersja nie spełnia 45 testów :

ejQ9

Wyjaśnienie:

 jQ9  -> converting the input to base 9
e     -> taking the last digit

Wypróbuj tutaj

Wypróbuj poprzednią wersję tutaj!


Poprzednie rozwiązania:

&Qh%tQ9

Objaśnienie :

    tQ    -> tail: Q-1
   %tQ9   -> Modulo: (Q-1)%9
  h%tQ9   -> head: (Q-1)%9+1
&Qh%tQ9   -> Logical 'and' - takes the first null value. If Q is 0 - returns zero, otherwise returns the (Q-1)%9+1 expression result

Zapraszam do wypróbowania tutaj !

Łosoś Yotam
źródło
Twoja 4-bajtowa wersja kończy się niepowodzeniem w przypadku testowym 45 .
Dennis
Czy to nie da 0 dla wielokrotności 9?
xnor
Tak, właśnie to zauważyłem. Zrobię tam naprawę. Najwyraźniej jQ9nie zachowuje się jak Jelly ḃ9:-P
Yotam Salmon
1

Sześciokąt, 19 15 bajtów

.?<9{(/>!@!/)%' 

Bardziej czytelny:

  . ? < 
 9 { ( /
> ! @ ! / 
 ) % ' .
  . . . 

Wypróbuj online!

-3 bajty, przyjmując inne podejście, dzięki czemu wielkość 0 krawędzi jest banalna.
-1 bajt poprzez naprawienie błędu 0 krawędzi

Korzystając ze wzoru ((n-1) mod 9) + 1, podobnie jak wiele innych rozwiązań.

Adyrem
źródło
1

K (oK) , 9 bajtów

Rozwiązanie:

(+/.:'$)/

Wypróbuj online!

Wyjaśnienie:

Super proste. Podziel liczbę na cyfry i zsumuj - rób to, dopóki wynik nie zbiegnie się:

(+/.:'$)/ / the solution
(      )/ / do this until result converges
      $   / string, 1234 => "1234"
   .:'    / value each, "1234" => 1 2 3 4
 +/       / sum over, 1 2 3 4 => 10
streetster
źródło
1
W mojej implementacji k dokonałem x\ykodowania yw bazie xz tyloma cyframi, ile potrzeba, więc jest nieco krótszy:(+/10\)/
ngn
Ładny. W nowszych wersjach kdb + (myślę, że od wersji 3.4 i nowszych) możesz to zrobić 10\:... ale nie w ok - i .:'$ma taką samą liczbę bajtów - więc poszedłem z tym :)
streetster
OK używa \ i wymaga listy po lewej: `(, 10)`
ngn
Rzeczywiście, twoja implementacja dodaje „tyle cyfr, ile to konieczne”, co otrzymujesz \:w kdb + (3.4+), ale dla OK musiałbym wiedzieć, ile dziesiątek należy umieścić na mojej liście.
streetster
1

Beczka , 6 bajtów (SBCS na wiki Keg)

¿;9%1+

Wyjaśnienie:

¿#      Take implicit input
 ;9%1+# Digital Root Formula
# Implicit output
ZA
źródło
0

Ruby, 12 bajtów

->n{~-n%9+1}
TuxCrafting
źródło
19? Nie powinno tak być 9?
Ton Hospel
@TonHospel Tak, głupi błąd: P
TuxCrafting