Aggiunta di lunghezze di stringa


51

Sfida:

Dato una stringa ssui caratteri a- z, A- Z, 0- 9, aggiungi la lunghezza di sse stesso, contando i caratteri aggiuntivi nella lunghezza come parte della lunghezza totale di s.

Ingresso:

Solo una stringa di lunghezza arbitraria (può essere vuota).

Produzione:

La stessa stringa, ma con la sua lunghezza aggiunta alla fine. Anche i caratteri che rappresentano la lunghezza devono essere conteggiati come parte della lunghezza. Nei casi in cui vi siano più lunghezze valide da aggiungere, scegliere la più piccola possibile (vedere esempi di test).

Casi 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

Regole:

Questo è , quindi vince il codice più breve in byte. Sono vietate le scappatoie standard. Gli invii possono essere un intero programma o una funzione e puoi stampare il risultato su stdout o restituirlo come variabile da una funzione.


Quali caratteri possono apparire nell'input?
Martin Ender,

@MartinEnder Solo caratteri alfanumerici, 0-9 e AZ / az. Quindi sì, puoi avere stringhe con numeri alla fine. Aggiungerò un caso di prova per uno.
Yodle,

Risposte:



18

JavaScript (ES6), 32 byte

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

Come funziona

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

A partire da N=0, testiamo l'ennesimo carattere (basato su 0) della stringa costituita dalla concatenazione della stringa di input originale e dalla rappresentazione decimale di N. Aumentiamo Nfino a quando questo personaggio non esiste più.

Esempio:

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

Casi test


Wow, JS è molto più teso di Python per questo.
mbomb007,

@Arnauld Non riesco a capirlo. Ti dispiace spiegare come funziona questo codice?
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


Whoa, non credo di aver mai visto una risposta in lattice su ppcg prima.
pajonk,

5

JavaScript (ES6), 37 byte

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


Quando ho cliccato su Run Code Snippetvedo un messaggio di errore. Non conosco Javascript - Stavo solo provando
Prasanna il

@Prasanna Funziona per me in Firefox; quale browser stai usando?
Neil,

@Prasanna Funziona sull'ultimo Google Chrome. Sei sicuro di non utilizzare IE11 o precedenti, Opera o qualsiasi altra cosa che non supporti ES6?
Ismael Miguel,

Sto usando un vecchio chrome buono ( Version 48.0.2564.97). Proverò questo anche con IE. Non riesco ad aggiornare il mio Chrome - problemi di sicurezza dell'ufficio
Prasanna,

5

C, 67 65 61 byte

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

Wandbox


1
Ohh, sì, avrei dovuto stampare ... Comunque, congratulazioni per avere la soluzione C più corta: D +1
cat

4

Lua 5.2, 32 byte

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

Dove la variabile a è la stringa di input.


3

Pyke, 8 byte ( vecchia versione )

.f+liq)+

Spiegazione:

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

Provalo qui! (Nuova versione, 9 byte)


Mi confonde sempre quanto sia sepolto l'output effettivo tra avvisi o altri messaggi :-)
Luis Mendo,

2
Dovrei davvero andare in giro a correggere il bug web nel link di copia che disabilita automaticamente l'interruttore di avvertenze
Blue

3

Python 2, 54 48 46 byte

Soluzione semplice. La ricorsione ha finito per essere più breve.

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

Provalo online


1
Penso che tu possa fare (s+`n`)[n:]per n<len(s+`n`).
xnor

3

Haskell, 46 byte

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

Esempio di utilizzo: f "aaaaaaaa"-> "aaaaaaaa9".

Prova semplicemente tutti i numeri che iniziano con 0 e prendi il primo che si adatta.


3

Mathematica, 57 byte

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

Funzione senza nome che accetta una matrice di caratteri come input e restituisce una stringa. Usa il fatto che se aè la lunghezza dell'input, il numero da aggiungere all'ingresso è apiù il numero di cifre ( a+ la lunghezza di a), piuttosto che solo ail numero di cifre di a. Sfortunatamente non darebbe la risposta giusta per l'input di stringa vuota senza il ~Max~1caso speciale.


3

Brachylog , 13 byte

l<L$@:?rc.lL,

Provalo online!

Spiegazione

Fondamentalmente una descrizione del problema. Proverà ogni valore Lmaggiore della lunghezza dell'input fino a quando non ne trova uno per il quale, quando concatenato all'input, è la lunghezza di tale concatenazione.

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

3

Brainfuck, 258 byte

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

L'ingresso deve essere terminato con un avanzamento riga (LF). Funziona solo per input con una lunghezza inferiore a 256 (incluso LF).

Provalo online!

Spiegazione

# 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
>>++++++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-
<+>]>+>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++
<]>.[-]]<<++++++[-<++++++++>]<.[-]<<[-<+>]

Nota: ho usato il codice di questa risposta SO per convertire la lunghezza in output ASCII; Spero che questo sia accettabile su PPCG. Questa è la mia prima presentazione su Codegolf e il mio secondo programma BF. Il feedback è gradito.


1
Questo non è valido quindi, deve superare tutti i casi di test
cat

Quindi sostenere una lunghezza fino a 999 sarebbe sufficiente?
Forza Vintier il

La specifica dice "lunghezza arbitraria" che significa "fintanto che la tua lingua è in grado di gestire o senza esaurire la memoria"
cat

L'interprete brainfuck che stai utilizzando ha celle a 8 bit, quindi finché l' algoritmo funziona per stringhe di lunghezza arbitraria, dovrebbe andare bene se fallisce per stringhe di lunghezza 256 o superiore. Gli invii C e JavaScript falliranno anche quando le stringhe diventano troppo lunghe.
Dennis,

Grazie Dennis, modificherò di conseguenza la mia richiesta
Forcent Vintier


2

Rubino, 62 58 56 byte

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

Testato in irb.

Probabilmente c'è un modo migliore per farlo, ma questa è stata la prima cosa che mi è venuta in mente. Qualsiasi aiuto nel golf sarebbe apprezzato.

modifica: ho capito che il mio uso delle parentesi era eccessivo.


Usi solo lin un posto. Se lo integri, risparmierai 3 byte l=;. Ma la tua soluzione sarà ancora più lunga della mia;)
Depressed

2

Perl 6 ,  46  35 byte

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

Provalo

Allargato:

{   # 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
}

2

05AB1E , 11 byte

[¹¾JDg¾Q#¼\

Bruteforce piuttosto semplice:

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

Provalo online!


2

Python, 39 byte

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

Forma più lunga:

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

Iterativamente in Python 2 (41 byte):

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

A partire da xcome stringa di input a, applica la trasformazione x -> a + str(len(x))tre volte. Non sono ancora chiaro il motivo per cui sono necessarie tre applicazioni per raggiungere sempre il punto fisso.


Perché 3 volte? In primo luogo per aggiungere la lunghezza del testo, in secondo luogo per regolare la lunghezza per includere il numero, in terzo luogo nel caso in cui l'adeguamento ha aggiunto una cifra aggiuntiva.
Tom Viner,


2

bash, 47 byte

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

Salvalo come script e passa la stringa di input come argomento.

È un'implementazione della forza bruta: prova ogni numero a turno finché non ne trovi uno che funzioni.


2

> <> (Pesce) 35 byte

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

Riceve input nello stack, controlla la lunghezza rispetto ai valori 9,99.999 ... e se la lunghezza è maggiore di aggiungi 1 alla lunghezza dello stack.


2

Haskell , 61 60 byte

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

Provalo online!

Soluzione ricorsiva. Uso:

Prelude> c "aaaaaaaaa"
"aaaaaaaaa11"

1

C #, 77 byte

n=>{int a=n.Length;int c=(a+1).ToString().Length-1;return(n+(n.Length+1+c));}

1
Non ho C # ora, ma non potresti usarlo return(n+(a+1+c))come a=n.Length?
Laikoni,

E rilasciare anche il -1da int c=(a+1).ToString().Length-1e il +1da ritorno?
Laikoni,

1
Aspetta, questo gestisce correttamente i casi di test più grandi? Sembra che ritorni aa...a100invece che aa...a101per il acaso di test 99 .
Laikoni,

1

MATL , 11 byte

`G@Vhtn@>]&

Provalo online! Oppure verifica tutti i casi di 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

1

Ruby, 51 byte (programma)

Ruby, 49 byte (funzione)

Programma (l'ultima riga non è necessaria e quindi non è stata classificata):

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

Funzione (viene segnata l'ultima riga):

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

1

Fattore, 55 byte

È una passeggiata nel parco! Mi è venuto in mente questo non appena ho letto la domanda.

[ dup length dup log10 ⌈ + >integer 10 >base append ]

1

Clojure, 72 byte

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

1

R, 49 byte

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

Soluzione piuttosto semplice.


Questo non funziona per me: Read 1 item Error in nchar(x + 1) : object 'x' not found. Ho scoperto che (t<-nchar(a))+...ha funzionato.
JAD

@JarkoDubbeldam: Mio cattivo!
Frédéric,

1

Wolfram, 56

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

Dato che l = StringLength[x]si aggiunge l + IntegerLength[l + IntegerLength[l]]a x.



1

ForceLang, 83 byte

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.