Drucken Sie die digitale Wurzel

19

Dies unterscheidet sich von " Mein Wort", da es weniger komplex ist und nur berechnet und nicht verglichen werden muss.

Um die digitale Wurzel zu finden, nehmen Sie alle Ziffern einer Zahl, fügen Sie sie hinzu und wiederholen Sie den Vorgang, bis Sie eine einstellige Zahl erhalten. Wenn zum Beispiel die Zahl war 12345, würden Sie hinzufügen 1, 2, 3, 4, und 5, bekommen 15. Sie würden dann hinzufügen 1und 5geben 6.

Deine Aufgabe

Geben Sie bei einer Ganzzahl N (0 <= N <= 10000) über STDIN die digitale Wurzel von N aus .

Testfälle

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

Denken Sie daran, das ist , also gewinnt der Code mit der geringsten Anzahl von Bytes.

Oliver Ni
quelle
1
Vielleicht eine Teilaufgabe dieser Herausforderung .
Nimi
3
Sehr eng mit dieser Herausforderung verbunden ... vielleicht nah genug für einen Betrüger.
AdmBorkBork
8
Bitte seien Sie genauer, wenn Sie sagen number. Bestimmtes. muss eingabe 0unterstützt werden?
Ton Hospel
2
@TimmyD Ich denke, dass dies die viel sauberere Herausforderung ist, ohne der Ganzzahlkonvertierung Buchstaben hinzuzufügen, die Funktion für zwei Werte zu berechnen und das Literal einzuschließen STALEMATE. Es könnte besser sein, den anderen als Betrug zu schließen.
Martin Ender
3
@MartinEnder Ich habe meine enge Abstimmung zurückgezogen. Ich denke, es ist unfair, eine gute Herausforderung als Betrug einer weiteren komplexeren Herausforderung abzuschließen.
Erik der Outgolfer

Antworten:

17

Jelly , 7 5 4 3 Bytes

ḃ9Ṫ

TryItOnline! oder alle Testfälle

Wie?

Es ist bekannt, dass die digitale Wurzel der Formel (n-1)% 9 + 1 folgt.
Dies ist das Gleiche wie die letzte Ziffer in der bijektiven Basis 9
(und aufgrund der Implementierung behandelt diese 0ḃ9=[]und []Ṫ=0diese den Kantenfall von Null).

ḃ9Ṫ - Main link: n
ḃ9  - convert to bijective base 9 digits (a list)
  Ṫ - tail (get the last digit)
Jonathan Allan
quelle
13

JavaScript (ES6), 16 bis 10 Byte

n=>--n%9+1

Testfälle

Johan Karlsson
quelle
6

MATL , 3 Bytes

9X\

Probieren Sie es online!

Viele (jetzt gelöschte) Antworten haben versucht, mit modulo 9 das Ergebnis zu erzielen. Dies ist eine gute Abkürzung, funktioniert aber leider nicht für ein Vielfaches von 9. MATL hat eine Modulo-Funktion für das Intervall [1, n]. Mit diesem Modulo haben wir 1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1, etc. Diese Antwort nimmt einfach das Eingangsmodulo neun mit diesem benutzerdefinierten Modulo.

DJMcMayhem
quelle
6

Mathematica, 27 11 Bytes

Mod[#,9,1]&

Mathematics verwendet Modeinen dritten Parameter als Offset für den resultierenden Bereich des Modulos. Dies vermeidet das Dekrementieren der Eingabe und das Inkrementieren der Ausgabe.

Martin Ender
quelle
6

Python, 16 bis 20 Bytes

+4 Bytes für den Kantenfall Null.

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

repl.it

Jonathan Allan
quelle
1
Wow. Dies ist so einfach, dass es in jede Sprache portiert werden kann. Sie können sogar~-input()%9+1
Karl Napf
1
Funktioniert leider nicht für 0.
Emigna
@KarlNapf Wäre das nicht nötig print?
Jonathan Allan
@ JonathanAllan Ah, möglicherweise. Ich habe es gerade in der REPL-Umgebung getestet und das hat es geschafft.
Karl Napf
1
@ der anonyme Benutzer, der versucht hat, den Code zu bearbeiten - er hätte tatsächlich den Code beschädigt (eine Eingabe des 0Ergebnisses 9statt dessen 0, was durch den n andTeil des Codes abgedeckt wird), außerdem hätte er als 19 Bytes gezählt, nicht als 13 ( da das printund das Leerzeichen gezählt werden müssen).
Jonathan Allan
4

Julia, 12 Bytes

!n=mod1(n,9)

oder

n->mod1(n,9)

mod1ist eine Alternative, zu modder Karten zum Bereich [1, n]statt [0, n).

Martin Ender
quelle
4

PHP, 15 Bytes

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

Vorgängerversion PHP, 55 Bytes

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;
Jörg Hülsermann
quelle
Genau so habe ich es gemacht!
CT14.IT
@ CT14.IT Ich kann diesen Beitrag löschen, wenn Sie es wünschen. Dein gelöschter Beitrag war 1 Minute früher und du hast nur die while-Schleife vergessen
Jörg Hülsermann
Nein, die gelöschte Antwort war falsch, weil ich die Frage zu Beginn nicht richtig gelesen habe. Ich habe nicht versucht, die generierte Zahl zu
summieren
2
Sie können den Trick anderer Antworten hinzufügen<?=--$argv[1]%9+1?>
Crypto
3

Haskell, 35 34 Bytes

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

Probieren Sie es auf Ideone.

Erläuterung:

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
quelle
3

Perl, 15 Bytes

Beinhaltet +2 für -lp

Geben Sie eine Eingabe für STDIN ein

root.pl <<< 123

root.pl

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

Dies ist die langweilige Lösung , die bereits in vielen Sprachen gegeben hat, aber zumindest diese Version unterstützt 0auch

Interessanter ist es, echte wiederholte Hinzufügungen zu machen (wenn auch in einer anderen Reihenfolge), tatsächlich nur 1 Byte länger zu sein:

#!/usr/bin/perl -p
s%%$_+=chop%reg
Tonne Hospel
quelle
3

R 72 67 29 Bytes

Edit: Danke an @rturnbull für das Abschneiden von zwei Bytes.

n=scan();`if`(n%%9|!n,n%%9,9)
Billywob
quelle
Ich habe kürzlich erfahren, dass ifelsedies durch `if`dasselbe Verhalten ersetzt werden kann, wodurch Sie ein paar Bytes sparen.
Rturnbull
@rturnbull Ich habe mich immer gefragt, wie das iffunktioniert. Könnten Sie ein Beispiel nennen oder es vielleicht zu den Tipps zum Golfen
Billywob
Der einfachste Weg, es zu verstehen, ist, dass es nicht vektorisiert ist ifelse. `if`(n%%9|!n,n%%9,9)Bietet in diesem Fall dasselbe Verhalten wie der von Ihnen veröffentlichte Code. Soweit ich das beurteilen kann, ist dieses Verhalten nicht dokumentiert! Ich werde dem Tips-Thread einen Kommentar hinzufügen.
Rturnbull
3

Retina , 7 Bytes

{`.
*
.

Probieren Sie es online!

Ich sehe viele mathematische Lösungen, aber in Retina scheint der direkte Ansatz der beste zu sein.

Erläuterung

{`Lässt das gesamte Programm in einer Schleife ablaufen, bis sich der String nicht mehr ändert. Die Schleife besteht aus zwei Stufen:

.
*

Wandle jede Ziffer in eine unäre um.

.

Zählen Sie die Anzahl der Zeichen (= konvertieren Sie die unäre Zahl in eine Dezimalzahl).

Dies funktioniert, da beim Konvertieren jeder Ziffer in eine unäre Zahl ohne Trennzeichen zwischen den Ziffern eine einzelne unäre Zahl erstellt wird, die der Summe aller Ziffern entspricht.

Löwe
quelle
2

Brachylog , 9 Bytes

#0|@e+:0&

Probieren Sie es online!

Erläuterung

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

Alternativer Ansatz, 11 Bytes

: I: {@ e +} i # 0

Dieser verwendet das Meta-Prädikat i - Iterate, um Idas Prädikat {@e+}für die Eingabe aufzurufen . Dies versucht Werte von Ivon 0bis unendlich, bis man es so macht, dass die Ausgabe von ieine einzelne Ziffer ist, die #0wahr macht .

Tödlich
quelle
2

JavaScript (ES6), 41 38 Byte

3 Bytes gespart, dank Bassdrop Cumberwubwubwub

Nimmt und gibt einen String zurück.

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

Testfälle

Arnauld
quelle
4
Du kannst wechseln s.split``zu[...s]
Bassdrop Cumberwubwubwub
2

CJam , 19 13 Bytes

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

Dolmetscher

Erläuterung:

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)

Vielen Dank an 8478 (Martin Ender) für -6 Bytes.


CJam, 6 Bytes

ri(9%)

Vorgeschlagen von 8478 (Martin Ender). Dolmetscher

Ich habe darüber nachgedacht, aber Martin hat es gerade vor mir. Erläuterung:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment
Erik der Outgolfer
quelle
Einzelbefehlszuordnung und Reduzieren können beide mit Präfix geschrieben werden :, so dass Sie dies tun können :~:+. Es tut auch nicht weh, den Block mindestens einmal auszuführen, sodass Sie eine gSchleife anstelle einer wSchleife verwenden können.
Martin Ender
@MartinEnder r{_,1>}{:~:+`}wfunktioniert, aber ich weiß nicht, wie um alles in der Welt ich ghier verwenden soll.
Erik the Outgolfer
ZB so: r{:~:+_s\9>}g(Natürlich ist die Lösung in geschlossener Form ri(9%)viel kürzer.
Martin Ender
@ MartinEnder Oh gawd, im Ernst, ich bin so ein Anfänger ...
Erik der Outgolfer
Der zweite funktioniert nicht mit Vielfachen von 9
ThePlasmaRailgun
2

Java 7, 63 Bytes

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

Rekursive Funktion, die mit mod / div nur Ziffern bekommt. Nichts Außergewöhnliches.

Günstiger Hafen

von Jonathan Allan wäre eine dürftige 28 Bytes:

int f(int n){return~-n%9+1;}
Geobits
quelle
1

Python 2, 54 51 Bytes

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

Vielen Dank an Oliver und Karl Napf, die mir geholfen haben, 3 Bytes zu sparen

Daniel
quelle
Sie können ändern , while len(i)>1um while~-len(i)ein Byte zu speichern.
Oliver Ni
Ich denke, Sie können die Häkchen weglassen input()und die Eingabe in Anführungszeichen setzen, um 2 Bytes zu sparen.
Karl Napf
@ KarlNapf Ich glaube nicht, dass Sie dies tun können, wenn die Eingabe eine Ganzzahl ist.
Erik der Outgolfer
@EriktheGolfer, der Op sagte, dass die Eingabe als Zeichenfolge verwendet werden kann
Daniel
1

Python, 45 Bytes

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

Nimmt das Argument als String.

Loovjo
quelle
1

C 64 29 Bytes

C port aus Jonathan Allans Antwort (mit Sonderfall 0).

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

Vorheriger 64-Byte-Code:

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

qNimmt die Quersumme und fwiederholt die Quersumme bis zu einer einzelnen Ziffer.

Karl Napf
quelle
1

Retina , 15 Bytes

.+
$*
1{9}\B

1

Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)

Erläuterung

.+
$*

Eingabe in unär umwandeln.

(1{9})*\B

Nehmen Sie 1-basiertes Modulo, indem Sie Neunen entfernen, hinter denen mindestens ein Zeichen mehr steht.

1

Zählen Sie die verbleibende Anzahl von Einsen, um sie in Dezimalzahlen umzuwandeln.

Martin Ender
quelle
1

Perl 6 , 29 Bytes

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

Erweitert:

{ # 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
quelle
1

Faktor 24

Smart , mathy Antwort.

[ neg bitnot 9 mod 1 + ]

63 für dumme iterative Lösung:

[ [ dup 9 > ] [ number>string >array [ 48 - ] map sum ] while ]
Katze
quelle
1

Labyrinth , 8 Bytes

?(_9%)!@

mit der Gleichung (n-1)%9+1:

  • ? Liest die Eingabe als Dezimalzahl und schiebt sie zum Stapel
  • ( verringert die Oberseite des Stapels
  • _ schiebt eine Null auf die Oberseite des Stapels
  • 9 Schieben Sie die Oberseite des Stapels, und tauchen Sie um die 10-stellige Zahl auf (in diesem Fall 9).
  • % knallt y, knallt x, drückt x% y
  • ) erhöht die Oberseite des Stapels
  • ! Fügt den Anfang des Stapels ein und gibt ihn als Dezimalzeichenfolge aus
  • @ Beendet das Programm
Robert Hickman
quelle
1

Pyth - 7 4 6 7 Bytes

Nicht die beste, aber dennoch eine anständige Anzahl an Antworten:

|ejQ9 9

Wie die Vorgängerversion, jedoch auch Fälle von Vielfachen von 9 mit logischem oder.


Diese Version besteht den Testfall 45 nicht :

ejQ9

Erläuterung:

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

Probieren Sie es hier aus

Probieren Sie die vorherige Version hier aus!


Bisherige Lösungen:

&Qh%tQ9

Erklärung :

    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

Sie sind eingeladen, es hier zu versuchen !

Yotam Lachs
quelle
Ihre 4-Byte-Version schlägt Testfall 45 fehl .
Dennis
Wird das nicht 0 für ein Vielfaches von 9 geben?
xnor
Ja, ich habe es gerade bemerkt. Ich werde dort etwas reparieren. Anscheinend jQ9nicht wie Jelly's ḃ9:-P
Yotam Salmon
1

Hexagony, 19 15 Bytes

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

Mehr lesbar:

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

Probieren Sie es online!

-3 Bytes, indem Sie einen anderen Ansatz wählen, wodurch der 0-Kanten-Fall trivial wird.
-1 Byte durch Beheben des 0-Edge-Case-Fehlers

Verwenden Sie die Formel ((n-1) mod 9) + 1 wie viele andere Lösungen auch.

Adyrem
quelle
1

K (oK) , 9 Bytes

Lösung:

(+/.:'$)/

Probieren Sie es online!

Erläuterung:

Super unkompliziert. Teilen Sie die Zahl in Ziffern und fassen Sie sie zusammen, bis das Ergebnis konvergiert:

(+/.:'$)/ / 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
quelle
1
In meiner Implementierung von k habe ich x\yencode yin base xmit so vielen Ziffern wie nötig erstellt, daher ist es etwas kürzer:(+/10\)/
ngn
Nett. In den neueren Versionen von kdb + (ich denke ab 3.4) kann man das machen 10\:.. aber nicht in oK - und es .:'$ist die gleiche Anzahl von Bytes - also habe ich das gemacht :)
streetster
ok verwendet \ und benötigt eine liste auf der linken
seite
In der Tat fügt Ihre Implementierung "so viele Ziffern wie nötig" hinzu, wie Sie \:in kdb + (3.4+) erhalten, aber für oK müsste ich wissen, wie viele 10s in meine Liste aufgenommen werden müssen.
Streetster
1

Keg , 6 Bytes (SBCS im Keg-Wiki)

¿;9%1+

Erläuterung:

¿#      Take implicit input
 ;9%1+# Digital Root Formula
# Implicit output
EIN
quelle
0

Ruby, 12 Bytes

->n{~-n%9+1}
TuxCrafting
quelle
19? Sollte das nicht sein 9?
Ton Hospel
@TonHospel Ja, dummer Fehler: P
TuxCrafting