Dołączanie długości ciągów


51

Wyzwanie:

Biorąc pod uwagę ciąg sznaków a- z, A- Z, 0- 9, dołącz długość sdo siebie, licząc dodatkowe znaki w długości jako część całkowitej długości s.

Wejście:

Tylko ciąg o dowolnej długości (może być pusty).

Wynik:

Ten sam ciąg znaków, ale z długością dołączoną do końca. Znaki reprezentujące długość należy również liczyć jako część długości. W przypadkach, gdy istnieje wiele prawidłowych długości do dołączenia, wybierz najmniejszą możliwą (patrz przykłady przypadków testowych).

Przypadki testowe:

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

Zasady:

To jest , więc wygrywa najkrótszy kod w bajtach. Standardowe luki są zabronione. Zgłoszenia mogą być całym programem lub funkcją i możesz albo wydrukować wynik na standardowe wyjście, albo zwrócić go jako zmienną z funkcji.


Jakie znaki mogą pojawić się na wejściu?
— Martin Ender,

@MartinEnder Tylko znaki alfanumeryczne, 0–9 i AZ / az. Więc tak, możesz mieć ciągi znaków z liczbami na końcu. Dodam przypadek testowy dla jednego.
— Yodle

Odpowiedzi:



18

JavaScript (ES6), 32 bajty

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

Jak to działa

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

Zaczynając od N=0, testujemy N-ty znak (oparty na 0) ciągu utworzonego z połączenia pierwotnego ciągu wejściowego i reprezentacji dziesiętnej N. Zwiększamy, Ndopóki ta postać już nie istnieje.

Przykład:

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

Przypadki testowe


Wow, JS jest do tego znacznie bardziej zaawansowany niż Python.
— mbomb007

@Arnauld Nie mogę się tym zająć. Czy możesz wyjaśnić, jak działa ten kod?
— 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, nie sądzę, żebym kiedykolwiek widział lateksową odpowiedź na ppcg.
— pajonk

5

JavaScript (ES6), 37 bajtów

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


Po kliknięciu pojawia Run Code Snippetsię komunikat o błędzie. Nie mam pojęcia o JavaScript - właśnie próbowałem
— Prasanna,

@Prasanna Działa dla mnie w przeglądarce Firefox; jakiej przeglądarki używasz?
— Neil,

@Prasanna Działa na najnowszej przeglądarce Google Chrome. Czy na pewno nie używasz IE11 lub starszej wersji, Opery lub czegokolwiek, co nie obsługuje ES6?
— Ismael Miguel

Używam starego, dobrego chrome ( Version 48.0.2564.97). Spróbuję tego też z IE. Nie mogę zaktualizować mojego chromowanego - problemy z bezpieczeństwem pakietu Office
— Prasanna,

5

C, 67 65 61 bajtów

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

Wandbox


1
Och, tak, powinienem wydrukować ... W każdym razie gratuluję posiadania krótszego rozwiązania C: D +1
— kot

4

Lua 5.2, 32 bajty

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

Gdzie zmienna a jest łańcuchem wejściowym.


3

Pyke, 8 bajtów ( stara wersja )

.f+liq)+

Wyjaśnienie:

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

Wypróbuj tutaj! (Nowa wersja, 9 bajtów)


Zawsze myli mnie, jak zakopana jest rzeczywista wydajność wśród ostrzeżeń lub innych wiadomości :-)
— Luis Mendo

2
Naprawdę powinienem zająć się naprawą błędu internetowego w linku do kopiowania, który automatycznie wyłącza przełącznik ostrzeżeń
— Blue

3

Python 2, 54 48 46 bajtów

Proste rozwiązanie. Rekurencja okazała się krótsza.

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

Wypróbuj online


1
Myślę, że można to zrobić (s+`n`)[n:]za n<len(s+`n`).
— xnor

3

Haskell, 46 bajtów

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

Przykład użycia: f "aaaaaaaa"-> "aaaaaaaa9".

Po prostu wypróbuj wszystkie liczby zaczynające się od 0 i wybierz pierwszą, która pasuje.


3

Mathematica, 57 bajtów

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

Funkcja bez nazwy, która przyjmuje tablicę znaków jako dane wejściowe i zwraca ciąg znaków. Wykorzystuje fakt, że jeśli ajest długością wejściową, to liczba do dołączenia do niej jest apowiększona o liczbę cyfr w ( a+ długość a), a nie tylko o adodatkową liczbę cyfr a. Niestety nie dałby właściwej odpowiedzi dla danych wejściowych z pustym ciągiem bez ~Max~1specjalnego przypadku.


3

Brachylog , 13 bajtów

l<L$@:?rc.lL,

Wypróbuj online!

Wyjaśnienie

Zasadniczo opis problemu. Spróbuje każdej wartości Lwiększej niż długość danych wejściowych, aż znajdzie tę, dla której po połączeniu z danymi wejściowymi jest długość tej konkatenacji.

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 bajtów

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

Wejście musi być zakończone sygnałem liniowym (LF). Działa tylko w przypadku danych wejściowych o długości mniejszej niż 256 (w tym LF).

Wypróbuj online!

Wyjaśnienie

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

Uwaga: Użyłem kodu z tej odpowiedzi SO do konwersji długości na wyjście ascii; Mam nadzieję, że jest to dopuszczalne na PPCG. To moje pierwsze zgłoszenie do Codegolfa i mój drugi program BF. Informacje zwrotne są mile widziane.


1
To nie jest poprawne, musi przejść wszystkie przypadki testowe
— cat

Czy wystarczyłoby wsparcie dla długości do 999?
— Forcent Vintier

Specyfikacja mówi „dowolna długość”, co oznacza „tak długo, jak długo twój język jest w stanie obsłużyć pamięć lub nie zabraknie jej w pamięci”
— cat

Używany przez ciebie interpreter mózgów ma 8-bitowe komórki, więc dopóki twój algorytm działa na łańcuchy o dowolnej długości, powinno być dobrze, jeśli zawiedzie dla łańcuchów o długości 256 lub wyższej. Przesyłanie C i JavaScript również nie powiedzie się, gdy łańcuchy będą zbyt długie.
— Dennis

Dziękuję, Dennis, odpowiednio zmodyfikuję swoje zgłoszenie
— Forcent Vintier,


2

Rubin, 62 58 56 bajtów

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

Testowane w irb.

Jest prawdopodobnie lepszy sposób, aby to zrobić, ale to była pierwsza rzecz, jaką wymyśliłem. Każda pomoc w grze w golfa będzie mile widziana.

edycja: Zdałem sobie sprawę, że moje użycie nawiasów było nadmierne.


Używasz tylko lw jednym miejscu. Jeśli wstawisz to, zaoszczędzisz 3 bajty l=;. Ale twoje rozwiązanie będzie jeszcze dłuższe niż moje;)
— DepressedDaniel

2

Perl 6 ,  46  35 bajtów

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

Spróbuj

Rozszerzony:

{   # 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 bajtów

[¹¾JDg¾Q#¼\

Dość prosta brutalność:

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

Wypróbuj online!


2

Python, 39 bajtów

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

Dłuższa forma:

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

Iteracyjnie w Pythonie 2 (41 bajtów):

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

Zaczynając xjako ciąg wejściowy a, stosuje transformację x -> a + str(len(x))trzy razy. Nadal nie jestem pewien, dlaczego trzy aplikacje są potrzebne, aby zawsze osiągnąć stały punkt.


Dlaczego 3 razy? Najpierw dodaj długość tekstu, po drugie dostosuj długość tak, aby zawierała liczbę, po trzecie, w przypadku, gdy dostosowanie dodało dodatkową cyfrę.
— Tom Viner,


2

bash, 47 bajtów

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

Zapisz to jako skrypt i przekaż ciąg wejściowy jako argument.

To implementacja brutalnej siły: wypróbuj kolejno każdy numer, aż znajdziesz taki, który działa.


2

> <> (Ryba) 35 bajtów

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

Pobiera dane wejściowe na stos, sprawdza długość względem wartości 9 999 999 ... i jeśli długość jest większa niż dodać 1 do długości stosu.



1

C #, 77 bajtów

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

1
Nie mam teraz C #, ale nie możesz użyć return(n+(a+1+c))jako a=n.Length?
— Laikoni

A także upuść -1z int c=(a+1).ToString().Length-1a +1z powrotem?
— Laikoni

1
Zaraz, czy to poprawnie obsługuje większe przypadki testowe? Wygląda na to, że zwraca aa...a100zamiast aa...a101dla aprzypadku testowego 99 .
— Laikoni

1

MATL , 11 bajtów

`G@Vhtn@>]&

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

`      % 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 bajtów (program)

Ruby, 49 bajtów (funkcja)

Program (ostatni znak nowej linii nie jest konieczny i dlatego nie jest oceniany):

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

Funkcja (ostatnia nowa linia jest punktowana):

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

1

Współczynnik, 55 bajtów

To spacer w parku! Wymyśliłem to w mojej głowie, gdy tylko przeczytałem pytanie.

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

1

Clojure, 72 bajty

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

1

R, 49 bajtów

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

Całkiem proste rozwiązanie.


To nie działa na mnie Read 1 item Error in nchar(x + 1) : object 'x' not found. Znalazłem, że (t<-nchar(a))+...zadziałało.
— JAD

@JarkoDubbeldam: My bad!
— Frédéric,

1

Wolfram, 56

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

Biorąc pod uwagę, l = StringLength[x]że dołącza się l + IntegerLength[l + IntegerLength[l]]do x.



1

ForceLang, 83 bajty

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.