Піраміда ламаних струн


10

Давши рядок n, створіть піраміду рядка, розділену на частини відносно поточного рядка.

Перший рядок містить рядок немодифіковану.

Другий ряд містить рядок, розділений на половинки трубою.

Третій ряд відокремлює його на третини ...

І так далі. Довжина кожної підрядки, де l - довжина рядка n, дорівнює

підлога (л / н)

Залишені символи розміщуються у власній підрядці. Останній використаний рядок - перший, де підрядки мають 2 довжини.

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

Вхід: Привіт, світ.

Вихід:

Hello, world.

Hello,| world|.

Hell|o, w|orld|.

Hel|lo,| wo|rld|.

He|ll|o,| w|or|ld|.

Вхід: abcdefghij

Вихід:

abcdefghij

abcde|fghij

abc|def|ghi|j

ab|cd|ef|gh|ij

Вхід: 01234567890abcdef

Вихід:

01234567890abcdef

01234567|890abcde|f

01234|56789|0abcd|ef

0123|4567|890a|bcde|f

012|345|678|90a|bcd|ef

01|23|45|67|89|0a|bc|de|f

Додаткові правила:

  • Ви можете написати повну програму або функцію, залежно від того, хто використовує менше коду.

  • Вхід завжди буде щонайменше 4 символами.

  • Ви ОБОВ'ЯЗКОВО використовувати розриви рядків, якщо ваша мова їх підтримує. Якщо це неможливо, замініть розриви рядків на:

  • Вхід завжди буде друкованим ASCII.

  • Мінус 100%, якщо програма вирішує P проти NP.


Табло:


0 байт:return: false
Габріель Бенамі

3
Приємний перший виклик! Кілька питань уточнення - це лише вхідний файл для друку ASCII (я настійно пропоную "так")? Що означає "розрив рядків, коли це можливо"?
AdmBorkBork

3
Це жарт. P vs NP - невирішена проблема в обчисленні. Жарт полягає в тому, що якщо ви зможете це вирішити, я перестану дбати про те, щоб ваша програма не вирішила завдання.
Джуліан Лачнет

3
Справжня невирішена проблема в обчисленні - це "вкладки або пробіли" ...
FlipTack

3
Ні, справжня проблема - це Internet Explorer.
Джуліан Лачнет

Відповіді:


0

JavaScript (ES6), 103 101 91 84 байт

Виправлено з дотриманням вимог, що стосуються проблем

f=(s,n=0,p=s.length/++n|0)=>p>1?s.match(eval('/.{1,'+p+'}/g')).join`|`+'\n'+f(s,n):''

Лямбда, fяка приймає вхідний рядок як перший параметр sі рекурсивно друкує для консолірування розділеної рядки. Досить прямо: доки довжина підрядки, pвище 1, друкуйте рядок, розділений на "|" кожні pсимволи, а потім продовжуйте додавати наступний рівень. Це потім викликає функцію знову pбути t / nубитий, де tзнаходиться вихідна довжина рядка і nбути порядковим дільник.


Я не думаю, що ділення nна 2 кожного разу є правильним.
Ніл

@Neil ти прав, помилка з мого боку. Я вирішив проблему і зберег 2 байти в процесі.
XavCo7

@ETHproductions Я подумав про це, але не знаю, чи вважатиметься це STDOUT ... Я думаю, мені потрібно було б зробити це alert(f(s))відразу після того, як правильно?
XavCo7

4

Perl, 46 + 1 = 47 байт

Біжи з -nпрапором

say s/.{$=}(?=.)/$&|/gr while($==y///c/++$,)-2

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

Розбивка коду

-n                                              #Reads input into the $_ variable
say s/.{$=}(?=.)/$&|/gr while($==y///c/++$,)-2
                                 y///c          #Transliteration.  Implicitly operates on $_, replacing every character with itself and counting replacements
                                                #y///c effectively returns the length of $_
                                      /++$,     #Increments $, (which starts off at 0) and divides the length of $_ by $,
                              $==               #Stores the result of this division into $=
                                                #$= forces its contents to be an integer, so it truncates any decimal
                             (             )-2  #Returns 0 if $= is equal to 2
                        while                   #Evaluates its RHS as the condition.  If truthy, evaluates its LHS.
    s/          /   /gr                         #Substitution.  Implicitly operates on $_.
                                                #Searches for its first argument and replaces it with its second argument, repeating until it's done, and returns the new string.  $_ is not modified.
      .{$=}                                     #Looks for a string of $= characters...
           (?=.)                                #...that is followed by at least one non-newline character, but does not include this character in the match...
                 $&|                            #...and replaces it with itself followed by a pipe character.
say                                             #Output the result of the substitution.

Схоже, це не працює для більш тривалих входів.
Ніл

2

Pyth, 16 байт

Vh/lQ3j\|cQ/lQhN

V                # For N in range(1, \/ )
 h/lQ3           # 1+lenght(input)/3
      j\|        # join with '|'
         cQ      # chop input in
           /lQhN # lenght(input)/(N+1) pieces

спробуйте тут


1
Це може працювати для тестових випадків, але я не думаю, що це працює для більш тривалих даних.
Ніл

2

C, 145 131 128 125 байт

l,n,i=1,j;f(char*s){l=strlen(s);puts(s);do{n=l/++i;for(j=0;j<l;)j&&(j%n||putchar('|')),putchar(s[j++]);puts("");}while(n>2);}

Це функція, яка приймає рядок як аргумент і друкує висновок в STDOUT.

l,n,i=1,j;       // declare some variables
f(char*s){       // declare the function
l=strlen(s);     // get the length of the string
puts(s);         // output the initial version, with trailing newline
do{n=l/++i;      // n is the number of characters per "section",
                 //  and we'll do-while n>2 to stop at the right time
for(j=0;j<l;)    // loop through the characters of the string
j&&(             // if j != 0,
j%n||            // and j % n == 0,
putchar('|')),   // insert a | before this character
putchar(s[j++]); // print the character
puts("");        // print a newline after the loop
}while(n>2);}

Як це працює один раз i*i>l? Схоже, він почне повторювати розділи.
Ніл

@Neil Я не впевнений, що ти маєш на увазі. Чи можете ви навести приклад?
Дверна ручка

@Neil Ах, неважливо, я бачу, що ти говориш. Це, мабуть, є отвором у специфікації, в якому прямо вказано, що довжина кожної підрядки є floor(l/n); Я не впевнений, що передбачається для більш тривалих вкладень чи якщо ОП передбачила це.
Дверна ручка

1

Pyth, 17 байт

jmj\|cQ/lQdSh/lQ3

Пояснення

     cQ/lQ         Divide into equal pieces (with the last shorter)
  j\|              Join with pipes
 m        d        Map to each row index...
           Sh/lQ3  ... up to the first row with substrings of length 2
j                  Join with newlines

1

Javascript, 98 байт

a=>{for(b=1;2<=a.length/b;)eval("console.log(a.match(/.{1,"+(a.length/b|0)+"}/g).join('|'))"),b++}

Функція x(a). Дзвінок за допомогою

console.log(x("ABCDEF"))



0

Python 3, 123 байти

f=lambda s:print(*['|'.join(s[i:i+n]for i in range(0,len(s),n))for n in[len(s)//i for i in range(1,len(s)//2+1)]],sep='\n')

При більш довгих рядках деякі частини будуть повторюватися, як формула довжини підрядок floor(l/n). Наприклад, з рядком на 13 символів, рядок, розділений на 5, буде таким самим, як і розділений на 6 рядків floor(13/5)==floor(13/6). Я не впевнений, чи очікувала це ОП чи це був нагляд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.