Imprimir a raiz digital

19

Isso é diferente do que o My Word pode bater no seu Word , pois é menos complexo e requer apenas que você o calcule, e não os compare.

Para encontrar a raiz digital, pegue todos os dígitos de um número, adicione-os e repita até obter um número de um dígito. Por exemplo, se o número era 12345, você gostaria de acrescentar 1, 2, 3, 4, e 5, recebendo 15. Você então adicionaria 1e 5, dando a você 6.

Sua tarefa

Dado um número inteiro N (0 <= N <= 10.000) através STDIN , imprimir a raiz digital do N .

Casos de teste

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

Lembre-se de que isso é , portanto o código com o menor número de bytes vence.

Oliver Ni
fonte
11
Talvez uma subtarefa desse desafio .
N /
3
Muito intimamente relacionado a esse desafio ... talvez perto o suficiente para um idiota.
AdmBorkBork 27/10
8
Por favor, seja mais preciso ao dizer number. Em particular. entrada deve 0ser suportada?
Ton Hospel
2
@ TimmyD Eu acho que esse é o desafio mais limpo sem adicionar letra à conversão de número inteiro, calculando a função para dois valores e incluindo o literal STALEMATE. Talvez seja melhor fechar o outro como um burro disso.
Martin Ender
3
@MartinEnder Retirei meu voto próximo, acho injusto encerrar um bom desafio como burro de outro desafio mais complexo.
Erik the Outgolfer

Respostas:

17

Geléia , 7 5 4 3 bytes

ḃ9Ṫ

TryItOnline! ou todos os casos de teste

Quão?

A raiz digitais é conhecida a obedecer à fórmula (n-1)% 9 + 1.
É o mesmo que o último dígito na base bijetiva 9
(e devido à implementação que 0ḃ9=[]e []Ṫ=0isso lida com o caso de zero).

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

JavaScript (ES6), 16 10 bytes

n=>--n%9+1

Casos de teste

Johan Karlsson
fonte
6

MATL , 3 bytes

9X\

Experimente online!

Muitas (respostas agora excluídas) tentaram usar o módulo 9 para obter o resultado. Este é um ótimo atalho, mas infelizmente não funciona para múltiplos de 9. O MATL tem uma função para módulo no intervalo [1, n]. Usando este módulo, temos 1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1, etc. Essa resposta simplesmente pega o módulo de entrada nove usando esse módulo personalizado.

DJMcMayhem
fonte
6

Mathematica, 27 11 bytes

Mod[#,9,1]&

O Mathematica Modusa um terceiro parâmetro como um deslocamento da faixa resultante do módulo. Isso evita diminuir a entrada e aumentar a saída.

Martin Ender
fonte
6

Python, 16 20 bytes

+4 bytes para lidar com maiúsculas e minúsculas zero.

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

repl.it

Jonathan Allan
fonte
11
Uau. Isso é tão fácil que pode ser portado para qualquer idioma. Você pode até~-input()%9+1
Karl Napf 27/10
11
Infelizmente não funciona para 0.
Emigna
@KarlNapf Isso não precisaria de um print?
Jonathan Allan
@JonathanAllan Ah, possivelmente. Acabei de o testar no ambiente REPL e o fiz.
Karl Napf
11
@ o usuário anônimo que tentou uma edição - ele teria realmente quebrado o código (feito uma entrada de 0resultado em 9vez de 0, que é o que é atendido pela n andparte do código) além disso, contaria 19 bytes e não 13 ( desde que o printespaço seja contado).
Jonathan Allan
4

Julia, 12 bytes

!n=mod1(n,9)

ou

n->mod1(n,9)

mod1é uma alternativa à modqual mapeia o intervalo em [1, n]vez de [0, n).

Martin Ender
fonte
4

PHP, 15 bytes

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

Versão anterior PHP, 55 bytes

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;
Jörg Hülsermann
fonte
Exatamente como eu fiz isso!
CT14.IT 27/10/16
@ CT14.IT Posso excluir este post, se desejar. A sua mensagem apagada ws 1 minuto antes e você só esqueceu a loop while
Jörg Hülsermann
Nah the deleted answer was wrong because I didn't read the question properly to start with, I didnt attempt to sum the generated number
CT14.IT
2
You can add the trick of other answers <?=--$argv[1]%9+1?>
Crypto
3

Haskell, 35 34 bytes

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

Try it on Ideone.

Explanation:

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

Perl, 15 bytes

Includes +2 for -lp

Give input on STDIN

root.pl <<< 123

root.pl

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

This is the boring solution that has already been given in many languages, but at least this version supports 0 too

More interesting doing real repeated additions (though in another order) is in fact only 1 byte longer:

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

R, 72 67 29 bytes

Edit: Thanks to @rturnbull for shaving off two bytes.

n=scan();`if`(n%%9|!n,n%%9,9)
Billywob
fonte
I recently learned that ifelse can be replaced by `if`, with identical behavior, which saves you a couple of bytes.
rturnbull
@rturnbull I was always wondering how ` if ` worked. Could you give an example or maybe add it to Tips for golfing in ?
Billywob
The simplest way to understand it is that it's a non-vectorized ifelse. In this case, `if`(n%%9|!n,n%%9,9) provides identical behavior to the code you've posted. As far as I can tell, this behavior is undocumented! I'll add a comment to the tips thread.
rturnbull
3

Retina, 7 bytes

{`.
*
.

Try it online!

I see lots of mathematical solutions, but in Retina the straightforward approach seems to be the best one.

Explanation

{` makes the whole program run in a loop until the string doesn't change anymore. The loop consists of two stages:

.
*

Convert each digit to unary.

.

Count the number of characters (=convert the unary number to decimal).

This works because converting each digit to unary with no separator between digits creates a single unary number which is equal to the sum of all digits.

Leo
fonte
2

Brachylog, 9 bytes

#0|@e+:0&

Try it online!

Explanation

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

Alternative approach, 11 bytes

:I:{@e+}i#0

This one uses the meta-predicate i - Iterate to call I times the predicate {@e+} on the input. This will try values of I from 0 to infinity until one makes it so that the output of i is a single digit which makes #0 true.

Fatalize
fonte
2

JavaScript (ES6), 41 38 bytes

Saved 3 bytes, thanks to Bassdrop Cumberwubwubwub

Takes and returns a string.

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

Test cases

Arnauld
fonte
4
You can change s.split`` to [...s]
Bassdrop Cumberwubwubwub
2

CJam, 19 13 bytes

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

Interpreter

Explanation:

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)

Thanks to 8478 (Martin Ender) for -6 bytes.


CJam, 6 bytes

ri(9%)

Suggested by 8478 (Martin Ender). Interpreter

I was thinking about it, but Martin just got it before me. Explanation:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment
Erik the Outgolfer
fonte
Single-command map and reduce can both be written with prefix :, so you can do :~:+. It also doesn't hurt to run the block at least once so you can use a g loop instead of a w loop.
Martin Ender
@MartinEnder r{_,1>}{:~:+`}w works, but I don't know how on earth am I supposed to use g here.
Erik the Outgolfer
E.g. like this: r{:~:+_s\9>}g (of course the closed form solution ri(9%) is much shorter.
Martin Ender
@MartinEnder Oh gawd, for real now, I'm such a beginner...
Erik the Outgolfer
The second one doesn't work on multiples of 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;}

Recursive function which just gets digits with mod/div. Nothing fancy.

Cheap port

of Jonathan Allan's would be a measly 28 bytes:

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

Python 2, 54 51 bytes

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

Thanks to Oliver and Karl Napf for helping me save 3 bytes

Daniel
fonte
You can change while len(i)>1 to while~-len(i) to save one byte.
Oliver Ni
Eu acho que você pode omitir os ticks input()e forçar a entrada entre aspas para economizar 2 bytes.
27616 Karl Napf
@KarlNapf Eu não acho que você pode fazer isso quando a entrada é um número inteiro.
Erik the Outgolfer
@EriktheGolfer, the op said that the input can be taken as a string
Daniel
1

Python, 45 bytes

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

Takes the argument as a string.

Loovjo
fonte
1

05AB1E, 6 bytes

[SODg#

Try it online!

Explanation

[        # infinite loop
 S       # split into digits
  O      # sum digits
   Dg#   # if length == 1: break
Emigna
fonte
1

C, 64 29 bytes

C port from Jonathan Allan's answer (with special case 0).

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

Previous 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;}

q takes the cross sum and f repeats taking the cross sum until a single digit.

Karl Napf
fonte
1

Retina , 15 bytes

.+
$*
1{9}\B

1

Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)

Explicação

.+
$*

Converter entrada para unário.

(1{9})*\B

Tome um módulo baseado em 1 removendo noves que tenham pelo menos mais um caractere depois deles.

1

Conte o número restante de 1s para converter novamente em decimal.

Martin Ender
fonte
1

Perl 6 , 29 bytes

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

Expandido:

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

Fator , 24

Resposta inteligente e matemática .

[ neg bitnot 9 mod 1 + ]

63 para solução iterativa burra:

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

Labirinto , 8 bytes

?(_9%)!@

usando a equação (n-1)%9+1:

  • ? lê a entrada como decimal e a envia para a pilha
  • ( diminui o topo da pilha
  • _ coloca um zero no topo da pilha
  • 9 empurre a parte superior da pilha estalada vezes 10 o dígito (neste caso, 9)
  • % aparece y, aparece x, empurra x% y
  • ) incrementa o topo da pilha
  • ! aparece o topo da pilha e coloca-o como uma string decimal
  • @ finaliza o programa
Robert Hickman
fonte
1

Pitão - 7 4 6 7 bytes

Não é a melhor, mas ainda supera uma quantidade decente de respostas:

|ejQ9 9

Como a versão anterior, mas também manipulando casos de múltiplos de 9, usando lógica ou.


Esta versão falha no 45 testcase :

ejQ9

Explicação:

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

Experimente aqui

Experimente a versão anterior aqui!


Soluções anteriores:

&Qh%tQ9

Explicação :

    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

Você está convidado a experimentar aqui !

Yotam Salmon
fonte
Sua versão de 4 bytes falha no caso de teste 45 .
Dennis
Isso não dará 0 para múltiplos de 9?
Xnor
Sim, eu só notei isso. Vai fazer alguma correção lá. Aparentemente, jQ9não age como Jelly ḃ9:-P
Yotam Salmon
1

Hexagonia, 19 15 bytes

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

Mais legível:

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

Experimente online!

-3 bytes, adotando uma abordagem diferente, tornando o caso da aresta 0 trivial.
-1 byte corrigindo 0 erro de caso de borda

Usando a fórmula ((n-1) mod 9) + 1, como muitas outras soluções também.

Adyrem
fonte
1

K (oK) , 9 bytes

Solução:

(+/.:'$)/

Experimente online!

Explicação:

Super direto. Divida o número em dígitos e resuma - faça isso até o resultado convergir:

(+/.:'$)/ / the solution
(      )/ / do this until result converges
      $   / string, 1234 => "1234"
   .:'    / value each, "1234" => 1 2 3 4
 +/       / sum over, 1 2 3 4 => 10
rua
fonte
11
Na minha implementação do k, fiz a x\ycodificação yna base xcom o número de dígitos necessário, por isso é um pouco mais curto:(+/10\)/
ngn
Agradável. Nas versões mais recentes do kdb + (penso de 3,4 e acima) você pode fazer 10\:.. mas não em OK - e .:'$é o mesmo número de bytes - então eu fui com que :)
streetster
oK usa \ e requer uma lista à esquerda: `(, 10)`
ngn
De fato, sua implementação adiciona "quantos dígitos forem necessários", que é o que você obtém \:no kdb + (3.4+), mas para oK eu precisaria saber quantos 10s colocar na minha lista.
Streetster 21/06
1

Barril , 6 bytes (SBCS no wiki do barril)

¿;9%1+

Explicação:

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

Ruby, 12 bytes

->n{~-n%9+1}
TuxCrafting
fonte
19? Isso não deveria ser 9?
Ton Hospel
@TonHospel Sim, erro estúpido: P
TuxCrafting