Добавление длины строки

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

Правила:

Это , поэтому выигрывает самый короткий код в байтах. Стандартные лазейки запрещены. Представления могут быть целой программой или функцией, и вы можете либо распечатать результат в стандартный вывод, либо вернуть его как переменную из функции.

Yodle
источник
Какие символы могут появляться на входе?
Мартин Эндер
@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
                    ^

Контрольные примеры

Arnauld
источник
Вау, JS гораздо более лаконичен, чем Python.
mbomb007 16.12.16
@Arnauld Я не могу обдумать это. Не могли бы вы объяснить, как работает этот код?
Gowtham
12

Латекс, 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
источник
Ого, я не думаю, что когда-либо видел латексный ответ на 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

o79y
источник
1
О, да, я должен был напечатать ... В любом случае, поздравляю с более коротким решением C: D +1
кошка
4

Lua 5.2, 32 байта

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

Где переменная а является входной строкой.

смола
источник
3

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

.f+liq)+

Объяснение:

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

Попробуй это здесь! (Новая версия, 9 байт)

синий
источник
Меня всегда смущает, насколько скрыт фактический вывод среди предупреждений или других сообщений :-)
Луис Мендо
2
Я действительно должен найти способ исправить веб-ошибку в ссылке на копирование, которая автоматически отключает переключатель предупреждений
Blue
3

Python 2, 54 48 46 байт

Простое решение Рекурсия оказалась короче.

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

Попробуйте онлайн

mbomb007
источник
1
Я думаю, что вы можете сделать (s+`n`)[n:]для n<len(s+`n`).
xnor
3

Haskell, 46 байтов

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

Пример использования: f "aaaaaaaa"-> "aaaaaaaa9".

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

Ними
источник
3

Mathematica, 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
Fatalize
источник
3

Brainfuck, 258 байт

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

Ввод должен быть завершен переводом строки (LF). Работает только для входов с длиной менее 256 (включая LF).

Попробуйте онлайн!

объяснение

# 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
Тогда это не действительно, оно должно пройти все контрольные тесты
cat
Таким образом, поддержка длины до 999 будет достаточно?
Форцент Винтьер
В спецификации говорится «произвольная длина», что означает «до тех пор, пока ваш язык способен обрабатывать или не хватает памяти»
cat
Используемый вами интерпретатор brainfuck имеет 8-битные ячейки, поэтому, если ваш алгоритм работает для строк произвольной длины, все будет хорошо, если он не будет работать для строк длиной 256 или выше. Отправка C и JavaScript также завершится ошибкой, когда строки станут слишком длинными.
Деннис
Спасибо, Денис, я
изменю свою заявку
2

Рубин, 62 58 56 байт

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

Проверено в irb.

Возможно, есть лучший способ сделать это, но это было первое, что я придумал. Любая помощь в гольф будет оценена.

редактировать: я понял, что использование скобок было чрезмерным.

Elenian
источник
Вы используете только lв одном месте. Если вы включите это, вы сэкономите 3 байта l=;. Но ваше решение все равно будет длиннее моего;)
DepressedDaniel
2

Perl 6 ,  46  35 байт

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

Попробуй

Expanded:

{   # 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
}
Брэд Гилберт b2gills
источник
2

Python, 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))три раза. Мне до сих пор не ясно, зачем нужны три приложения, чтобы всегда достигать фиксированной точки.

XNOR
источник
Почему 3 раза? Во-первых, чтобы добавить длину текста, во-вторых, чтобы настроить длину, чтобы включить число, в-третьих, в случае, если эта корректировка добавила дополнительную цифру.
Том Винер
2

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

Рубин, 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
DepressedDaniel
источник
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)))))
NikoNyrh
источник
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
SuperJedi224
источник