Quanto tempo dura o meu número?

26

Desafio

Dado um número inteiro, Qno intervalo -(2^100) ≤ Q ≤ 2^100, imprima o número de dígitos nesse número (na base 10).

Regras

Sim, você pode pegar o número como uma string e encontrar seu comprimento.

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 terá um ponto decimal.

Zero pode ter um ou zero dígitos.

Suponha que a entrada sempre será um número inteiro válido.

Exemplos

Input > Output

-45 > 2
12548026 > 8
33107638153846291829 > 20
-20000 > 5
0 > 1 or 0

Ganhando

O menor código em bytes vence.

Beta Decay
fonte

Respostas:

10

Braquilog , 1 byte

l

Experimente online!

Outra solução integrada, mas essa tem o nome mais curto (a menos que alguém encontre um idioma que execute essa tarefa em zero bytes). Isso deve funcionar no Brachylog 1 e no Brachylog 2.

Esse é um envio de função (o link TIO contém um argumento de linha de comando que faz com que o intérprete execute uma função individual em vez de um programa inteiro), em parte porque, caso contrário, teríamos que gastar bytes na saída, em parte porque a sintaxe de Brachylog para negativos numbers é um tanto incomum e tornar esse programa uma função resolve possíveis argumentos sobre a sintaxe de entrada.

Muitas vezes me incomodou que a maioria dos componentes internos de Brachylog tratem números negativos como positivos, mas esse fato acabou sendo útil aqui. Eu acho que existem compensações envolvidas em todos os idiomas do golfe.


fonte
É aqui que eu paro de rolar ... isso é ultrajante!
Bogdan Alexandru
39

Táxi , 1118 bytes

1 is waiting at Starchild Numerology.Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Pickup a passenger going to Crime Lab.'-' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 3 l.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "n" if no one is waiting.-1 is waiting at Starchild Numerology.[n]0 is waiting at Starchild Numerology.Go to Starchild Numerology:s 1 r 1 l 1 l 2 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 2 r.[r]Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Go to Chop Suey:n 1 r 2 r.Switch to plan "f" if no one is waiting.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 l 3 l 1 l.Go to Cyclone:n 1 l.Switch to plan "r".[f]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Experimente online!

Ungolfed:

1 is waiting at Starchild Numerology.
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Pickup a passenger going to Crime Lab.
'-' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 3rd left.
Pickup a passenger going to Crime Lab.
Go to Crime Lab: north 1st right 2nd right 2nd left.
Switch to plan "n" if no one is waiting.
-1 is waiting at Starchild Numerology.
[n]
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: south 1st right 1st left 1st left 2nd left.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Cyclone: east 1st left 2nd right.
[r]
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Go to Chop Suey: north 1st right 2nd right.
Switch to plan "f" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left 3rd left 1st left.
Go to Cyclone: north 1st left.
Switch to plan "r".
[f]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Explicação:

Pickup the input and split it into individual characters
Pickup the value 1.
If the first character a hyphen, add -1. Otherwise, add 0.
Keep picking up characters and adding 1 until you're out.
Convert the running total to a string and print to stdout.
Engenheiro Toast
fonte
8
Eu fui um lurker nesta troca por um longo tempo, mas nunca vi algo como isto
Cup of Java
7
Isso ficará sem gás se o número for longo o suficiente?
Robert Fraser
5
Este é um cérebro maior do que o cérebro.
Omega
1
@RobertFraser É por isso que paramos Zoom Zoomem cada loop de plan "r". Eu apenas testei até 100.000 dígitos e nunca ficou sem gás. Não calculei, mas suponho que receba uma tarifa mais do que suficiente para pagar o gás que está usando, de modo que encha o tanque a cada ciclo.
Engineer Toast
1
@CupofJava OH MEU GOSH, como eu esqueci Shakespeare .
Engineer Toast
18

Mathematica, 13 bytes

IntegerLength

Há um built-in ... retorna 0para 0.

Martin Ender
fonte
2
O Mathematica prevalece: D
Beta Decay
1
não no código de golf não faz :)
Greg Martin
8
There's a built-in: Quando não está lá?
TheLethalCoder
14

dc, 3

?Zp

Observe que normalmente dcexige que números negativos sejam dados em _vez dos mais comuns -. No entanto, neste caso, qualquer um pode ser usado. Se -for dado, dctrata-o como uma subtração em uma pilha vazia, lança dc: stack emptye depois continua com o restante do número; Assim, o resultado não é diferente.

Experimente online .

?    # input
 Z   # measure length
  p  # print
Trauma Digital
fonte
Não poderia ser apenas Zuma apresentação de função? dcComo uma linguagem concatenativa com operadores quote + dup + eval, pode, portanto, reutilizar cadeias arbitrárias de código.
12

Retina , 2 bytes

\d

Experimente online!

O Retina realmente não sabe o que são números; portanto, a entrada é tratada como uma string e simplesmente contamos os dígitos.

Martin Ender
fonte
5

05AB1E , 2 bytes

Äg

Experimente online! ou Experimente todos os testes!

Ä  # Absolute value
 g # Length
Riley
fonte
Ä, Hã? Não þ? Justo.
Magic Octopus Urn
@carusocomputing Pensei Äprimeiro, mas lidaria þcom um ponto decimal, então é um pouco melhor, eu acho.
Riley
É legal como duas pessoas criaram duas soluções diferentes de 2 bytes dentro de 2 minutos uma da outra, mas acho que não há uma terceira; tentando pensar em um.
Magic Octopus Urn
5

Alice , 16 bytes

//; 'q<)e
o!@i -

Experimente online!

Explicação

Encontrar um layout meio decente para isso foi bastante complicado. Ainda não estou super feliz com isso por causa dos espaços, do <e do ;, mas é o melhor que posso fazer por enquanto.

O comprimento da string é um daqueles embutidos muito comuns que não existem em Alice, porque sua entrada é uma string e sua saída é um número inteiro (e todos os comandos de Alice são estritamente números inteiros para número inteiro ou cadeias de caracteres para cadeias). Podemos medir o comprimento de uma string gravando-a na fita no modo Ordinal e, em seguida, encontrando seu fim no modo Cardinal.

/      Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP will bounce
       diagonally up and down through the code.
!      Store an implicit empty string on the tape, does nothing.
;      Discard an implicit empty string, does nothing.
i      Read all input as a string.
'-     Push "-".
<      Set the horizontal component of the IP's direction to west, so we're bouncing
       back now.
-      Remove substring. This deletes the minus sign if it exists.
'i     Push "i".
;      Discard it again.
!      Store the input, minus a potential minus sign, on the tape.
/      Reflect to W. Switch to Cardinal. The IP immediately wraps to the
       last column.
e)     Search the tape to the right for a -1, which will be found at the end
       of the string we stored there.
<      Does nothing.
q      Push the tape head's position, which is equal to the string length.
'<sp>  Push " ".
;      Discard it again.
/      Reflect to NW. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SW instead.
o      Implicitly convert the string length to a string and print it.
       IP bounces off the bottom left corner, moves back NE.
/      Reflect to S. Switch to Cardinal.
!      Store an implicit 0 on the tape, irrelevant.
       The IP wraps back to the first line.
/      Reflect to NE. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SE instead.
@      Terminate the program.

Eu também tentei cuidar do sinal de menos no modo Cardinal com H(valor absoluto), mas a opção de modo adicional sempre acabava sendo mais cara em minhas tentativas.

Martin Ender
fonte
4

PHP, 23 bytes

<?=-~log10(abs($argn));

Experimente online!

log da base 10 do valor absoluto mais uma conversão para int

para zero como log10 de entrada devolve o INFque é interpretado como falso

A melhor maneira é substituí-lo $argnpor $argn?:1+3 bytes

PHP, 27 bytes

<?=strlen($argn)-($argn<0);

comprimento da string menos booleano é menor que zero

+2 bytes para comparação de cadeias $argn<"0"

Experimente online!

PHP, 32 bytes

<?=preg_match_all("#\d#",$argn);

Experimente online!

Regex conta todos os dígitos

35 bytes

<?=strlen($argn)-strspn($argn,"-");

Experimente online!

comprimento da sequência menos contagem -

strspn

Jörg Hülsermann
fonte
1
O primeiro não funciona, por exemplo 10, porque ^possui prioridade mais baixa. Você pode consertar isso -~.
User63956
Por que não simplesmente <?=strlen(abs($argn));?
Roberto06 17/05
@ user63956 A versão com log10 não pode funcionar nos casos de entrada zero, pelo que a apago.
Jörg Hülsermann 17/05
1
@ JörgHülsermann Por que não apenas $argn?:1? Seria 26 bytes com log10()e abs().
User63956
1
@ JörgHülsermann -~$xé equivalente a ((int)$x)+1. <?=-~log10(abs($argn?:1));parece funcionar.
User63956
4

Fortran 95 (gfortran), 121 96 95 bytes

program c
character b
call get_command_argument(1,b,length=i)
print*,i-index(b,'-')
end program

Explicação:
Subtrai o índice do sinal '-' do comprimento do argumento.
As matrizes começam em 1 no Fortran e index () retorna 0 se o símbolo não for encontrado.

Editar: alternado para o número inteiro implícito "i", também obturador de argumentos consolidado.

Edit: -1 byte graças a @Tsathoggua

Waffleston
fonte
1
Bem-vindo ao PPCG!
Martin Ender
3

PowerShell, 24 bytes

"$args"-replace'-'|% Le*

lança o valor "absoluto" dos argumentos de entrada em uma string e obtém a propriedade 'length' dela.

1 byte menor que "".Length

até que alguém encontre uma maneira melhor de obter o abs de um número no PS, isso é provavelmente o mais curto possível.

colsw
fonte
Que tal "$args".trim('-')|% Le*? :)
qualquer que seja
3

05AB1E , 2 bytes

þg

Experimente online!

   # Implicit input [a]...
þ  # Only the digits in [a]...
 g # length of [a]...
   # Implicit output.
Urna de polvo mágico
fonte
3

brainfuck , 37 bytes

-[+>+[+<]>+]>->,[-<->]<[>+>],[<+>,]<.

A saída é por valor de bytes.

Experimente online!

Explicação

-[+>+[+<]>+]>->  Constant for 45 (from esolangs wiki)
,                Read a byte of input
[-<->]           Subtract that byte from 45
<[>+>]           If the result is nonzero then increment a cell and move to the right
                 (0 means it was a minus; so not counted)
,[<+>,]          Read a byte and increment the cell to its left until EOF is reached
<.               Print the cell that was being incremented
Gato de negócios
fonte
É possível adicionar um rodapé ao link TIO que gera o resultado como um número?
Beta Decay
@BetaDecay Adicionado
Business Cat
Isso é brilhante, obrigado: D
Beta Decay
3

Ruby, 15 11 + 1 = 16 12 bytes

Usa a -nbandeira.

p~/$/-~/\d/

Experimente online!

Explicação

                  # -n flag gets one line of input implicitly
p                 # Print
 ~/$/             # Position of end of line (aka string length) in input
     -            # minus
      ~/\d/       # Position of first digit (1 if negative number, 0 otherwise)
Value Ink
fonte
1
Que mágica é essa?
Chowlett 17/05
2
@Chowlett adicionou uma explicação.
Value Ink
2

Geléia , 2 bytes

DL

Experimente online!

Isso faz literalmente o que foi perguntado:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2
Jonathan Allan
fonte
Esse é um interessante Drecurso interno , funciona com decimais? Será que -1.2a saída [-1,-0.2]? Tentei eu mesmo, não.
Magic Octopus Urn
1
Não é bem assim, a conversão base só vai até as unidades para que, por exemplo, 654.321Drenderia [6,5,4.321](bem, na verdade [6.0,5.0,4.321000000000026])
Jonathan Allan
[-6.0, -5.0, -4.321000000000026], na verdade, aparentemente.
Magic Octopus Urn
Ah - sim, apenas editado - aritmética de ponto flutuante.
Jonathan Allan
2

CJam , 5 bytes

q'--,

Baseado em string.

Experimente online!

9 bytes para uma solução puramente baseada em matemática:

riz)AmLm]

Ou outros 5 com conversão base:

riAb,
Gato de negócios
fonte
Ou também 5: rizs,.
Martin Ender
2

Japt , 5 bytes

a s l

Experimente online!

Explicação

 a s l
Ua s l
Ua     # take the absolute value of the input
   s   # and turn it into a string
     l # and return its length
Luke
fonte
2

JavaScript (ES6), 27 26 25 24 bytes

Recebe a entrada como uma sequência.

s=>s.match(/\d/g).length
  • Economizou dois bytes graças a Arnauld.
Shaggy
fonte
Seu título diz 23 bytes, mas o código é 24 ... No entanto, este é de 23 bytes: s=>`${s>0?s:-s}`.length!
Dom Hastings
Obrigado, @DomHastings. Você deve postar a sua como resposta separada, pois é uma abordagem diferente da minha.
Shaggy
2

JavaScript (ES6), 23 bytes

s=>`${s>0?s:-s}`.length

Abordagem diferente à resposta de Shaggy .

Dom Hastings
fonte
3
s=>s.length-(s<0)salva 6 bytes
Johan Karlsson
2

Java, 30 24 bytes

i->(""+i.abs()).length()

Supõe que ié um BigInteger. Além disso, o tipo é contextualizado, portanto, nenhuma importação é necessária, conforme mostrado no código de teste.

Teste

// No imports
class Pcg120897 {
  public static void main(String[] args) {
    java.util.function.ToIntFunction<java.math.BigInteger> f =
        // No full class declaration past here
        i->(""+i.abs()).length()
        // No full class declaration before here
      ;
    System.out.println(f.applyAsInt(new java.math.BigInteger("-1267650600228229401496703205376"))); // -(2^100)
    System.out.println(f.applyAsInt(new java.math.BigInteger("1267650600228229401496703205376"))); // (2^100)
  }
}

Salva

  • 30 -> 24 bytes: graças a @cliffroot
Olivier Grégoire
fonte
+""em vez de .toString()?
Cliffroot 18/05/19
2
+1 por fornecer código de exemplo mostrando como isso é chamado e por esclarecer o tipo de isua resposta. Acho que mais respostas lambda devem fazer isso.
puxão
1

Python 2 , 31 22 bytes

-9 bytes graças a Rod.

lambda i:len(`abs(i)`)

Experimente online!

totalmente humano
fonte
1
len(`abs(s)`)com o número de entrada é mais curto
Haste
2
Pena que o Python não tem composição de função. Seria justo len∘repr∘abs.
Roberto Bonvallet
1

Flacidez Cerebral , 63 bytes

([({})]((((()()()()())){}{})){}{})((){[()](<{}>)}{})([{}][]<>)

Experimente online!

São 62 bytes de código e +1 byte para o -asinalizador.

Tentei duas outras abordagens, mas infelizmente as duas eram mais longas:

([]<({}[((((()()()()())){}{})){}{}]<>)((){[()](<{}>)}{})>)({}[{}])

([]<>)<>({}<>)((((([][]())){}{})){}{}[{}])((){[()](<{}>)}{})([{}]{})

Esta deve ser uma resposta muito curta. De fato, se não precisássemos suportar números negativos, poderíamos simplesmente:

([]<>)

Mas temos que comparar a primeira entrada com 45 (ASCII -) primeiro, que é a maior parte da contagem de bytes desta resposta.

Uma solução aritmética pode ser mais curta.

DJMcMayhem
fonte
Eu conto 62 bytes ..?
totallyhuman
1
@totallyhuman veja minha edição.
DJMcMayhem
49 bytes:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon 17/17/17
1

Ruby, 20 bytes

->a{a.abs.to_s.size}
marmeladze
fonte
FYI: para chamá-lo, você faz:->a{a.abs.to_s.size}[-95]
Filip Bartuzi
ou apenas maneira clássica #->a{a.abs.to_s.size}.call(-92)
marmeladze
2
não é uma maneira de jogar golfe: D
Filip Bartuzi 18/17
1

R, 18 bytes

nchar(abs(scan()))
Sven Hohenstein
fonte
1

Alice , 10 bytes (não concorrente)

 /d/
O@IHc

Experimente online!

Esta é uma solução não concorrente, porque no momento em que esse desafio foi lançado, o comando cestava com erros no intérprete oficial (e apenas: D). Martin Ender o consertou enquanto isso, agora isso funciona.

Explicação

O ponteiro de instruções passa pelos dois espelhos ( /) várias vezes, por isso pode ser um pouco difícil de seguir. Vou tentar explicá-lo da maneira mais clara possível, usando instruções cardinais (por exemplo, N está para cima, SW está para baixo à esquerda ...). Vou ligar para /1o espelho da esquerda e /2o da direita.

Command    Direction    Comment
               E        Execution starts from the upper-left corner going right
   /1        E → SE     Passing through the mirror changes direction and switches
                        to ordinal mode (string operations)
   I        SE → NE     Push the input string to the stack, then bounce against
                        the bottom of the code
   /2       NE → S      Back to cardinal mode (numeric operations)
   H           S        Pop n, push abs(n). Execution wraps from bottom to top
   /2        S → SE     Ordinal mode again
   c        SE → NW     Pop s, push each char of s separatedly. Bounce against
                        the bottom right corner
   /2       NW → W      Cardinal mode
   d           W        Push the depth of the stack (which is now equal to 
                        the number of characters in abs(input))
   /1     W → NW → SW   Pass through the mirror, then bounce agains the top
   O        SW → NE     Output the result, then bounce on the bottom left corner
   /1       NE → S      Last mirror, I promise
   @           S        Terminate execution
Leo
fonte
1

Marca GNU , 78 bytes

Estilo imperativo:

$(eval T=$1)$(foreach D,$(shell seq 9),$(eval T=$(subst $D,? ,$T)))$(words $T)

Estilo funcional, 113 bytes:

$(eval 2?=$(shell seq 9))$(if $2,$(call $0,$(subst $(word 1,$2),? ,$1),$(wordlist 2,$(words $2),$2)),$(words $1))

Marca pura, 83 bytes:

$(eval T=$1)$(foreach D,0 1 2 3 4 5 6 7 8 9,$(eval T=$(subst $D,? ,$T)))$(words $T)
eush77
fonte
1

C ++, 80 bytes 76

#include<string>
int main(int,char**c){printf("%d",strlen(c[1])-(*c[1]<46));}

Imprime o comprimento do argumento, menos 1 se o primeiro caractere for um menos porque bool garante a conversão para 1se trueou 0sefalse

  • 4 bytes graças a @Squidy por apontar que eu posso usar em <46vez de =='-'e para deferir a matriz em vez de[]
Tas
fonte
Você pode cortar 4 bytes substituindo c[1][0]=='-'por, *c[1]<46pois podemos assumir que a entrada sempre será um número inteiro válido. (A menos que prefixos diferentes de '-' sejam permitidos ...)
Squidy
@ Squidy oh wow nice find! Eu esquetei meu cérebro por séculos tentando encurtar isso e nunca pensei nisso! Obrigado pela sugestão e, principalmente, por se inscrever no PCCG para me informar!
Tas
1

TI-Basic (TI-84 Plus CE, OS 5.2+), 6 bytes

length(toString(abs(Ans

TI-Basic é uma linguagem tokenizada; length(e toString(são dois bytes cada.

Ansé usado como entrada implícita; o valor da última (apenas) linha é implicitamente retornado.

Muito simples, pega o valor absoluto para se livrar de um sinal de menos, converte em string, retorna o comprimento da string.

Uma abordagem matemática de 6 bytes que não funciona para 0:

1+log(abs(Ans
pizzapants184
fonte
Quais calculadoras possuem toString(?
Kamoroso94
@ kamoroso94 TI-84 Plus CE
pizzapants184