Code Golf - Кодирование Длины Строки

  • Автор темы Ya.roj2012
  • Обновлено
  • 22, Oct 2024
  • #1

Предположим, мы используем следующие правила для извлечения одной строки из другой строки, содержащей только печатные символы ASCII и называемой

 
 
 * 
-string. If the string runs out before the process halts, that is an error, and the result of the process is undefined in that case:

  1. Начните с 7->7 a->a ab->*ab abcd->**abcd 769->*7*69
  2. Всякий раз, когда вы сталкиваетесь с * , multiply *7 **769 *7* *a*b * на 2. Всякий раз, когда вы встречаете другой символ, объединяйте его в конец d->d 769->7 abcd56->a *abcd56->ab **abcd56->abcd *7*690->769 ***abcdefghij->abcdefgh and subtract 1 from s . Если сейчас d=0 , halt and return d

Определенные примеры:

s

Неопределенные примеры: (обратите внимание, что пустая строка также будет одной из них)

d

Ваша задача — взять строку и вернуть кратчайшую * -string that produces that string.

Примеры программ:

d=1, s=""

Ваша программа должна обрабатывать любую строку, содержащую хотя бы один символ и только не- * ASCII printable characters. You can never return strings for which the process is undefined, since by definition they cannot produce ANY strings.

Применяются стандартные лазейки и правила ввода-вывода.

#код-гольф #строка

Ya.roj2012


Рег
29 Oct, 2019

Тем
95

Постов
190

Баллов
695
  • 26, Oct 2024
  • #2

JavaScript (ES6), 61 байт

 
 
 
 
 
 
 
 
 
 
 f d (  [])                    = ""
f d (  xs) | length xs >= d*2 = '*' : f (d*2) xs
f d (x:xs)                    =  x  : f (d-1) xs
 

Рекурсивная функция, которая делает следующее:

  • Если d is less than or equal to remaining string length divided by 2:

    Добавить d to output and multiply d на 2

  • Еще:

    Сдвиньте строку и добавьте к выводу, вычтите 1 из f d[]="" f d xs|length xs>=d*2='*':f(d*2)xs f d(x:xs)=x:f(d-1)xs .

Посмотрите это в действии:

**abc*de *a**bcde
 

JunitaswFlnD90


Рег
25 Oct, 2024

Тем
71

Постов
206

Баллов
571
  • 26, Oct 2024
  • #4

Пиф (36 27 байт)

Спасибо Jakube за 9-байтовое улучшение! На данный момент не так хорошо, какответ грязной рыбы

f=(s,l=s.length,p=2)=>l<2?s:p<l?"*"+f(s,l,p*2):s.slice(0,p-=l)+"*"+s.slice(p)

, но что угодно

Тестовый набор

main(int q,char**v){ ++v; // refer to the first command line argument int i=1, n=strlen(*v); // set up iteration variables while(n > (i*=2)) // print the first floor(log2(n)) '*'s putchar(42); for(i-=n; **v; --i, ++*v) // print the string, and the final '*' !i&&putchar(42),putchar(**v); } ||answer||

Перевод на питон:

2^ceil(log_2(length)) - length

С, 125 байт

При этом используется очень регулярный шаблон расположения звезд для вывода правильной кодировки. Сначала я попробовал рекурсивное решение методом грубой силы, но, оглядываясь назад, должно было быть очевидно, что существует более простое математическое решение. 2^floor(log_2(length)) stars at the start of your output, and a final star after main(int q,char**v){++v;int i=1,n=strlen(*v);while(n>(i*=2))putchar(42);for(i-=n;**v;--i,++*v)!i&&putchar(42),putchar(**v);} По сути, у вас всегда будет

символы (если получается хотя бы 1 символ).

| z=input() #occurs by default Klz | K=len(z) J1 | J=1 Vz | for N in z: WgKyJ | while K >= J*2: p\* | print("*", end="") =yJ | J=J*2 ) | #end inside while pN | print(N, end="") =tK | K=K-1 =tJ | J=J-1 ||answer||

(Слегка) версия без гольфа выглядит следующим образом.

KlzJ1VzWgKyJp\*=yJ)pN=tK=tJ

JavaScript (ES6), 88 77 байт +*\*sKllzXJ-^2.EKlzz?J\*k had to be <input id="input" type="text"/> <p id="output"></p> Сначала я подумал, что f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s input.oninput = e => output.innerHTML = f(input.value); works just as well. This means that the output is readily constructed using floor(log₂(s.length)) leading stars, plus an additional star for strings whose length is not a power of two.

но оказывается, что

Изменить: сохранено 8 байт за счет рекурсивного расчета количества ведущих звезд. Сэкономил еще 3 байта с помощью строк специального регистра длиной 1, чтобы я мог рассматривать строки, длина которых равна степени 2, как имеющие дополнительную ведущую звезду.

 

Танння


Рег
05 Apr, 2011

Тем
80

Постов
203

Баллов
603
  • 26, Oct 2024
  • #5

d

Хаскель, 68 байт d , output a star and double * На самом деле то же самое, что и другие ответы. Если EOF, выведите пустую строку. Если оставшаяся длина больше чем в два раза d .

. В противном случае выведите следующий символ и вычтите единицу из

f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
 

Bymousyteesee75


Рег
05 Nov, 2011

Тем
89

Постов
156

Баллов
621
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно

Lumtu.com © 2024