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


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

Правила:

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


Какие символы могут появляться на входе?
Мартин Эндер

@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 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


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

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


3

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

.f+liq)+

Объяснение:

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

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


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

2
Я действительно должен найти способ исправить веб-ошибку в ссылке на копирование, которая автоматически отключает переключатель предупреждений
Blue


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

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.

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

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


Вы используете только 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
}


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


Почему 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

1

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

Это прогулка в парке! Я придумал это в своей голове, как только прочитал вопрос.

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


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.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.