Quelle est la longueur de mon numéro?

26

Défi

Étant donné un entier, Qdans la plage -(2^100) ≤ Q ≤ 2^100, affichez le nombre de chiffres de ce nombre (en base 10).

Règles

Oui, vous pouvez prendre le nombre sous forme de chaîne et trouver sa longueur.

Toutes les fonctions mathématiques sont autorisées.

Vous pouvez prendre une entrée dans n'importe quelle base, mais la sortie doit être la longueur du nombre dans la base 10.

Ne comptez pas le signe moins pour les nombres négatifs. Le nombre n'aura jamais de point décimal.

Zéro peut avoir un ou zéro chiffre.

Supposons que l'entrée sera toujours un entier valide.

Exemples

Input > Output

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

Gagnant

Le code le plus court en octets gagne.

Beta Decay
la source

Réponses:

10

Brachylog , 1 octet

l

Essayez-le en ligne!

Une autre solution intégrée, mais celle-ci a le nom le plus court (sauf si quelqu'un trouve une langue qui effectue cette tâche en zéro octet). Cela devrait fonctionner à la fois dans Brachylog 1 et Brachylog 2.

Il s'agit d'une soumission de fonction (le lien TIO contient un argument de ligne de commande qui oblige l'interpréteur à exécuter une fonction individuelle plutôt qu'un programme entier), en partie parce que sinon nous aurions à dépenser des octets en sortie, en partie parce que la syntaxe de Brachylog pour négatif nombres est quelque peu inhabituel et faire de ce programme une fonction résout tous les arguments potentiels sur la syntaxe d'entrée.

Cela me dérange souvent que la plupart des buildins de Brachylog traitent les nombres négatifs comme des nombres positifs, mais ce fait a fini par être utile ici. Je suppose qu'il y a des compromis à faire avec chaque langue de golf.


la source
C'est là que j'arrête de faire défiler ... c'est scandaleux!
Bogdan Alexandru
39

Taxi , 1118 octets

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.

Essayez-le en ligne!

Non golfé:

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.

Explication:

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.
Ingénieur Toast
la source
8
Je suis un rôdeur dans cet échange depuis longtemps, mais je n'ai jamais vu quelque chose comme ça
Cup of Java
7
Cela manquera-t-il d'essence si le nombre est assez long?
Robert Fraser
5
C'est un plus gros brainfuck que brainfuck.
Omega
1
@RobertFraser C'est pourquoi nous nous arrêtons à Zoom Zoomchaque boucle de plan "r". Je viens de le tester jusqu'à 100 000 chiffres et il n'a jamais manqué de gaz. Je ne l'ai pas calculé, mais je suppose qu'il faut plus que suffisamment de prix pour payer le gaz qu'il utilise, donc il remplit le réservoir à chaque boucle.
Ingénieur Toast
1
@CupofJava OH MY GOSH comment ai-je oublié Shakespeare .
Engineer Toast
18

Mathematica, 13 octets

IntegerLength

Il y a un intégré ... revient 0pour 0.

Martin Ender
la source
2
Mathematica prévaut: D
Beta Decay
1
pas dans le golf de code, ce n'est pas le cas :)
Greg Martin
8
There's a built-in: Quand n'est-ce pas?
TheLethalCoder
14

dc, 3

?Zp

Notez que normalement, dcdes nombres négatifs doivent être donnés avec _au lieu des plus habituels -. Cependant, dans ce cas, l'un ou l'autre peut être utilisé. Si -est donné, dctraite cela comme une soustraction sur une pile vide, lance dc: stack empty, puis continue avec le reste du nombre; Le résultat n'est donc pas différent.

Essayez-le en ligne .

?    # input
 Z   # measure length
  p  # print
Traumatisme numérique
la source
Cela ne pourrait-il pas être simplement Zune soumission de fonction? dcest un langage concaténatif avec des opérateurs quote + dup + eval, il peut donc réutiliser des chaînes de code arbitraires.
12

Rétine , 2 octets

\d

Essayez-le en ligne!

La rétine ne sait pas vraiment ce que sont les nombres, donc l'entrée est traitée comme une chaîne et nous comptons simplement les caractères numériques.

Martin Ender
la source
5

05AB1E , 2 octets

Äg

Essayez-le en ligne! ou essayez tous les tests!

Ä  # Absolute value
 g # Length
Riley
la source
Ähein? Non þ? C'est suffisant.
Urne de poulpe magique
@carusocomputing J'y ai pensé en Äpremier, mais je gérerais þun point décimal, donc c'est un peu mieux je suppose.
Riley
Juste cool comment 2 personnes ont trouvé 2 solutions différentes de 2 octets à moins de 2 minutes l'une de l'autre, je ne pense pas qu'il y en ait un troisième cependant; essayer de penser à un.
Urne de poulpe magique
5

Alice , 16 octets

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

Essayez-le en ligne!

Explication

Trouver une mise en page à moitié décente pour cela était assez délicat. Je ne suis toujours pas super content à cause des espaces, du <et du ;, mais c'est le mieux que je puisse faire pour l'instant.

La longueur de chaîne est l'une de ces fonctions intégrées très courantes qui n'existent pas dans Alice, car son entrée est une chaîne et sa sortie est un entier (et toutes les commandes Alice sont strictement des entiers en entier ou des chaînes en chaînes). Nous pouvons mesurer la longueur d'une chaîne en l'écrivant sur la bande en mode Ordinal puis en trouvant sa fin en mode 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.

J'ai également essayé de prendre soin du signe moins en mode Cardinal avec H(valeur absolue), mais le commutateur de mode supplémentaire a toujours été plus cher dans mes tentatives.

Martin Ender
la source
4

PHP, 23 octets

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

Essayez-le en ligne!

log de base 10 de la valeur absolue plus un transtypage en int

pour zéro comme entrée log10 donne INFce qui est interprété comme faux

La meilleure façon est de remplacer $argnpar $argn?:1+3 octets

PHP, 27 octets

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

la longueur de chaîne moins booléen est inférieure à zéro

+2 octets pour la comparaison de chaînes $argn<"0"

Essayez-le en ligne!

PHP, 32 octets

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

Essayez-le en ligne!

Regex compte tous les chiffres

35 octets

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

Essayez-le en ligne!

longueur de chaîne moins le nombre -

strspn

Jörg Hülsermann
la source
1
Le premier ne fonctionne pas, par exemple, pour 10, car il ^a une priorité inférieure. Vous pouvez le réparer avec -~.
user63956
Pourquoi pas simplement <?=strlen(abs($argn));?
roberto06
@ user63956 La version avec log10 ne peut pas fonctionner en cas d'entrée zéro, je la supprime donc.
Jörg Hülsermann
1
@ JörgHülsermann Pourquoi pas seulement $argn?:1? Ce serait 26 octets avec log10()et abs().
user63956
1
@ JörgHülsermann -~$xest équivalent à ((int)$x)+1. <?=-~log10(abs($argn?:1));semble fonctionner.
user63956
4

Fortran 95 (gfortran), 121 96 95 octets

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

Explication:
Soustrait l'index du signe «-» de la longueur de l'argument.
Les tableaux commencent à 1 dans Fortran et index () renvoie 0 si le symbole n'est pas trouvé.

Edit: Passé à l'entier implicite "i", également récupérateur d'arguments consolidé.

Edit: -1 octet grâce à @Tsathoggua

waffleston
la source
1
Bienvenue chez PPCG!
Martin Ender
3

PowerShell, 24 octets

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

convertit la valeur "absolue" de l'argument d'entrée en chaîne et en obtient la propriété 'length'.

1 octet plus court que "".Length

jusqu'à ce que quelqu'un trouve un meilleur moyen d'obtenir les abdos d'un nombre dans PS, c'est probablement aussi court que possible.

colsw
la source
Et alors "$args".trim('-')|% Le*? :)
quel que soit
3

brainfuck , 37 octets

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

La sortie est par valeur d'octet.

Essayez-le en ligne!

Explication

-[+>+[+<]>+]>->  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
Chat d'affaires
la source
Est-il possible d'ajouter un pied de page au lien TIO qui affiche le résultat sous forme de nombre?
Beta Decay
@BetaDecay Added
Business Cat
C'est génial, merci: D
Beta Decay
3

Rubis, 15 11 + 1 = 16 12 octets

Utilise le -ndrapeau.

p~/$/-~/\d/

Essayez-le en ligne!

Explication

                  # -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)
Encre de valeur
la source
1
Quelle magie est-ce?
Chowlett
2
@Chowlett a ajouté une explication.
Value Ink
2

Gelée , 2 octets

DL

Essayez-le en ligne!

Cela fait littéralement ce qui a été demandé:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2
Jonathan Allan
la source
C'est une fonction intégrée intéressante, fonctionne-t-il Dsur les décimales? Would -1.2sortie [-1,-0.2]? Je l'ai essayé moi-même, ce n'est pas le cas.
Urne de poulpe magique
1
Pas tout à fait, la conversion de base ne descend que vers les unités donc, par exemple, 654.321Ddonnerait [6,5,4.321](enfin en fait [6.0,5.0,4.321000000000026])
Jonathan Allan
[-6.0, -5.0, -4.321000000000026], en fait, apparemment.
Urne de poulpe magique
Ah - ouais juste édité - arithmétique à virgule flottante.
Jonathan Allan
2

CJam , 5 octets

q'--,

Basé sur une chaîne.

Essayez-le en ligne!

9 octets pour une solution purement mathématique:

riz)AmLm]

Ou encore 5 avec conversion de base:

riAb,
Chat d'affaires
la source
Ou aussi 5: rizs,.
Martin Ender
2

Japt , 5 octets

a s l

Essayez-le en ligne!

Explication

 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
Luc
la source
2

JavaScript (ES6), 27 26 25 24 octets

Prend l'entrée sous forme de chaîne.

s=>s.match(/\d/g).length
  • Enregistré deux octets grâce à Arnauld.
Hirsute
la source
Votre titre dit 23 octets, mais votre code est 24 ... Cependant, cela fait 23 octets s=>`${s>0?s:-s}`.length:!
Dom Hastings
Merci, @DomHastings. Vous devriez publier la vôtre comme réponse distincte, car il s'agit d'une approche différente de la mienne.
Shaggy
2

JavaScript (ES6), 23 octets

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

Approche différente de la réponse de Shaggy .

Dom Hastings
la source
3
s=>s.length-(s<0)enregistre 6 octets
Johan Karlsson
2

Java, 30 24 octets

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

Suppose que iest un BigInteger. En outre, le type est contextualisé, donc aucune importation n'est requise, comme indiqué dans le code de test.

Tester

// 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)
  }
}

Sauvegarde

  • 30 -> 24 octets: merci à @cliffroot
Olivier Grégoire
la source
+""au lieu de .toString()?
cliffroot
2
+1 pour fournir un exemple de code montrant comment cela est invoqué et pour clarifier le type de idans votre réponse. Je pense que plus de réponses lambda devraient le faire.
Poke
1

Python 2 , 31 22 octets

-9 octets grâce à Rod.

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

Essayez-le en ligne!

totalement humain
la source
1
len(`abs(s)`)avec un nombre en entrée plus court
Rod
2
Dommage que Python n'ait pas de composition de fonction. Ce serait juste len∘repr∘abs.
Roberto Bonvallet
1

Brain-Flak , 63 octets

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

Essayez-le en ligne!

Cela représente 62 octets de code et +1 octet pour l' -aindicateur.

J'ai essayé deux autres approches, mais malheureusement, les deux étaient plus longues:

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

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

Cela devrait être une réponse très courte. En fait, si nous n'avions pas à supporter des nombres négatifs, nous pourrions simplement faire:

([]<>)

Mais nous devons comparer la première entrée avec 45 (ASCII -) en premier, ce qui est la majeure partie du nombre d'octets de cette réponse.

Une solution arithmétique pourrait être plus courte.

DJMcMayhem
la source
Je compte 62 octets ..?
totalement humain
1
@totallyhuman voir ma modification.
DJMcMayhem
49 octets:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon
1

Ruby, 20 octets

->a{a.abs.to_s.size}
marmeladze
la source
Pour info: pour l'appeler vous faites:->a{a.abs.to_s.size}[-95]
Filip Bartuzi
ou simplement de façon classique -->a{a.abs.to_s.size}.call(-92)
marmeladze
2
pas une manière golfique: D
Filip Bartuzi
1

R, 18 octets

nchar(abs(scan()))
Sven Hohenstein
la source
1

Alice , 10 octets (non concurrent)

 /d/
O@IHc

Essayez-le en ligne!

Il s'agit d'une solution non concurrente, car au moment où ce défi a été publié, la commande cétait buggée dans l'interpréteur officiel (et uniquement: D). Martin Ender l'a corrigé en attendant, donc cela fonctionne maintenant.

Explication

Le pointeur d'instruction passe /plusieurs fois par les deux miroirs ( ), il peut donc être un peu difficile à suivre. Je vais essayer de l'expliquer aussi clairement que possible, en utilisant des directions cardinales (par exemple, N est en haut, SW est en bas à gauche ...). J'appellerai /1le miroir le plus à gauche et /2le miroir le plus à droite.

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
la source
1

Marque GNU , 78 octets

Style impératif:

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

Style fonctionnel, 113 octets:

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

Marque pure, 83 octets:

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

C ++, 80 76 octets

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

Imprime la longueur de l'argument, moins 1 si le premier caractère est un moins car boolgarantit la conversion en 1if trueou 0iffalse

  • 4 octets grâce à @Squidy pour avoir souligné que je peux utiliser à la <46place de =='-', et pour déférer le tableau au lieu de[]
Tas
la source
Vous pouvez raser 4 octets en remplaçant c[1][0]=='-'par *c[1]<46car nous pouvons supposer que l'entrée sera toujours un entier valide. (Sauf si des préfixes autres que '-' sont autorisés ...)
Squidy
@Squidy oh wow belle trouvaille! J'ai creusé la tête pendant des siècles en essayant de raccourcir ceci et je n'ai même jamais pensé à ça! Merci pour la suggestion, et surtout pour vous être inscrit à PCCG pour me le faire savoir!
Tass
1

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

length(toString(abs(Ans

TI-Basic est un langage à jetons; length(et toString(sont deux octets chacun.

Ansest utilisé comme entrée implicite; la valeur de la dernière (seule) ligne est renvoyée implicitement.

Assez simple, prend la valeur absolue pour se débarrasser d'un signe moins, se convertit en chaîne, renvoie la longueur de la chaîne.

Une approche mathématique à 6 octets qui ne fonctionne pas pour 0:

1+log(abs(Ans
pizzapants184
la source
Quelles calculatrices ont toString(?
kamoroso94
@ kamoroso94 TI-84 Plus CE
pizzapants184