Stampa la radice digitale


19

Questo è diverso da My Word può battere la tua Word in quanto è meno complessa e richiede solo di calcolarla e non confrontarla.

Per trovare la radice digitale, prendi tutte le cifre di un numero, aggiungile e ripeti finché non ottieni un numero di una cifra. Ad esempio, se il numero fosse 12345, si dovrebbe aggiungere 1, 2, 3, 4, e 5, sempre 15. Quindi aggiungeresti 1e 5, dandoti 6.

Il tuo compito

Dato un intero N (0 <= N <= 10000) attraverso STDIN , stampare la radice numerica di N .

Casi test

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

Ricorda, questo è , quindi vince il codice con il minor numero di byte.


1
Forse una sottoattività di questa sfida .
nimi,

3
Molto strettamente legato a questa sfida ... forse abbastanza vicino per un ingannatore.
AdmBorkBork,

8
Si prega di essere più precisi quando si dice number. In particolare. l'input deve 0essere supportato?
Ton Hospel,

2
@TimmyD Penso che questa sia la sfida molto più pulita senza aggiungere la conversione da lettera a numero intero, calcolando la funzione per due valori e includendo il valore letterale STALEMATE. Potrebbe essere meglio chiudere l'altro come duplicato di questo.
Martin Ender,

3
@MartinEnder Ho ritirato il mio voto ravvicinato, penso che sia ingiusto chiudere una buona sfida come ingannatore di un'altra sfida più complessa.
Erik the Outgolfer,

Risposte:



17

Gelatina , 7 5 4 3 byte

ḃ9Ṫ

TryItOnline! o tutti i casi di test

Come?

La radice numerica si caratterizza per rispettare la formula (n-1) + 1% 9.
Questo è lo stesso dell'ultima cifra nella base biiettiva 9
(e grazie all'implementazione che 0ḃ9=[]e []Ṫ=0questo gestisce il caso limite di zero).

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

13

JavaScript (ES6), 16 10 byte

n=>--n%9+1

Casi test


6

MATL , 3 byte

9X\

Provalo online!

Molte (risposte ora eliminate) hanno provato a utilizzare il modulo 9 per ottenere il risultato. Questo è un ottimo collegamento, ma sfortunatamente non funziona per multipli di 9. MATL ha una funzione per modulo sull'intervallo [1, n]. Usando questo modulo, abbiamo 1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1, ecc. Questa risposta prende semplicemente l'input modulo nove usando questo modulo personalizzato.


6

Mathematica, 27 11 byte

Mod[#,9,1]&

Mathematica Modaccetta un terzo parametro come offset dell'intervallo risultante del modulo. Ciò evita il decremento dell'ingresso e l'incremento dell'uscita.


6

Python, 16 20 byte

+4 byte per gestire il caso limite pari a zero.

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

repl.it


1
Wow. È così facile che può essere portato in qualsiasi lingua. Puoi persino~-input()%9+1
Karl Napf,

1
Sfortunatamente non funziona per 0.
Emigna,

@KarlNapf Non sarebbe necessario print?
Jonathan Allan,

@JonathanAllan Ah, forse. L'ho appena testato nell'ambiente REPL e lo ha fatto.
Karl Napf,

1
@ l'utente anonimo che ha tentato una modifica - avrebbe effettivamente violato il codice (immesso un 0risultato in 9anziché anziché 0, che è ciò che viene soddisfatto dalla n andparte del codice) inoltre avrebbe contato come 19 byte e non 13 ( poiché è printnecessario contare lo spazio e).
Jonathan Allan,

4

Julia, 12 byte

!n=mod1(n,9)

o

n->mod1(n,9)

mod1è un'alternativa a modquale mappa dell'intervallo [1, n]anziché [0, n).


4

PHP, 15 byte

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

Versione precedente PHP, 55 byte

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;

Esattamente come l'ho fatto!
CT14.IT,

@ CT14.IT Se lo desideri, posso eliminare questo post. Il tuo post cancellato ws 1 minuto prima e hai dimenticato solo il ciclo while
Jörg Hülsermann,

No, la risposta cancellata era sbagliata perché non avevo letto la domanda correttamente per cominciare, non ho tentato di sommare il numero generato
CT14.IT

2
Puoi aggiungere il trucco di altre risposte<?=--$argv[1]%9+1?>
Crypto,

3

Haskell, 35 34 byte

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

Provalo su Ideone.

Spiegazione:

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

3

Perl, 15 byte

Include +2 per -lp

Dare input su STDIN

root.pl <<< 123

root.pl

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

Questa è la soluzione noiosa che è già stata fornita in molte lingue, ma almeno questa versione supporta 0anche

Più interessante fare aggiunte ripetute reali (anche se in un altro ordine) è in realtà solo 1 byte più lungo:

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

3

R, 72 67 29 byte

Modifica: grazie a @rturnbull per la rasatura di due byte.

n=scan();`if`(n%%9|!n,n%%9,9)

Di recente ho appreso che ifelsepuò essere sostituito da `if`, con comportamento identico, che consente di risparmiare un paio di byte.
rturnbull,

@rturnbull Mi chiedevo sempre come ` if` ha funzionato. Potresti fare un esempio o magari aggiungerlo a Suggerimenti per giocare a golf?
Billywob,

Il modo più semplice per capirlo è che non è un vettore ifelse. In questo caso, `if`(n%%9|!n,n%%9,9)fornisce un comportamento identico al codice che hai pubblicato. Per quanto ne so, questo comportamento non è documentato! Aggiungerò un commento al thread dei suggerimenti.
rturnbull,

3

Retina , 7 byte

{`.
*
.

Provalo online!

Vedo molte soluzioni matematiche, ma in Retina l'approccio diretto sembra essere il migliore.

Spiegazione

{`rende l'intero programma eseguito in un ciclo fino a quando la stringa non cambia più. Il ciclo è costituito da due fasi:

.
*

Converti ogni cifra in unaria.

.

Contare il numero di caratteri (= convertire il numero unario in decimale).

Questo funziona perché la conversione di ogni cifra in unaria senza separatore tra le cifre crea un singolo numero unario che è uguale alla somma di tutte le cifre.


2

Brachylog , 9 byte

#0|@e+:0&

Provalo online!

Spiegazione

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

Approccio alternativo, 11 byte

: I: {@ e +} i # 0

Questo usa il meta-predicato i - Iterateper chiamare Ivolte il predicato {@e+}sull'input. Questo proverà valori da Ida 0a infinito fino a quando uno non lo farà in modo che l'output di isia una singola cifra che diventa #0vera.


2

JavaScript (ES6), 41 38 byte

Salvato 3 byte, grazie a Bassdrop Cumberwubwubwub

Prende e restituisce una stringa.

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

Casi test


4
Puoi cambiare s.split``in[...s]
Bassdrop Cumberwubwubwub,

2

CJam , 19 13 byte

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

Interprete

Spiegazione:

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)

Grazie a 8478 (Martin Ender) per -6 byte.


CJam, 6 byte

ri(9%)

Suggerito da 8478 (Martin Ender). Interprete

Ci stavo pensando, ma Martin me l'ha appena preso. Spiegazione:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment

La mappa a comando singolo e la riduzione possono essere entrambe scritte con il prefisso :, quindi puoi farlo :~:+. Inoltre, non fa male eseguire il blocco almeno una volta in modo da poter usare un gciclo invece di un wciclo.
Martin Ender,

@MartinEnder r{_,1>}{:~:+`}wfunziona, ma non so come diavolo dovrei usare gqui.
Erik the Outgolfer,

Ad esempio in questo modo: r{:~:+_s\9>}g(ovviamente la soluzione a forma chiusa ri(9%)è molto più breve.
Martin Ender,

@MartinEnder Oh Dio, davvero, sono un principiante ...
Erik the Outgolfer,

Il secondo non funziona su multipli di 9
ThePlasmaRailgun

2

Java 7, 63 byte

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

Funzione ricorsiva che ottiene solo cifre con mod / div. Nulla di bello.

Porto economico

di Jonathan Allan sarebbe un misero 28 byte:

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

1

Python 2, 54 51 byte

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

Grazie a Oliver e Karl Napf per avermi aiutato a salvare 3 byte


È possibile passare while len(i)>1a while~-len(i)per salvare un byte.
Oliver Ni,

Penso che puoi omettere i segni di spunta input()e forzare l'input tra parentesi per salvare 2 byte.
Karl Napf,

@KarlNapf Non penso che tu possa farlo quando l'input è un numero intero.
Erik the Outgolfer,

@EriktheGolfer, l'op ha detto che l'input può essere preso come una stringa
Daniel

1

Python, 45 byte

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

Prende l'argomento come una stringa.



1

C, 64 29 byte

Porta C dalla risposta di Jonathan Allan (con il caso speciale 0).

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

Codice a 64 byte precedente:

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

qprende la somma incrociata e si fripete prendendo la somma incrociata fino a una singola cifra.


1

Retina , 15 byte

.+
$*
1{9}\B

1

Provalo online! (La prima riga abilita una suite di test separata da avanzamento riga.)

Spiegazione

.+
$*

Converti input in unario.

(1{9})*\B

Prendi un modulo basato su 1 rimuovendo nove che hanno almeno un carattere in più dopo di loro.

1

Contare il numero rimanente di 1s per riconvertire in decimale.


1

Perl 6 , 29 byte

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

Allargato:

{ # 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
}

1

Fattore , 24

Risposta intelligente e mathica .

[ neg bitnot 9 mod 1 + ]

63 per soluzione iterativa muta:

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

1

Labirinto , 8 byte

?(_9%)!@

usando l'equazione (n-1)%9+1:

  • ? legge l'input come decimale e lo inserisce nello stack
  • ( decrementa la parte superiore della pila
  • _ spinge uno zero in cima alla pila
  • 9 spingere la parte superiore della pila spuntata per 10 volte la cifra (in questo caso, 9)
  • % fa apparire y, fa apparire x, spinge x% y
  • ) incrementa la parte superiore della pila
  • ! apre la parte superiore dello stack e lo inserisce come una stringa decimale
  • @ termina il programma

1

Pyth - 7 4 6 7 byte

Non il migliore, ma batte comunque una discreta quantità di risposte:

|ejQ9 9

Come la versione precedente, ma gestendo anche casi di multipli di 9, usando logico o.


Questa versione non supera il testcase 45 :

ejQ9

Spiegazione:

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

Provalo qui

Prova qui la versione precedente!


Soluzioni precedenti:

&Qh%tQ9

Spiegazione :

    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

Sei invitato a provarlo qui !


La versione a 4 byte non supera il caso di test 45 .
Dennis,

Questo non darà 0 per multipli di 9?
xnor

Sì, l'ho appena notato. Farà qualche aggiustamento lì. Apparentemente, jQ9non si comporta come Jelly's ḃ9:-P
Yotam Salmon


1

Esagonia, 19 15 byte

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

Più leggibile:

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

Provalo online!

-3 byte adottando un approccio diverso, rendendo banale il caso 0 edge.
-1 byte correggendo il bug di 0 edge case

Utilizzando la formula ((n-1) mod 9) + 1 come molte altre soluzioni.


1

K (oK) , 9 byte

Soluzione:

(+/.:'$)/

Provalo online!

Spiegazione:

Super semplice. Dividi il numero in cifre e riassumi: fallo fino a quando il risultato non converge:

(+/.:'$)/ / the solution
(      )/ / do this until result converges
      $   / string, 1234 => "1234"
   .:'    / value each, "1234" => 1 2 3 4
 +/       / sum over, 1 2 3 4 => 10

1
Nella mia implementazione di k ho fatto la x\ycodifica yin base xcon tutte le cifre necessarie, quindi è leggermente più breve:(+/10\)/
ngn

Bello. Nelle versioni più recenti di kdb + (penso dalla 3.4 in poi) puoi farlo 10\:.. ma non in oK - ed .:'$è lo stesso numero di byte - quindi ci sono andato :)
streetster

oK usa \ e richiede un elenco a sinistra: `(, 10)`
ngn

In effetti, la tua implementazione aggiunge "tutte le cifre necessarie", che è ciò che ottieni da \:kdb + (3.4+), ma per OK dovrei sapere quanti 10s mettere nella mia lista.
streetster,

1

Keg , 6 byte (SBCS su Keg wiki)

¿;9%1+

Spiegazione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.