Quanto tempo dura o meu número: Versão Restrita


8

Encontre o desafio original aqui

Desafio

Dado um número inteiro, Zno intervalo -2^31 < Z < 2^31, imprima o número de dígitos nesse número (na base 10).

Regras

Você não deve usar nenhuma função de string (no caso de sobrecarga, não deve passar uma string para funções que atuam como funções de string e de número inteiro). Você não tem permissão para armazenar o número como uma sequência.

Todas as funções matemáticas são permitidas.

Você pode receber entrada em qualquer base, mas a saída deve ser o comprimento do número na base 10.

Não conte o sinal de menos para números negativos. O número nunca será um decimal.

O zero é efetivamente um zero inicial, portanto pode ter zero ou um dígito.

Exemplos

Input > Output

-45 > 2
1254 > 4
107638538 > 9
-20000 > 5
0 > 0 or 1
-18 > 2

Ganhando

O menor código em bytes vence.


Eu assumo que nenhuma função de matriz também?
Cyoce 19/05/19

@Cyoce Sim, sem funções de matriz
Beta Decay

Então, se um idioma aceita apenas entrada como uma string, é inválido para esse desafio, certo?
Engenheiro Toast

@EngineerToast Sim, muito mesmo
Beta Decay

Estou removendo a tag de fonte restrita porque, embora essa seja uma restrição, não é uma restrição de fonte real, pois não é tratável por computador.
Ad Hoc Garf Hunter

Respostas:


9

Mathematica, 13 bytes

IntegerLength

Bem...


De acordo com codegolf.meta.stackexchange.com/a/3605/14732, essa pergunta é duplicada.
Ismael Miguel

@IsmaelMiguel Bem, esse é um caso um pouco mais complicado, porque o desafio é efetivamente uma duplicata em alguns idiomas, mas não em outros.
Martin Ender

A maioria das respostas pode ser copiada para aqui.
Ismael Miguel

@IsmaelMiguel Eu precisaria contar, mas acredito que a maioria das respostas do desafio anterior usava o processamento de strings, o que não é uma opção aqui.
Martin Ender

Meh, eu perdi a conta 3 vezes. Mas, na verdade, parece estar em torno de 30 a 45% das respostas. Aqueles podem ser apenas copiados.
Ismael Miguel



6

JavaScript (ES6), 19 bytes

f=n=>n&&f(n/10|0)+1

console.log(f(-45))       // 2
console.log(f(1254))      // 4
console.log(f(107638538)) // 9
console.log(f(-20000))    // 5
console.log(f(0))         // 0
console.log(f(-18))       // 2


contamos "f ="? Muitas das outras línguas aqui apresentam a definição de função por si só.
Sparr

5
@Sparr Esta é uma função recursiva que se refere a si mesma. Então, neste caso especial, sim, contamos f=.
Arnauld

4

Geléia , 3 2 bytes

1 byte economizado graças a Leaky Nun

DL

Experimente online!

Explicação

 L    Length of
D     Decimal expansion of input argument. Works for negative values too


Eu estava tentando fazer isso. Mas não consegui encontrar o que precisava na página de códigos :(
Christopher

"comprimento" de um inteiro, usando a mesma função que dá o comprimento de uma corda, realmente se sente como uma função de cadeia ...
Sparr

1
Não é o comprimento de um número inteiro, mas de uma lista de seus dígitos (obtida com D). O desafio diz: no caso de sobrecarga, você não deve passar uma string em funções que agem tanto como corda e inteiro funções Esta resposta segue essa regra: Eu não estou passando uma string
Luis Mendo

4

Minha resposta do outro desafio ainda funciona:

Braquilog , 1 byte

l

Experimente online!

O lbuiltin está sobrecarregado, mas em números inteiros, leva o número de dígitos do número inteiro, ignorando o sinal.


3

Código de Chamada , 5 bytes

pqL_+

Nota: Esse é exatamente o mesmo código do outro desafio

Explicação

pqL_+ print(
    +   succ(
   _      floor(
  L        log_10(
pq           abs(
               input())))))






1

Alice , 16 bytes

/O
\I@/Hwa:].$Kq

Experimente online!

Explicação

/O
\I@/...

Isto é simplesmente uma estrutura para entrada numérica → processamento matemático → saída numérica.

O restante do código é o algoritmo real:

Hwa:].$Kq
H            Compute absolute value
 w   .$K     While the result is not zero do:
  a:           divide the number by 10
    ]          move the tape head one cell forward
        q    Get the position of the tape head


1

C, 27 bytes

Experimente on-line

f(n){return n?1+f(n/10):0;}

C (gcc), 22 bytes

f(n){n=n?1+f(n/10):0;}

Usando matemática, 29 bytes

f(n){return 1+log10(abs(n));}







0

PowerShell, 52 51 bytes

$m=[math];$m::Floor($m::Log10($m::Abs($args[0])))+1

Agradecemos a Felipe por corrigir o problema com o Log10 e por salvar 1byte.

Todas as System.Mathchamadas são extremamente caras no PowerShell.

Usa o método de obter o Log10 do valor Abs da entrada e arredondá-lo para cima.


você deveria usar Floor()+1. Ceil()falha por potências de 10
Felipe Nardi Batista

usar $m::Log10(...para salvar um byte
Felipe Nardi Batista

0

QBIC , 25 bytes

≈abs(:)>=1|b=b+1┘a=a/z}?b

Isso divide a entrada por 10 e controla quantas vezes podemos fazer isso até N<1.

Explicação:

≈abs(:)>=1| : gets cmd line input, 
            ≈ starts a while loop,
            abs() is literal QBasic code and is for cases with negative n
            | is the terminator to the WHILE-condition
b=b+1       Keep track of the # of divisions        
┘           Syntactic line break
a=a/z       Divide a by 10 (z==10 in QBIC)
}           End WHILE-loop body
?b          PRINT b




0

Na verdade , 8 bytes

;0=+A╥Lu

Experimente online!

Explicação:

;0=+A╥Lu
;0=       is input equal to 0?
   +      add 1 if input is 0, else add 0
    A     absolute value
     ╥L   log base 10, floor
       u  increment

Este programa efetivamente calcula floor(log10(x))+1. Para lidar com o fato de log(0)ser indefinido (na verdade, ele retorna (-inf+nanj)uma maneira especial de dizer que não é definido), a entrada é incrementada se for 0anterior ao cálculo do comprimento. Assim, 0é considerado como tendo um comprimento de 1.



0

Ruby, 27 bytes

f=->x{x==0?0:1+f[x.abs/10]}

Como teste:

tests = [[-45 , 2],
         [1254 , 4],
         [107638538 , 9],
         [-20000 , 5],
         [0 , 0 ],
         [-18 , 2]]

tests.each do |i, o|
  p f.call(i) == o
end

Emite:

true
true
true
true
true
true

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.