Додавання рядкових довжин


51

Виклик:

Давши рядок sна символах a- z, A- Z, 0- 9, додайте довжину sдо себе, рахуючи додаткові символи в довжині як частину загальної довжини s.

Вхід:

Просто рядок довільної довжини (може бути порожнім).

Вихід:

Така ж струна, але з її довжиною додається до кінця. Символи, які представляють довжину, також слід вважати частиною довжини. У випадках, коли для додавання є кілька дійсних довжин, виберіть найменшу можливу (приклади див. У тестових випадках).

Випробування:

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

Правила:

Це , тому найкоротший код у байтах виграє. Стандартні лазівки заборонені. Подання можуть бути цілою програмою або функцією, і ви можете або надрукувати результат у stdout, або повернути його як змінну з функції.


Які символи можуть відображатися у вводі?
Мартін Ендер

@MartinEnder Тільки буквено-цифрові символи, 0-9 та AZ / az. Так що так, ви можете мати рядки з цифрами на кінці. Я додам тестовий випадок для одного.
Йодл

Відповіді:



18

JavaScript (ES6), 32 байти

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

Як це працює

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

Починаючи з того N=0, ми перевіряємо N-й символ (на основі 0) рядка, зроблений з конкатенації вихідного рядка введення та десяткового подання N. Ми зростаємо, Nпоки цього персонажа більше не існує.

Приклад:

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

Тестові справи


Ого, JS для цього набагато терпше, ніж Python.
mbomb007

@Arnauld Я не можу з цим обійтись. Ви не проти пояснити, як працює цей код?
Гоутем

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


Ой, я не думаю, що я ніколи раніше не бачив відповіді на латекс на ppcg.
pajonk

5

JavaScript (ES6), 37 байт

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


Коли я натиснув, Run Code Snippetя побачу повідомлення про помилку. Я не знаю Javascript - я просто намагався
Прасанна

@Prasanna працює для мене у Firefox; який браузер ви використовуєте?
Ніл

@Prasanna Працює на останньому Google Chrome. Ви впевнені, що не використовуєте IE11 або старішу версію, Opera чи інше, що не підтримує ES6?
Ісмаїл Мігель

Я використовую старий хороший хром ( Version 48.0.2564.97). Я спробую це і з IE. Не можу оновити свої проблеми щодо безпеки в службі Chrome
Prasanna

5

C, 67 65 61 байт

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

Wandbox


1
О, так, я повинен надрукувати ... Як би то не було, вітаюсь з тим, що коротше рішення C: D +1
кіт

4

Lua 5.2, 32 байти

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

Де змінна a - це вхідна рядок.


3

Пайк, 8 байт ( стара версія )

.f+liq)+

Пояснення:

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

Спробуйте тут! (Нова версія, 9 байт)


Мене завжди бентежить, наскільки похований фактичний результат серед попереджень чи інших повідомлень :-)
Луїс Мендо

2
Мені слід дійсно зайнятися виправленням веб-помилки у посиланні копіювання, яке автоматично вимикає перемикач попереджень
Синій


3

Haskell, 46 байт

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

Приклад використання: f "aaaaaaaa"-> "aaaaaaaa9".

Просто спробуйте всі числа, починаючи з 0, і візьміть перше, що підходить.


3

Математика, 57 байт

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

Безіменна функція, що приймає масив символів у якості введення та повертає рядок. Використовує той факт, що якщо aдовжина вводу, то число, яке слід додати до вводу, aплюс кількість цифр у ( a+ довжина a), а не просто aплюс цифри a. На жаль, це не дасть правильної відповіді на введення порожнього рядка без ~Max~1спеціального випадку.


3

Брахілог , 13 байт

l<L$@:?rc.lL,

Спробуйте в Інтернеті!

Пояснення

В основному опис проблеми. Він буде намагатися кожне значення, що Lперевищує довжину введення, доки не знайде значення, для якого при з’єднанні з входом є довжина цього конкатенації.

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 байт

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

Вхід повинен бути завершений передачею ліній (LF). Працює лише для входів довжиною менше 256 (включаючи НЧ).

Спробуйте в Інтернеті!

Пояснення

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

Примітка: Я використовував код з цієї відповіді SO, щоб перетворити довжину на вихід ascii; Я сподіваюся, що це прийнятно на PPCG. Це моє перше подання Codegolf, і друге моє програмне забезпечення BF. Відгуки вітаються.


1
Це невірно, тоді він повинен пройти всі тестові справи
кіт

Тож підтримка довжини до 999 було б достатньо?
Форент Вінтьє

Спеціалізація говорить про "довільну довжину", що означає "до тих пір, поки ваша мова здатна обробляти або не втрачати пам'ять"
кіт

Інтерпретатор brainfuck, який ви використовуєте, має 8-бітні комірки, тому, поки ваш алгоритм працює для рядків довільної довжини, він повинен бути добре, якщо він не відповідає рядкам довжиною 256 або вище. Подання C і JavaScript також не вдасться, коли рядки стануть занадто довгими.
Денніс



2

Рубі, 62 58 56 байт

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

Випробуваний в irb.

Можливо, є кращий спосіб це зробити, але це було перше, що я придумав. Будь-яка допомога в гольфі буде вдячна.

редагувати: я зрозумів, що використання дужок було надмірним.


Ви використовуєте лише lв одному місці. Якщо ввести це в рядок, ви збережете 3 байти l=;. Але ваше рішення все ще буде довше мого;)
DepressionDaniel

2

Perl 6 ,  46  35 байт

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

Спробуй це

Розширено:

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

Пітон, 39 байт

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

Більш довга форма:

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

Ітеративно в Python 2 (41 байт):

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

Починаючи з xвхідного рядка a, застосовує перетворення x -> a + str(len(x))тричі. Мені все ще не зрозуміло, для чого потрібно три програми, щоб завжди досягти фіксованої точки.


Чому 3 рази? Перший - додати довжину тексту, другий - відрегулювати довжину, щоб включити число, третій у випадку, якщо коригування додало додаткову цифру.
Том Вінер


2

баш, 47 байт

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

Збережіть це як сценарій і передайте рядок введення як аргумент.

Це реальна реалізація сили: спробуйте кожне число по черзі, поки не знайдете те, що працює.


2

> <> (Риба) 35 байт

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

Здійснює введення в стек, перевіряє довжину на значення 9,99,999 ... і якщо довжина більше, ніж додати 1 до довжини стека.



1

C #, 77 байт

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

1
Я зараз не C #, але ви не можете використовувати return(n+(a+1+c))як a=n.Length?
Лайконі

А також скинути -1з int c=(a+1).ToString().Length-1і +1повернути?
Лайконі

1
Зачекайте, чи правильно це обробляє більші тестові справи? Схоже, він повертається aa...a100замість тестового випадку aa...a10199 a.
Лайконі

1

MATL , 11 байт

`G@Vhtn@>]&

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

`      % 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 байт (програма)

Ruby, 49 байт (функція)

Програма (останній новий рядок не потрібен і, таким чином, не захищений):

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

Функція (набрано останній новий рядок):

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

1

Фактор, 55 байт

Це прогулянка по парку! Я придумав це в голові, як тільки прочитав питання.

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

1

Clojure, 72 байти

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

1

R, 49 байт

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

Досить просте рішення.


Це не працює для мене Read 1 item Error in nchar(x + 1) : object 'x' not found. Я виявив, що (t<-nchar(a))+...це спрацювало.
JAD

@JarkoDubbeldam: Моє погано!
Фредерік

1

Вольфрам, 56

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

З огляду на l = StringLength[x]це приєднує l + IntegerLength[l + IntegerLength[l]]до x.



1

ForceLang, 83 байти

set s io.readln()
label 1
set n 1+n
set t s+n
if t.len=n
 io.write t
 exit()
goto 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.