Этот вопрос вдохновлен вопросом Кевина Круйссена .
Теперь, когда ковер разложен, мы хотим его свернуть. Ваша задача - написать программу, которая принимает строку и возвращает спираль, сделанную из этой строки (представляющую собой свернутый ковер, если смотреть со стороны).
Процедура одного шага раскатывания ковра заключается в следующем. Есть пример, чтобы проиллюстрировать, что я имею в виду. Обратите внимание, что пример начинается с частично свернутого ковра для лучшего понимания:
ac
rpet
- отделите «голову» от «хвоста» ковра: голова - это то, что было свернуто до сих пор, хвост - это то, что остается катиться.
Head: ac Tail:
rp et
- Поверните головку на 90 ° по часовой стрелке.
Rotated head: ra Tail (unchanged):
pc et
- если ширина новой головы (здесь
2
) меньше или равна длине хвоста (здесь2
)- затем положить его на хвост
- иначе, ковер (как это было в начале шага) был свернут
New carpet: ra
pc
et
Повторите процедуру столько раз, сколько необходимо.
Два примера, показывающие все этапы ковроткачества:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Некоторые точности:
- Вам не нужно показывать все промежуточные шаги, только свернутый ковер (например, если вы найдете не итеративный способ вычисления результата, он идеален). Кроме того, вам не нужно печатать начальные пробелы, в приведенных выше примерах я только показываю их для выравнивания.
- Ввод - это строка, список / массив символов
- Вывод выводится на стандартный вывод или в файл.
- Входные данные хороши: длина по крайней мере 1 символ, и максимум константа достаточно мала, чтобы не вызывать проблем, но вы не можете использовать эту константу в своей программе; содержимое строки - только хорошие символы ([a-zA-Z0-9]), кодирование по вашему усмотрению.
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах. Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также добавьте пояснение к своему ответу, если считаете, что это необходимо.
ProgrammingPuzzlesAndCodeGolf
- конечная длина хвоста больше 1 споткнула меня.print
внутри alambda
.Ответы:
Древесный уголь , 15 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Зациклиться на ковре.
Проверьте, есть ли что-нибудь над курсором.
Если нет, тогда катите ковер.
Двигайтесь вправо и выводите текущий символ.
Пример: для ввода
0123456789
выполняются следующие действия:0
печатается.Курсор перемещается вправо и
1
печатается.Поскольку нет ничего выше
1
, холст вращается.Курсор перемещается вправо и
2
печатается.Поскольку нет ничего выше
2
, холст вращается.Курсор перемещается вправо и
3
печатается.Курсор перемещается вправо и
4
печатается.Поскольку нет ничего выше
4
, холст вращается.Курсор перемещается вправо и
5
печатается.Курсор перемещается вправо и
6
печатается.Поскольку нет ничего выше
6
, холст вращается.Курсор перемещается вправо и
7
печатается.Курсор перемещается вправо и
8
печатается.Курсор перемещается вправо и
9
печатается.источник
⟲
?Pyth, 37 байт
Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
источник
Шелуха , 24 байта
Попробуйте онлайн!
объяснение
источник
J 69 байт
-3 байта благодаря FrownyFrog
Попробуйте онлайн!
объяснение
Алгоритм прост, несмотря на то, что он немного многословен для J.
Общая стратегия: уменьшите входные данные до квадратного стола с помощью (возможно, пустого) остатка.
По мере сокращения мы будем использовать список из 2 элементов. Наш «результат до сих пор» будет первым блоком, а «элементы, оставшиеся для обработки» - вторым блоком. Первое поле будет инициализировано для заголовка ввода (но преобразовано в таблицу):
и «элементы, оставшиеся для обработки» будут хвостом ввода:
Теперь у нас есть:
где 'c' на самом деле является таблицей 1x1.
Мы уменьшаем это, используя цикл J Do ... while:
Где часть в круглых скобках является условием "продолжать идти":
который говорит: «продолжайте идти, пока длина правого прямоугольника больше или равна длине левого прямоугольника (то есть длина стороны квадратной матрицы)
Что значит "продолжать идти"? Это определено в глаголе слева от первого
^:
, который говорит нам, как взять текущий результат и произвести следующую итерацию. Этот глагол:Давайте разберемся с этим:
То есть это просто алгоритм, описанный в ОП, переведенный буквально на J.
Наконец, мы имеем дело с (возможно, 0) оставшимися предметами, хвостом нашего рулона ковра:
Это говорит «возьми все, кроме последнего вяза результата»:
и добавить его к
,
последним элементам результата{:@[
с оставшимися элементами, добавленными к этому последнему элементу, ]
источник
,.
может делать то, что1 1$]
делает и$
может быть использован как{.
.$ can be used as {.
- вы можете уточнить?R ,
146132 байтПопробуйте онлайн!
Реализует процедуру ковролинга. Принимает ввод как список символов и печатает на стандартный вывод.
Сэкономили 14 байтов, найдя способ использовать
do-while
цикл и инициализировав егоF
.источник
Желе , 30 байт
Кажется слишком долго ...
Попробуйте онлайн!
Как?
источник
05AB1E , 41 байт
Слишком долго, но я хотел использовать Canvas .. Что, вероятно, было плохим выбором, когда я закончил, и оказалось, что это так долго ...
Попробуйте онлайн . (Нет тестового набора, потому что, кажется, есть странная проблема со
.Λ
встроенным ..)Объяснение:
Позвольте мне начать с общего объяснения Canvas и того, чего я хотел, чтобы мой код выполнял. Более подробную информацию можно найти в этой соответствующей статье 05AB1E , но для этой задачи я хотел сделать следующее:
Встроенная Canvas принимает три параметра:
[2,2,3,3,4,4,5,5,...]
carpet
0123456789ABCDEFGHI
Что касается кода:
Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа? ), Чтобы понять, почему
Ž8O
это так2064
.источник
Python 3 , 112 байт
В этом случае выводом является значение функции.
Попробуйте онлайн!
Если вы предпочитаете, вот другое (более длинное, 129 байт ) решение, которое печатает непосредственно свернутый ввод:
Попробуйте онлайн!
источник
MATLAB / Octave , 154 байта
Не самый короткий, но играть в гольф в MATLAB / Octave всегда весело :)
Попробуйте онлайн!
источник
disp
это, я бы сказал , что вы должны удалить ,disp
чтобы люди , которые не знают R , что делает запись в STDOUT по умолчанию