J, 62 байта
|."1@([:(#~[:-.[:*/"1' '=])|.@{:(}:@],{:@],[)|:@}:)^:(1<#)^:a:
Попробуйте онлайн!
Я уверен, что это может быть много в гольфе. Это печатает лишние пробелы, но только из-за способа, которым J форматирует массивы, содержащиеся в выведенном массиве, чтобы иметь одинаковую форму.
Я думаю, что как только я пойду и прокомментирую, что именно я делаю, у меня может появиться лучшее представление о том, как играть в гольф (сделав это сейчас, я не знаю ...). В целях игры в гольф стоит отметить, что
- У меня есть особый случай 1 строки ввода (в то время как часть цикла)
- Я должен исключить все строки, состоящие исключительно из пробелов (конечно, для этого должен быть или встроенный или лучший способ сделать это), который является фильтром в конце
- Есть много заглавных букв, функций идентичности и atops.
объяснение
Разгадывая это, я разделю основную функцию на три части.
unfurl_reversed =. |.@{: (}:@] , {:@] , [) |:@}:
whitespace_filter =. #~ [: -. [: */"1 ' ' = ]
unfurl =. |."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:
test_case =. 3 3 $ 'GFEHIDABC'
Мы будем работать со вторым тестовым примером.
unfurl_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 в основном объединяет другие функции и особые случаи односимвольных вводов.
Когда сила глагола ( ^:
) получает пустое поле ( a:
), он применяет функцию к входу, пока не сойдется и не соберет результаты в массив.
(1 < #)
проверяет, что строки всегда больше 1 (для особых случаев 1 для ввода строки).
|."1
инвертирует каждую строку, поэтому инвертирует результаты whitespace_filter @: unfurl
.
["A","A"]
для"A"
, как и моя программа (вместо["A"]
)? Это кажется мне разумным, поскольку они являются лишь начальной и конечной позициями, и вы пытаетесь развернуть его только один раз.