Пирамида из разорванных струн

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.


Leaderboard:

Джулиан Лахниет
источник
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быть порядковым делитель.

XavCo7
источник
Я не думаю, что деление nна 2 каждый раз является правильным.
Нил
@ Нет, ты прав, ошибка с моей стороны. Я исправил проблему и сохранил 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? Похоже, он начнет повторять разделы.
Нил
@ Нил, я не уверен, что ты имеешь в виду. Не могли бы вы привести пример?
Дверная ручка
@ Нил Ах, неважно, я понимаю, что ты говоришь. Это кажется дырой в спецификации, которая явно заявляет, что длина каждой подстроки равна 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

Рубин 60 + 1 = 61 байт

+1 байт за -nфлаг.

z= ~/$/
(z/3+1).times{|n|puts $_.scan(/.{1,#{z/(n+1)}}/)*?|}

Посмотреть это на Ideone: http://ideone.com/RtoReG

Иордания
источник
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). Я не уверен, ожидал ли ОП этого или это был недосмотр.

Кормак
источник