J, 62 байти
|."1@([:(#~[:-.[:*/"1' '=])|.@{:(}:@],{:@],[)|:@}:)^:(1<#)^:a:
Спробуйте в Інтернеті!
Я впевнений, що це можна багато в гольф. Це друкує додатковий пробіл, але тільки через те, що J форматує масиви, що містяться у виведеному масиві, мати однакову форму.
Я думаю, що коли я заходжу і прокоментую, що саме я роблю, я можу отримати краще уявлення про те, як це зробити в гольф (зробив це зараз, я не знаю насправді ...). Для цілей гольфу варто це зазначити
- Я маю спеціальне введення рядків 1 ряду (частина циклу час)
- Мені потрібно усунути всі рядки, що складаються виключно з пробілу (напевно, для цього повинен бути або вбудований, або кращий спосіб зробити це), який є фільтром наприкінці
- Є безліч шапок, функцій ідентичності та атопів
Пояснення
Якщо я скасую це, я розділяю основну функцію на три.
unfurl_reversed =. |.@{: (}:@] , {:@] , [) |:@}:
whitespace_filter =. #~ [: -. [: */"1 ' ' = ]
unfurl =. |."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:
test_case =. 3 3 $ 'GFEHIDABC'
Ми будемо працювати з другою тестовою справою.
undeurl_reversed
|.@{: (}:@] , {:@] , [) |:@}:
Це дає один рядок, розгорнутий один раз, але зворотно. Все це робиться в зворотному порядку і в певному порядку, так що спосіб J автоматично прошиває рядки з пробілами, щоб відповідати формі масиву, в якому вони знаходяться, дасть правильний інтервал.
|:@}: - це перенесення скорочення вводу
|:@}: test_case
GH
FI
ED
|.@{: - зворотний бік хвоста вводу
|.@{: test_case
CBA
Я думаю, ви можете побачити, що ми хочемо зробити: ми хочемо прикласти зворотний бік хвоста до останньої частини транспозиції згортки (це рот, але в основному прикріплюється CBAдо кінця ED). Це дасть нам один крок розгорнутого, зворотного.
(}:@],{:@],[) робить саме це.
Він приєднує CBAдо ED, потім приєднується , що з іншою частиною масиву. Таким чином, наш результат є
unfurl_reversed test_case
GH
FI
EDCBA
whitespace_filter
#~ [: -. [: */"1 ' ' = ]
' ' = ] Equate each element to space
*/"1 Product of each row (all true?)
-. Negate
#~ Filter rows that are true
В основному, це тестує, щоб перевірити, чи будь-який рядок повністю пробілом, і видаляє його, якщо він є. Це не робить нічого для першої ітерації тестового випадку.
Це необхідно (принаймні, поки я не знайду альтернативу), оскільки в іншому випадку ми зрештою будемо розгортати пробіли у вихідний рядок.
розкручуватися
|."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:
Unfurl в основному поєднує інші функції разом і окремі випадки введення символів.
Коли потужність verb ( ^:) задається порожнім полем ( a:), він застосовує функцію на вході, поки не конвергує та не збирає результати в масив.
(1 < #) перевіряє, що рядки завжди перевищують 1 (до спеціального випадку 1 рядок вводиться).
|."1обертає кожен рядок, тому він обертає результати whitespace_filter @: unfurl.
["A","A"]для цього"A", як це робить моя програма (замість["A"])? Мені здається розумним, оскільки вони є лише початковою і кінцевою позиціями, і ви намагаєтесь розкрутити її лише один раз.