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.

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.


É 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.

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


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

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.



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.


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


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


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.


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


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

É 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)

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

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

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


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.

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

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

+""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

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.


Eu conto 62 bytes ..?
totallyhuman

1
@totallyhuman veja minha edição.
DJMcMayhem

49 bytes:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon 17/17/17




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

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)

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[]

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

Quais calculadoras possuem toString(?
Kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

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.