Ajouter des longueurs de chaîne

51

Défi:

Étant donné une chaîne ssur les caractères a- z, A- Z, 0- 9, ajoutez la longueur de sà lui-même, en comptant le ou les caractères supplémentaires de la longueur dans la longueur totale de s.

Contribution:

Juste une chaîne de longueur arbitraire (peut être vide).

Sortie:

La même chaîne, mais avec sa longueur ajoutée à la fin. Les caractères qui représentent la longueur doivent également être comptés comme faisant partie de la longueur. Dans les cas où il y a plusieurs longueurs valides à ajouter, choisissez la plus petite possible (voir des exemples de tests).

Cas de test:

INPUT     -> OUTPUT       // Comment
aaa       -> aaa4
          -> 1            // Empty string
aaaaaaaa  -> aaaaaaaa9    // aaaaaaaa10 would also normally be valid, but violates using the smallest number rule mentioned above
aaaaaaaaa -> aaaaaaaaa11
a1        -> a13          // Input can contain numbers at the end of the string, you do not have to handle the fact that it looks like 13 rather than 3.

Longer test case(s):

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa101
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa102

Règles:

C'est du , donc le code le plus court en octets gagne. Les échappatoires standard sont interdites. Les soumissions peuvent être un programme entier ou une fonction, et vous pouvez imprimer le résultat sur stdout ou le renvoyer sous forme de variable à partir d’une fonction.

Yodle
la source
Quels caractères peuvent apparaître dans l'entrée?
Martin Ender
@MartinEnder Caractères alphanumériques uniquement, 0-9 et AZ / az. Alors oui, vous pouvez avoir des chaînes avec des nombres à la fin. Je vais ajouter un cas de test pour un.
Yodle

Réponses:

18

JavaScript (ES6), 32 octets

f=(s,n=0)=>(s+n)[n]?f(s,n+1):s+n

Comment ça fonctionne

f = (s, n = 0) =>   // given a string 's' and starting with n = 0:
  (s + n)[n] ?      // if the Nth character of (s + n) exists:
    f(s, n + 1)     //   try again with n + 1
  :                 // else
    s + n           //   return s + n

En commençant par N=0, nous testons le Nième caractère (base 0) de la chaîne constituée de la concaténation de la chaîne d'entrée d'origine et de la représentation décimale de N. Nous incrémentons Njusqu'à ce que ce personnage n'existe plus.

Exemple:

N =  0 : abcdefghi0
         ^
N =  1 : abcdefghi1
          ^
N =  2 : abcdefghi2
           ^
...
N =  8 : abcdefghi8
                 ^
N =  9 : abcdefghi9
                  ^
N = 10 : abcdefghi10
                   ^
N = 11 : abcdefghi11    -> success
                    ^

Cas de test

Arnauld
la source
Wow, JS est beaucoup plus incertain que Python pour cela.
mbomb007
@Arnauld Je n'arrive pas à comprendre. Cela vous dérange-t-il d'expliquer comment ce code fonctionne?
Gowtham
12

LaTeX, 108/171

\newcounter{c}\def\s#1#2]{\stepcounter{c}\def\t{#2}\ifx\empty\t\arabic{c}\else#1\s#2]\fi}\def\q[#1]{\s#10]}

\q[] //1

C5H8NNaO4
la source
Whoa, je ne pense pas avoir déjà vu une réponse en latex sur ppcg auparavant.
Pajonk
5

JavaScript (ES6), 37 octets

f=(s,t=s,u=s+t.length)=>t==u?t:f(s,u)
<input oninput=o.textContent=f(this.value)><pre id=o>

Neil
la source
Lorsque je clique dessus, Run Code Snippetje vois un message d'erreur. Je n'ai aucune connaissance en Javascript - je voulais juste essayer
Prasanna
@Prasanna fonctionne pour moi dans Firefox; Quel navigateur utilisez-vous?
Neil
@Prasanna Fonctionne sur le dernier Google Chrome. Êtes-vous sûr de ne pas utiliser IE11 ou une version plus ancienne, Opera ou quelque chose qui ne prend pas en charge ES6?
Ismael Miguel
J'utilise un bon vieux chrome ( Version 48.0.2564.97). Je vais essayer cela aussi avec IE. Impossible de mettre à jour mes problèmes de sécurité liés à Chrome - Office
Prasanna
5

C, 67 65 61 octets

x;f(*v){printf("%d",(int)log10(x=-~printf(v))*-~(x%10>8)+x);}

Boîte à baguette

o79y
la source
1
Ohh, oui, je devrais imprimer ... Quoi qu'il en soit, félicitations pour avoir la solution C la plus courte: D +1
cat
4

Lua 5.2, 32 octets

a=arg[1]print(a..#a+#(''..#a+1))

Où la variable a est la chaîne d'entrée.

résine
la source
3

Pyke, 8 octets ( ancienne version )

.f+liq)+

Explication:

.f    )  -  first where (i++)
  +      -    input + i
   l     -    len(^)
    iq   -   ^ == i
       + - input + ^

Essayez-le ici! (Nouvelle version, 9 octets)

Bleu
la source
Cela me déroute toujours de voir à quel point la sortie réelle est enterrée parmi les avertissements ou autres messages :-)
Luis Mendo
2
Je devrais vraiment m'occuper de la correction du bogue Web dans le lien de copie qui désactive automatiquement le commutateur d'avertissement
Bleu
3

Python 2, 54 48 46 octets

Solution simple. La récursion a fini par être plus courte.

f=lambda s,n=0:f(s,n+1)if(s+`n`)[n:]else s+`n`

Essayez-le en ligne

mbomb007
la source
1
Je pense que vous pouvez faire (s+`n`)[n:]pour n<len(s+`n`).
xnor
3

Haskell, 46 octets

f s=[l|i<-[0..],l<-[s++show i],length l==i]!!0

Exemple d'utilisation: f "aaaaaaaa"-> "aaaaaaaa9".

Essayez simplement tous les nombres commençant par 0 et prenez le premier qui vous convient.

nimi
la source
3

Mathematica, 57 octets

#<>ToString[(a=Length@#)+(i=IntegerLength)[a+i@a]~Max~1]&

Fonction sans nom prenant un tableau de caractères en entrée et renvoyant une chaîne. Utilise le fait que si aest la longueur de l'entrée, le nombre à ajouter à l'entrée est aainsi que le nombre de chiffres dans ( a+ la longueur de a), plutôt que simplement ale nombre de chiffres de a. Malheureusement, cela ne donnerait pas la bonne réponse pour l'entrée chaîne vide sans le ~Max~1cas particulier.

Greg Martin
la source
3

Brachylog , 13 octets

l<L$@:?rc.lL,

Essayez-le en ligne!

Explication

Fondamentalement, une description du problème. Il essaiera toute valeur Lsupérieure à la longueur de l'entrée jusqu'à ce qu'il en trouve une pour laquelle, lorsqu'elle est concaténée à l'entrée, correspond à la longueur de cette concaténation.

l<L              length(Input) < L
  L$@            Convert L to a string
     :?rc.       The Output is the concatenation of the Input with L as string
         .lL,    The length of the Output is L itself
Fataliser
la source
3

Brainfuck, 258 octets

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

L'entrée doit être terminée par un saut de ligne (LF). Ne fonctionne que pour les entrées de longueur inférieure à 256 (y compris le BF).

Essayez-le en ligne!

Explication

# read first char and add one to cell #1
# the cell after the input will contain the length
,>+<
# subtract 10 to check for LF
----------
# while the input is not 10 (LF)
[
# restore the input to its original value
++++++++++
# add one to the length
>+
# cut and paste the length to the next cell, then read the input
[>+<-],
# subtract 10 to check for LF
----------
]
# for input abc, the tape here would be: a b c *0* 4
# rewind to the beginning of the input
<[<]>
# print the input string
[.>]>
# convert the length to ascii chars and output them
>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-
<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++
<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

Remarque: j'ai utilisé le code de cette réponse SO pour convertir la longueur en sortie ascii; J'espère que cela est acceptable sur PPCG. Ceci est ma première soumission Codegolf et mon deuxième programme BF. Les commentaires sont les bienvenus.

Forcent Vintier
la source
1
Ce n'est pas valide alors, il doit réussir tous les cas de test
Cat
Donc, supporter une longueur allant jusqu'à 999 suffirait?
Forcent Vintier
La spécification dit "longueur arbitraire", ce qui signifie "tant que votre langue est capable de gérer ou de ne pas manquer de mémoire"
cat
L'interprète brainfuck que vous utilisez a des cellules de 8 bits. Par conséquent, tant que votre algorithme fonctionne pour des chaînes de longueur arbitraire, il devrait fonctionner correctement s'il échoue pour des chaînes de longueur égale ou supérieure à 256 . Les soumissions C et JavaScript échoueront également lorsque les chaînes seront trop longues.
Dennis
Merci Dennis, je modifierai mon
dossier en
2

Rétine , 22 octets

\G`
.
x
+r`\d*$
$._
x

Essayez-le en ligne!

Eh bien, s'il n'y avait pas de chiffres dans l'entrée, cela ne serait que 11 octets:

+r`\d*$
$._
Martin Ender
la source
2

Ruby, 62 58 56 octets

s=gets.chomp;p s+"#{(s+"#{(s+"#{s.size}").size}").size}"

Testé dans irb.

Il existe probablement une meilleure façon de procéder, mais c’est la première chose que j’ai trouvée. Toute aide au golf serait appréciée.

edit: J'ai réalisé que mon utilisation des parenthèses était excessive.

Elenian
la source
Vous utilisez seulement ldans un endroit. Si vous y insérez, vous économiserez 3 octets l=;. Mais votre solution sera toujours plus longue que la mienne;)
DepressedDaniel
2

Perl 6 ,  46  35 octets

{$_~(.chars,*.chars+.chars...{$^a==$^b})[*-1]}
{$_~(.chars,*.chars+.chars...*)[2]}

L'essayer

Étendu:

{   # bare block lambda with implicit parameter 「$_」

  $_  # the input

  ~   # concatenated with

  (  # sequence generator

    .chars,  # the number of chars in 「$_」 (seed the generator)


    *\      # Whatever lambda input (represents previous value)
    .chars  # number of chars in that
    +       # plus
    .chars  # the number of chars in 「$_」


    ...     # keep doing that until

    *       # indefinitely

  )[2] # get the value at index 2 of the sequence
}
Brad Gilbert b2gills
la source
2

05AB1E , 11 octets

[¹¾JDg¾Q#¼\

Bruteforce assez simple:

            Implicit i = 0
[           while true
 ¹¾J        Concatenate input and i -> str
    Dg¾Q#   Break if length(str) == i
         ¼\ Else, i += 1

Essayez-le en ligne!

Osable
la source
2

Python, 39 octets

lambda a:eval('a+str(len('*3+'a))))))')

Forme plus longue:

lambda a:a+str(len(a+str(len(a+str(len(a))))))

Itérativement en Python 2 (41 octets):

x=a=input();exec"x=a+`len(x)`;"*3;print x

En commençant par xla chaîne d'entrée a, applique la transformation x -> a + str(len(x))trois fois. Je ne comprends toujours pas pourquoi trois applications sont nécessaires pour toujours atteindre le point fixe.

Xnor
la source
Pourquoi 3 fois? Le premier à ajouter la longueur du texte, le second à ajuster la longueur pour inclure le numéro, le troisième au cas où ce réglage ajouterait un chiffre supplémentaire.
Tom Viner le
2

PHP, 42 octets

while(++$n<strlen($a=$argv[1].$n));echo$a;

Courez avec -r. Testez à OnlinePHPfunctions .

Titus
la source
2

bash, 47 octets

 for((n=-1;${#s} != $n;));{ s=$1$[++n];};echo $s

Enregistrez ceci en tant que script et transmettez la chaîne d'entrée en tant qu'argument.

C'est une implémentation en force brute: essayez chaque chiffre à tour de rôle jusqu'à trouver celui qui fonctionne.

Mitchell Spector
la source
2

> <> (Poisson) 35 octets

i:1+?!v:o
ln;v9l<  >
*9+>:&)?!^1l&a

Prend une entrée sur la pile, vérifie la longueur par rapport aux valeurs de 9,99 999 ... et si la longueur est supérieure à 1, ajoutez 1 à la longueur de la pile.

Sarcelle
la source
2

Haskell , 61 60 octets

e=length
l%n|s<-show$l+1,n>e s=s|m<-n+1=(l+1)%m
c s=s++e s%2

Essayez-le en ligne!

Solution récursive Usage:

Prelude> c "aaaaaaaaa"
"aaaaaaaaa11"
Laikoni
la source
1

C #, 77 octets

n=>{int a=n.Length;int c=(a+1).ToString().Length-1;return(n+(n.Length+1+c));}
Alfie Goodacre
la source
1
Je ne maintenant C #, mais ne pourrais pas vous utiliser return(n+(a+1+c))comme a=n.Length?
Laikoni
Et aussi laisser tomber le -1de int c=(a+1).ToString().Length-1et le +1du retour?
Laikoni
1
Attendez, cela gère-t-il correctement les cas de test plus volumineux? Il semble qu'il retourne aa...a100au lieu de aa...a101pour le acas de test 99 .
Laikoni
1

MATL , 11 octets

`G@Vhtn@>]&

Essayez-le en ligne! Ou vérifiez tous les cas de test .

`      % Do...while
  G    %   Push input
  @    %   Push iteration index (1-based)
  V    %   Convert number to string
  h    %   Concatenate horizontally
  t    %   Duplicate
  n    %   Get length of concatenated string
  @    %   Push iteration index
  >    %   True if length of concatenated string exceeds iteration index
]      % End. Run next iteration if top of stack is true; else exit loop
&      % Specifiy that next function (implicit display) takes only one input
       % Implicitly display top of the stack. This is the concatenated string
       % that had a length equal to the iteration index
Luis Mendo
la source
1

Ruby, 51 octets (programme)

Ruby, 49 octets (fonction)

Programme (la dernière nouvelle ligne n’est pas nécessaire et n’est donc pas notée):

x=gets.strip
i=0
i+=1 until(y=x+i.to_s).size==i
p y

Fonction (le dernier saut de ligne est marqué):

def f x
i=0
i+=1 until(y=x+i.to_s).size==i
y
end
DepressedDaniel
la source
1

Facteur, 55 octets

C'est une promenade dans le parc! J'ai pensé à cela dès que j'ai lu la question.

[ dup length dup log10 ⌈ + >integer 10 >base append ]
chat
la source
1

Clojure, 72 octets

(defn f([s](f s 1))([s n](if(=(count(str s n))n)(str s n)(f s(inc n)))))
NikoNyrh
la source
1

R, 49 octets

cat(a<-scan(,""),(t<-nchar(a))+nchar(t+1),sep='')

Solution assez simple.

Frédéric
la source
Cela ne fonctionne pas pour moi: Read 1 item Error in nchar(x + 1) : object 'x' not found. J'ai trouvé que ça (t<-nchar(a))+...fonctionnait.
JAD
@ JarkoDubbeldam: Mon mauvais!
Frédéric
1

Wolfram, 56 ans

#<>ToString@Nest[l+IntegerLength@#&,l=StringLength@#,2]&

Étant donné l = StringLength[x]qu'il ajoute l + IntegerLength[l + IntegerLength[l]]à x.

bruissement
la source
1

ForceLang, 83 octets

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
SuperJedi224
la source