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.

Beta Decay
fonte
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...

Martin Ender
fonte
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
7

Python 2 , 30 bytes

f=lambda x:x and-~f(abs(x)/10)

Experimente online!

Freira Furada
fonte
@ Notts90 sim, porque é referenciado por dentro.
Leaky Nun
7

Japonês , 5 3 bytes

ì l

Experimente online!

Lucas
fonte
1
Fiz uma correção que torna adesnecessário - 5 minutos antes do lançamento do desafio :-) Infelizmente, isso significa que ele só funcionará no intérprete online. ( teste on-line! )
ETHproductions
Impressionante. Bem feito ninja'ing a pergunta; )
Lucas
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

Arnauld
fonte
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
Luis Mendo
fonte
DL?
Freira vazando
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.


fonte
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())))))
Roman Gräf
fonte
2

SILOS , 41 bytes

readIO
i|
lblb
i/10
a+1
if i b
printInt a

Experimente online!

Retorna 1para 0.

Freira Furada
fonte
Por que não há amor por SILOS, seu golfista do que python para este desafio!
Rohan Jhunjhunwala
2

Lua , 40 bytes

Porta da minha resposta python

print(math.log10(math.abs(10*...)+1)//1)

Experimente online!

Felipe Nardi Batista
fonte
1

C #, 49 56 bytes

namespace System.Math{n=>n==0?1:Floor(Log10(Abs(n))+1);}
TheLethalCoder
fonte
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
Leo
fonte
1

Python 2 , 48 bytes

-3 graças a ovs -1 graças a pizzapants

lambda x:math.log10(abs(10*x)+1)//1
import math

Experimente online!

Felipe Nardi Batista
fonte
lambda x:1+log10(abs(x)+.1)//1para 48 bytes
ovs 19/05/19
import mathe math.log10salva um byte
pizzapants184
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));}
Khaled.K
fonte
1

R , 40 bytes

function(x)max(ceiling(log10(abs(x))),0)

Experimente online!

JayCe
fonte
0

MATL , 5 bytes

|OYAn

Experimente online!

Explicação

|     % Implicitly input a number. Absolute value
OYA   % Convert to array of decimal digits
n     % Length. Implicitly display
Luis Mendo
fonte
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.

colsw
fonte
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
steenbergh
fonte
0

Bash , 50 bytes

a=$1;until [ $a -eq 0 ];{ let i++ a=a/10;};echo $i

Experimente online!

Nenhum comando string / array, apenas conte dígitos por divisão inteira.

marcosm
fonte
0

bc , 6 bytes

length

Função incorporada.

eush77
fonte
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.

Mego
fonte
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
Eric Duminil
fonte