Перший огляд коду Аліси


20

Аліса - стажер у компанії, яка використовує Brainfuck як основну мову як для розвитку клієнта, так і для сервера. Аліса щойно написала свій перший код, і вона трохи нервує, коли готується до свого першого перегляду коду.

Аліса хоче зробити свій код правильно відформатованим і виглядати приємно, але у неї немає часу читати посібник зі стилю коду на 328 сторінках компанії, тому вона вирішила відформатувати його як ідеальний квадрат . На жаль, довжина коду може бути недостатньою для формування квадрата, тому вона вирішила залишити прямокутний зазор посередині. Зазори повинні бути ідеально центрировані та максимально наближені до квадрата .

Приклади

++++++         +++++         +++++         +++++         +++++         +++++
++++++         +++++         +++++         +  ++         ++ ++         +++++
++++++         ++ ++         +   +         +  ++         +   +
++++++         +++++         +++++         +++++         ++ ++         +++++
++++++         +++++         +++++         +++++         +++++         +++++

Perfect         OK         Acceptable   Unacceptable    No way!        Nope.

Напишіть програму або функцію, щоб допомогти Алісі. Враховуючи код Аліси як вхідний рядок, виведіть належним чином відформатований код, як описано нижче, якщо можливо. Якщо форматування неможливо, виведіть смайли плачу :~(.

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

Обмеження

  1. Ваша програма або функція повинна приймати один рядок як вхід і вихід одного або декількох рядків тексту (або повертати багаторядковий рядок або масив рядків, якщо ви реалізуєте функцію).
  2. Рядок введення може містити будь-які символи ASCII, включаючи пробіли.
  3. Усі пробіли у введенні повинні ігноруватися. Вони не повинні розраховувати довжину коду, і їх не слід використовувати у висновку.
  4. Рядок введення містить щонайменше один непробільний символ.
  5. Форматований код повинен мати ті самі символи, які не пробілюються, у тому ж порядку, що і у вхідному коді.
  6. Форматований код повинен бути ідеальним квадратом, тобто всі рядки повинні мати однакову довжину, а кількість рядків має бути рівним довжині рядків.
  7. Форматований код може містити пробіл посередині.
  8. У проміжку можуть використовуватися лише символи пробілу (ASCII код 32).
  9. Зазор (якщо він присутній) повинен бути прямокутним.
  10. Кожен рядок відформатованого коду повинен містити щонайменше один непробільний символ, тобто ширина зазору повинна бути строго меншою за ширину квадрата (проміжок 5х1 неприйнятний для 5х5 квадрата).
  11. Зазор повинен бути горизонтальним, тобто ширина зазору повинна бути більшою або дорівнює висоті зазору.
  12. Розрив повинен бути ідеально центрованим.
  13. Отже, паритет ширини зазору та висоти повинні бути такими ж, як і парність у ширині квадрата (наприклад, для квадратного зазору 5x5 може бути 1x1, 3x1 або 3x3).
  14. Якщо можливо, виведіть квадрат без розриву.
  15. У випадку декількох рішень виберіть одне з зазором, найближчим до квадрата, тобто різниця між шириною зазору та висотою зазору мінімальна (наприклад: зазор 10x10 є кращим, ніж 8x6, а 8x6 - більш переважним, ніж 6x2).
  16. Якщо все-таки є краватка, вибирайте рішення з мінімальною площею зазору (наприклад, зазор 2x2 є кращим, ніж 4x4).
  17. Якщо форматування коду взагалі неможливо, виведіть :~(.
  18. Новий рядок після останнього рядка необов’язковий.
  19. [Новий] Ви можете сміливо припускати, що будь-який символ з кодом нижче 33 є пробілом. Я сподіваюся, що це допоможе тобі в гольфі.

Тести

Input           Output      Code length     Comment

+++++++++       +++                   9     Alice is lucky, 
                +++                         her code perfectly fits a square. 
                +++


++++++++        +++                   8     Though code length isn't enough for a square, 
                + +                         a small gap fixes it.
                +++


++++++          :~(                   6     No luck, code cannot be formatted.


Hello,          Hell                 12     Input may contain any ASCII characters, 
World!          o  ,                        but whitespaces in input should be ignored.
                W  o
                rld!


+++++ + +++++   +++++                22     Gap is not required to be a square, 
+++++ + +++++   +++++                       it can be a rectangle.
                +   +
                +++++
                +++++

+++ + +++       ++++++++             28     There exists another solution: 
+++ + +++       +      +                    6x6 square with 4x2 gap, 
+++ + +++       +      +                    but in Alice's opinion square gap 
+++ + +++       +      +                    makes code more readable.
                +      +
                +      +
                +      +
                ++++++++

Хитрі випробування

This must be    Thism                24     7x7 with 5x5 gap looks good,
5x5 with 1x1    ustbe                       but 5x5 with 1x1 gap is better,
gap.            5x 5w                       because gap area is smaller.
                ith1x
                1gap.

+++ +++ +++     :~(                  18     In case you tried 5x5 square
+++ +++ +++                                 with 7x1 gap ;)

Ресурси

Для економії місця ви можете знайти зразок коду та додаткові тестові випадки на tio.run

[Новий] Ви можете подивитися таблицю прийнятих рішень для введення до 100 символів . Я змінив ширину та висоту, тому що це, здається, виглядає більш інтуїтивно.

Натхненний: квадрат тексту

Зміни

  • Додано 2 тести, виправлена ​​помилка у зразковому коді.

  • Додано таблицю рішень до 100, додано прояснення пробілу.


3
"Якщо форматування неможливо, виведіть плачучі емодзі" - непотрібний пух, що дозволяє будь-якому виводу бути кращим IMO.
Джонатан Аллан

1
@JonathanAllan, ще краще було б гарантувати, що форматування завжди можливе. Бу-урни для введення перевірки!
Кудлатий

1
@ Джонатан Аллан, будь-який вихід занадто широкий і може бути вразливим до лазівки. Я думав про те, щоб дозволити використовувати будь-які хибні значення, але це зробить висновок невідповідним між різними мовами. Я також розглядав можливість використання порожнього рядка, але це зробить запущені тестові випадки менш наочними. Я також думав про деякі інші повідомлення типу "Помилка", але вирішив зробити його ще коротшим, щоб підтримати розробників Brainfuck у всьому світі.
Даніїл Тутубалін

1
@Shaggy, це не лише перевірка вводу. Щоб виявити, що немає рішення, важлива частина головоломки: вам потрібно з’ясувати, коли припинити пошук.
Даніїл Тутубалін

2
@DaniilTutubalin дуже часто можна впевнитись, що тут будуть надані лише певні матеріали. Дозвіл будь-якого виводу на таких "недійсних" входах також є загальним підходом, і дозволяє уникнути кодового коду, який не має нічого спільного з ядром завдання. Якщо ви дійсно хочете, щоб щось було незмінним як вихід у таких випадках, я б запропонував сам ввід. Я не пропоную вам зараз це змінити ... також це дуже приємна проблема!
Джонатан Аллан

Відповіді:


5

C (gcc) , 354 байт

h,i,j,k,l,m;g,v,w,d;f(char*s){for(i=l=0;s[i];l+=!isspace(s[i++]));d=g=l;for(i=0;i++<l;)if(h=i*i-l)for(j=0;j<i-++j;h>0&h%k<1&k<=m&m<i&m+~k&&m-k<g|m==k+g&(d-2*v)*(d-2*w)>h?w=(i-m)/2,v=j,g=m-k,d=i:j)k=i-2*j,m=h/k;else g=0,v=w=d=i;if(g-l)for(i=j=1;*s;j+=!i++,k=0,i%=d+1)for(putchar(i?v>=j|j>d-v|w>=i|i>d-w?k=1,*s:32:10);k;k*=isspace(*++s));else puts(":~(");}

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


Я вважаю, що вкладка - «пробіл», хоча я попросив роз'яснити, що саме стосується.
Джонатан Аллан

Я оновив пост. Ви можете замінити isspace(x)на x<33.
Даніїл Тутубалін


4

JavaScript (ES6),  284 ... 274  270 байт

Збережено 4 байти завдяки @Shaggy

Повертає масив рядків.

s=>(s=s.replace(/\s/g,''),n=s.length,o=[':~('],W=d=g=(x,w=0,h=p=0)=>4*~-x>n?o:h>w?++w>x-2?g(-~x):g(x,w):g(x,w,h+1,o=n-x*x+w*h|(w^x|h^x)&!!(w|h)|w-h>d|w-h==d&w>W?o:[...Array(x)].map((_,Y,a)=>a.map((_,X)=>2*X>=x-w&2*X<x+w&2*Y>=x-h&2*Y<x+h?' ':s[p++]).join``,d=w-h,W=w)))``

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


Молодці! Хоча спробуйте цей тест: This must be 5x5 with 1x1 gap.(24 символи)
Даніїл Тутубалін

1
@DaniilTutubalin Ось чому я видалив своє початкове повідомлення (і запропонував такий тестовий випадок), але це зараз підтримується правильно.
Арнольд

Не може [\s\n]бути просто \s?
Кудлатий

++w>x-2w++>=x-2w++>=x42\s

4

Стакс , 80 байт

ö╦Çc▀╕╡ëé╓]µiÖ9♪`W|╣▐↑╖D┘↕♫╗╔äƒ■úφ■U`ÿ⌠%é┴☼vAú)☺@ı◄¬¶¢(îÉ┼6⌠D~♀└lfæA.I@º╤∟òîü╦(

Запустіть і налагоджуйте його

Як це працює?

  • Розглянемо всі квадрати з прямокутними вирізами.
  • Відфільтруйте форми програми, які не потрібного розміру.
  • Відфільтруйте форми програми, які не мають відповідності.
  • Відфільтруйте програмні форми, де вирізання занадто велике для квадрата.
  • Якщо жодного не знайдено, вихід з ладу та вихід.
  • Знайдіть форму, яка мінімізує «прямокутність» вирізу, а потім за розміром вирізу.
  • Замініть кожен символ у формі програми відповідним символом на вході програми.

Розпакувавшись, не розібравшись та коментуючи, це виглядає приблизно так.

                input e.g. "big socks"
L$j$            remove whitespace from input e.g. "bigsocks"
cr{~F           copy push each remaining character to input stack in reverse order
%c              get length L of flattened input and copy e.g. 8
^r3:$           create triples [a,b,c] in range 0..n e.g. [[0,0,0], [0,0,1], ... [8,8,8]]
{E*NsJ+n=f      filter triples: require a*a-b*c=L e.g. [[3,1,1], [4,1,8], ...]
{ET>f           filter triples: a>b and a>c e.g. [[3,1,1]]
{{2%m:u_0#+f    filter triples: a%2=b%2=c%2 or b*c=0 e.g. [[3,1,1]]
":~("s|c        if there are no triples, output ":~(" and terminate
{D:s_D:*\oh     sort by [abs(b-c),b*c]; keep the first e.g. [3,1,1]
X               store the chosen triple in the X register
E               explode onto stack e.g. 3, 1, 1
z)]*            using last two values, make a rectangle of zeroes e.g. 3, [[0]]
~               this will be the cutout, push it to the input stack
c'X*]*          make a square of "X" e.g. ["XXX", "XXX", "XXX"]
xEd-h           given the dimensions in x register, calculate the centered cutout coordinates
xEsd-h          e.g. ["XXX", "XXX", "XXX"], 1, 1
,||             embed the cutout grid at the specified coordinates e.g. ["XXX", "X X", "XXX"]
m'X{,]}R        for each line, regex replace "X" with a character from the input stack

Виконати цей


Чи можете ви також надати розпаковану версію?
Даніїл Тутубалін

1
@DaniilTutubalin Я додав пояснення.
рекурсивна

Дякую! Молодці!
Даніїл Тутубалін

2

Вугілля деревне , 120 байт

≔E⮌⪫⪪S ωιθ≔⁰ηF⊕Lθ¿⁼Lθ×ιι«≔ιη≔ιζ≔ιε»F⊘ιF⊕κF∧⁼Lθ⁻×ιι×⁻ι⊗⊕κ⁻ι⊗⊕λ∨¬η›⁻ζε⁻κλ«≔ιη≔⊕κζ≔⊕λε»¿η«UOη#JεζF›η⊗ζUO⁻η⊗ε⁻η⊗ζψUMKA⊟θ»:~(

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

≔E⮌⪫⪪S ωιθ

Стріліть пробіли від введення, потім поверніть його назад і розділіть на символи, щоб ми могли пізніше перенести символи.

≔⁰η

Почніть з розміру нуля, вказуючи на відсутність результатів (поки що).

F⊕Lθ

Перевірте всі бокові довжини до довжини струни. (Якщо кинути поділ, звичайно, зробить код швидшим.)

¿⁼Lθ×ιι«≔ιη≔ιζ≔ιε»

Якщо результат виявиться ідеальним квадратом, тоді збережіть розмір квадрата, а також встановіть його як розмір межі.

F⊘ιF⊕κ

Петля за можливими висотами та шириною бордюру (ширина рамки не більша за висоту кордону, завдяки чому висота зазору не перевищує ширину зазору.)

F∧⁼Lθ⁻×ιι×⁻ι⊗⊕κ⁻ι⊗⊕λ∨¬η›⁻ζε⁻κλ«≔ιη≔⊕κζ≔⊕λε»

Якщо розмір межі є потрібною довжиною, і у нас поки немає рішення, або він не такий квадратний, як це рішення, то оновіть рішення на цей розмір квадрата та межі.

¿η«

Якщо у нас є рішення ...

UOη#

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

JεζF›η⊗ζUO⁻η⊗ε⁻η⊗ζψ

Якщо межа досить мала, щоб залишити проміжок, тоді видаліть проміжок. (Команда малювання буде малювати вгору та вліво для від'ємних значень і зовсім не любить нульові значення.)

UMKA⊟θ

Замініть всі (залишилися) символи символами з вводу.

»:~(

В іншому випадку виведіть :~(.


2

Желе , 91 85 байт

ÆDżU$<Ạa;ḂEɗʋƇṢƑƇ;€€
ḟ⁶ḟ⁷;©⁶L’²<¥Ðḟ²_ç;,`Wɗ¹?⁸ʋ€$Ẏạ/ÞḢµIH+""Rp"/ḟ@/ŒṬ€ĖP€Sị®Yµ“:~(”¹?

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

Монадічне посилання, яке приймає рядок введення як аргумент і повертає рядок або з відформатованим висновком, або :~(.


1

Пітон 2, 287 281 279 байт

c=list("".join(input().split()))
l=len(c)
p=[]
for q in range(l*l):x=q%l;y=q/l;s=(l+x*y)**.5;p+=[(abs(x-y)/2,int(s),-x)]*(s%1==0)*(x<s-1>y>=s%2==x%2==y%2or x<1)
if p:d,s,x=min(p);b=(s+x)/2;Y=0;exec"c[b:b]=' '*-x*(b+d<=Y<s-b-d);print''.join(c[:s]);c=c[s:];Y+=1;"*s
else:print':~('

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

Використовує порівняння лексикографічного списку Python, використовуючи однакові значення як для вибору рішення, так і для його друку. Я майже впевнений 10 4 2 або близько байтів все-таки можна збрити.

Пояснення

c=list("".join(input().split()))
l=len(c)
p=[]

Видаліть пробіли, розділивши пробіл і з'єднавшись "", а потім перетворіть вхід у список для подальшого. Також ініціалізувати lна довжину фактичного коду таp до переліку дійсних можливостей.

for q in range(l*l):x=q%l;y=q/l;s=(l+x*y)**.5;

Прокрутіть усі можливості розмірів зазору від 0*0до l*l. Обчисліть довжину ребра квадрата з lкодовими символами та x*yпробілами якs .

p+=[(abs(x-y)/2,int(s),-x)]*(s%1==0)*(x<s-1>y>=s%2==x%2==y%2or x<1)

Перевірте, чи відповідають такі умови:

  • s % 1 == 0, тобто формується ідеальний квадрат
  • x < s-1 > y, тобто є xі yмаксимумs-2 та встановити всередині квадрата
  • s % 2 == x % 2 == y % 2, тобто і xіy відповідають паритету краю і можуть бути по центру
  • але якщо x < 1, тобто x == 0, ігноруйте всі, крім ідеальної вимоги квадратних

Якщо умови збігаються, додайте такі елементи в кортеж, pщоб знайти оптимальний:

  • abs(x-y)/2; спочатку знайдіть мінімальну різницю xіy отримайте найбільшу квадратичну зазору. Це завжди навіть, тому ми ділимо на 2.
  • int(s); Далі знайдіть мінімальну довжину сторони Так sяк ціле число і збільшується у міру розриву областіx*y , це сортує за площею проміжку.
  • -x; Далі знайдіть максимальну ширину, щоб віддати перевагу горизонтальним зазорам. Це трапляється після області завдяки тому, як вона була розроблена, але область однакова x*yі y*xтому вона працює.
if p:d,s,x=min(p);b=(s+x)/2;Y=0

Якщо ми знайшли дійсні макети, знайдіть оптимальну, як описано вище. Обчисліть горизонтальну межу bта ініціалізуйте номер рядка Yдо 0.

exec"c[b:b]=' '*-x*(b+d<=Y<s-b-d);print''.join(c[:s]);c=c[s:];Y+=1;"*s

Якщо номер рядка Yзнаходиться всередині зазору (вертикальна межа є b+dз dкортежа), додайте значення пробілів ширини зазору після горизонтальної межі в c. (Модифікація cтому нам потрібна, щоб це був список.) Потім надрукуйте рядок квадрата і видаліть його c. Повторіть sрази, збільшуючи номер рядка.

else:print':~('

Якщо не було знайдено макетів, не вдалося.


Молодці! На жаль, це не добре працює з багаторядковим входом. Також здається, що він не підтримує прямокутні проміжки (див. Тест довжиною 22).
Даніїл Тутубалін

1
@DaniilTutubalin Вам потрібно надати введення як рядок Python, багаторядковий буде буквально "some\ntext"як роздільник. ( input()оцінює рядок введення як код Python.) Якщо це неприйнятно, будь ласка, дайте мені знати. Довжина 22 також працює для мене.
PurkkaKoodari

ой, вибач. Можливо, я зробив щось не так із введенням.
Даніїл Тутубалін

1

Pyth , 99 98 байт

#JscQ)=QshKh|oaFtNSf!|%hT1&eT|t{%R2TgeStThT+L@+lJ*Fd2^UJ2
":~("Am/-Qd2tKW=W}~hZrG-QGJj*eKdcJ]H<~>J

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

Тут використовується той же алгоритм, що і в моїй відповіді Python, але багато деталей значно змінені, щоб бути коротшими в Pyth.

Pyth показує свій вік тут, оскільки він не оновлювався віками і використовує лише друковані символи ASCII (для коду, а не для даних), витрачаючи багато місця.

Цікаво, що якби Pyth використовував такий самий тип упаковки base-256, що і Stax, ця програма може мати ⌈98 log 256 95⌉ = 81 байт, прямо поруч зі Stax (80 байт) та Jelly (85 байт). Я думаю, що це добре показує, наскільки близькі мови для гольфу навіть з їх різко різними парадигмами.

Пояснення (лише трохи менш нечитабельні, ніж код)

#загортає все в while True:те, що пригнічує повідомлення, і закриває помилку.

JscQ) cхмільний вхід ( Q) у пробілі, sумить деталі разом і зберігає результат у J.

^UJ2складає список індексів ( U) Jі приймає свою 2декартову потужність ( ^), в результаті чого всі пари [h,w]з 0<=h<len(J)і 0<=w<len(J).

+L@+lJ*Fd: для всіх ( L) таких пар dдодає ( +) квадратний корінь ( @2) ( lангл. Jплюс ( +) добуток ( *F) пари d) до лівої сторони пари, створюючи трійку [side length, gap height, gap width].

f!|%hT1&eT|t{%R2TgeStThT: filter для трійки Tде

  • ні з (!| ):
    • довжина сторони ( hT) модуль 1 ( %1 ) не є нульовою
    • обидва (& ):
      • висота зазору (eT ) - ненульова
      • будь-який із (| ):
        • кожне число триплета ( R) за модулем 2 ( %2), з дублікатами ( {) та першим унікальним (t видаленим ), є порожнім
        • більша ( eS) висота зазору та ширина зазору ( tT) - gрівномірна або дорівнює довжині бічної сторони ( hT)

Sсортує триплети лексикографічно (за бічною довжиною, потім за висотою зазору). oaFtNпотім oрозподіляє трійок aрізницею різниці між висотою зазору та шириною зазору ( tN).

У цей момент, якщо у нас немає правильних рішень, він |оцінює другий аргумент \n":~(", який друкує та повертає :~(. hприймає оптимальне рішення (або ":"якщо його немає) і воно зберігається K. Потім hбере його бічну довжину (або, ":"якщо такої немає), sкидає її на ціле число (або виходить з ладу і закриває, якщо немає), і зберігається ( =) у Q.

Кожен з ( m) [gap height, gap width]( tK) віднімається ( -) від бічної довжини ( Q), а результат ділиться на 2 ( /2). Результати Aпідписуються на Gта H.

Нарешті, ми входимо в Wпетлю хайла. Zпочинається з 0, і кожну ітерацію ми збільшуємо, але використовуємо старе значення ( ~hZподумайте Z++в C).

  • Якщо ( W) старе значення перебуває у ( {) rвідрізок Gдо (довжина сторони - G) ( -QG), призначте ( =) Jнаступне: cстрибок Jу положенні ( ]) Hта jоin половинки з шириною зазору eKраз ( *) пробілом ( d). Якщо значення не було в діапазоні, просто повернітьJ . Якщо цей результат порожній, зупиніть цикл.
  • Видаліть ( >) перші Qсимволи з Jі призначте ( ~) результат J. Зі старого значення Jвзяти ( <) перші Qсимволи та роздрукувати їх.

Нарешті, #цикл запускається знову, помилки та закриття, оскільки cQ)з Qвмістом числа недійсне.


Якщо чесно, мені більше подобається код для друку. Хоча бінарний код займає менше місця, він виглядає набагато менш привабливим (і я вважаю за краще би це шестигранний дамп), і зазвичай порівняння проводиться між рішеннями на тій же мові. Тож коротший упакований розчин Stax порівняно з іншим упакованим розчином Stax, як і раніше буде коротшим після розпакування обох. Упаковка має сенс лише для загальної складності Колмогорова.
Даніїл Тутубалін

@DaniilTutubalin Незалежно від того, як зазвичай проводиться порівняння, все одно приємно обіграти ще один гольфланг;)
PurkkaKoodari

1

05AB1E , 95 89 байт

… 
    мDg©Ý3ãʒćnsP-®Q}ʒć‹P}ʒÈËyß_~}Dg_i…:~(ëΣ¦DÆÄsP‚}н©¤_iнë¬Uć᤮Ås<иs;R`X*+šXnª£®θð×ýX}ô»

Кілька байт тут і там точно можна пограти в гольф.

Перші три кроки програми натхненні відповіддю @recursive 's Stax , тож обов'язково підтримайте його!

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Крок 1: Видаліть усі пробіли:

 
                   # Push string " \n\t"
    м              # And remove those from the (implicit) input-string

Крок 2: Створіть усі можливі трійки [а,б,c], де а - розмірність отриманого а×а квадрат, і б×c- розмір зазору. Ми робимо це, створюючи всі можливі трійні, використовуючи цілі числа в діапазоні[0,а]. А потім ми фільтруємо їх там, де для триплета є все наведене нижче:

  • а2-б×c=L, де L - довжина струни
  • (а>б) і (а>c)
  • (а(мод2)=б(мод2)=c(мод2)) або (мiн(а,б)0)

Наприклад: L=28це призведе до трійки [[6,2,4],[6,4,2],[8,6,6]].

Dg                 # Get the length of this string (without popping by duplicating first)
  ©                # Store this length in variable `®` (without popping)
   Ý               # Create a list in the range [0,®]
    3ã             # Create all possible triplets by repeating the cartesian product 3 times
ʒ                  # Filter these triplets by:
 ć                 #  Extract head; pop and push remainder-list and head to the stack
  n                #  Square the head
   sP-             #  Take the product of the remainder, and subtract it from the squared head
      ®Q           #  And check if it's equal to the string length in variable `®`
                 # Filter the remaining triplets further by:
  ć‹P              #  Where the first integer is larger than the other two
      }          # And filter it a third time by:
  ÈË               #  Where all three are either odd or even
       ~           #  Or
    yß_            #  It does not contain any 0s

Крок 3: Перевірте, чи залишилися у нас ще трійки. Якщо ні, виведіть ":~("; якщо ми це зробимо, визначимо, яку використовувати, сортуючи та залишаючи лише першу. Робимо це, сортуючи кортежі(абс(б-c),б×c).

Наприклад: трійняти [[6,2,4],[6,4,2],[8,6,6]]будуть відсортовані [[8,6,6],[6,2,4],[6,4,2]], після чого [8,6,6]залишається лише .

Dg_i               # If this completely filtered list is now empty:
    …:~(           #  Push string ":~("
ë                  # Else:
 Σ                 #  Sort the triplets by:
  ¦                #   Remove the first character
   DÆÄ             #   Get the absolute difference between the remaining two integers
   sP             #   And pair it with the product of the remaining two integers
                 #  After we're done sorting: only leave the first triplet

Крок 4: Створіть список про те, як слід розділити рядок, щоб вставити пробіли. Робиться це так:

Дано [а,б,c], створіть список за допомогою:

  • В якості першого пункту: а-б2×а+а-c2
  • Як середній б-1 позиції: а-c
  • Як останній предмет: а2

Наприклад: [7,3,5]у списку приведе триплет [15,2,2,35].

©                  #  Store this triplet in variable `®` (without popping)
 ¤_i               #  If the last value is 0 (which means the string is a square without gap):
    н              #   Simply keep the first value of the triplet
   ë               #  Else:
    ¬U             #   Store the first value in variable `X` (without popping)
      ć            #   Extract the first value; pop and push remainder-list and head to the stack
       α           #   Get the absolute difference of this head with the other two values
        ¤          #   Push the last value (without popping the pair itself)
         ®Ås     #   And repeat it the middle element or `®` minus 1 amount of times
       s           #   Swap to get the difference pair again
        ;          #   Halve both values
         R`        #   Push them reversed to the stack
           X*      #   Multiple the first value by `X`
             +     #   And then add it to the second value
              š    #   Prepend this in front of the repeated list
               Xnª #   And also append the square of `X`

Крок 5: І, нарешті, ми розділили рядок на основі цього списку, з'єднаємо його разом із c кількість пробілів, розділіть його на частини за розміром c, і приєднайтесь до них разом за новими рядками. Наприклад:

Рядок "Alongtesttoseeifitworksasintended."розділена в відповідності зі списком [15,2,2,35]призведе до: ["Alongtesttoseei","fi","tw","orksasintended."]. Потім до цього приєднуєтьсяc=5кількість пробілів до "Alongtesttoseei fi tw orksasintended.". А потім розділити на частини за розмірома=7до цього: ["Alongte","sttosee","i f","i t","w o","rksasin","tended."]. До якого потім приєднуються нові рядки для виведення.

    £              #   Then split the string into parts based on this list
     ®θð×          #   Push a string consisting of the last value of `®` amount of spaces
         ý         #   Join the list of substrings by this
          X        #   Push variable `X`
                 #  After the if-else: split the string into parts of that size
     »             #  And then join these by newlines
                   # (after which the top of the stack is output implicitly as result)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.