описание проблемы
Представьте, что вы черепаха на сетке. Вам даны два числа f и b , и вы смотрите на восток. Вы выполняете марш по сетке, подсчитывая каждую из встречающихся ячеек в соответствии со следующими правилами:
- По умолчанию вы записываете счетчик в ячейку, в которой находитесь, а затем идете вперед.
- Если счет делится на f , вы пишете
F
в ячейку, в которой находитесь, затем поворачиваете направо и идете вперед. - Если счет делится на b , вы пишете
B
в ячейку, в которой находитесь, затем поворачиваете налево и идете вперед. - Если число делится на f и b , вы пишете
FB
в ячейку, в которой находитесь, а затем идете вперед. - Если вы дойдете до площади, на которой уже побывали, остановитесь.
Например, следование этим правилам с использованием f = 3 и b = 5 сгенерирует шаблон, подобный следующему:
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
Соревнование
Напишите программу или функцию, которая принимает два числа в качестве входных данных, соответствующих f и b , и создает в качестве выходных данных шаблон для этих чисел, заданный правилами выше.
Требования к форматированию:
- Каждая ячейка имеет два символа в ширину
- Содержимое ячейки выровнено по правому краю внутри этих двух символов
- Клетки в одном ряду разделяются пробелом
- Первый столбец ячеек должен содержать непустую ячейку
- Все строки должны содержать непустые ячейки
- Конечный пробел не обязателен, но разрешен
- Однако общая ширина каждой строки не должна превышать в 3 раза количество непустых столбцов.
Ваш код должен работать для предоставленных тестовых случаев.
Стандартные лазейки запрещены.
Это код гольф; кратчайший ответ в байтах побеждает.
Контрольные примеры
(случай f = 3, b = 5 повторен здесь для удобства).
f=3, b=5 ->
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
f=4, b=10 ->
F 25 26 27 F
23 29
22 1 2 3 F
21 5
FB 6
19 7
18 B 9 F
17 11
F 15 14 13 F
f=3, b=11 ->
F 16 17 F
14 19
13 1 2 F
F B 4
10 5
F 8 7 F
f=5, b=9 ->
F 41 42 43 44 1 2 3 4 F
39 6
38 7
37 8
F B B F
34 11
33 12
32 13
31 14
F 29 28 B B 17 16 F
26 19
F 24 23 22 21 F
f=5, b=13 ->
F 31 32 33 34 F
29 36
28 1 2 3 4 F
27 6
F B 7
24 8
23 9
22 B 12 11 F
21 14
F 19 18 17 16 F
Ответы:
JavaScript (ES6), 230
240Меньше гольфа
Тест
источник
Python 2,
379338326 байтВводит в виде двух чисел, разделенных запятой. Например.
4,5
или(4,5)
Версия, которая работает, если путь длиннее 99,
384343330 байтПоказывает 2 значащие цифры.
Примеры:
input=(4,16)
input=(6,7)
(усеченная версия)@ Редакция: Спасибо Джонатану Аллану, Копперу и Шоки за то, что они сэкономили мне кучу байтов.
источник
while((x,y)not in p.keys()):
наwhile(x,y)not in p:
иfor x,y in p.keys():
наfor x,y in p
. Вы можете изменитьl,r=i%b==0,i%f==0
наl,r=i%b<1,i%f<1
иd=(d+[0,1][r]-[0,1][l])%4
наd=(d+r-l)%4
. Вы можете изменитьs=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=s
наp[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2)
. Там может быть большеh*[' ']for x in range
вместо[' ']*h for x in range
. Кроме того,x+=[-1,1][d==1]
может быть заменен наx+=(d==1)*2-1
, иy+=[1,-1][d==2]
может быть заменен наy+=(d!=2)*2-1
. Кроме того,f,b=inputtt
это опечатка?p[(x,y)]
=>p[x,y]
(хотя не уверен, работает ли он в Python 2)Excel VBA,
347421 байтНовая версия, чтобы справиться с пробелами-требованиями. Отсутствие этого в моей первой версии было упущением с моей стороны, но это сказывается на количестве пользователей ... Теперь он вырезает и вставляет использованный диапазон в ячейку
A1
.Вот старая версия, которая не перенесла конечный результат в
A1
Начинается с 70, 70 (или BR70 в Excel) и обходит его. Функция вызывается с
f
иb
как:Call t(4, 16)
@ Нил только что спас мне кучу байтов, спасибо!
источник
q=q-1
наq=q+3
иSelect Case q
с,Select Case q Mod 4
то вы можете избавиться от предыдущих двух утверждений.However, the total width of each row must not exceed 3 times the number of non-empty columns
Я думаю, что это было добавлено, чтобы избежать просто настройки большой сетки и начать немного далеко от границыExcel VBA,
284278277261259255254253251 байтSub
подпрограмма , которая принимает входной сигнал в виде значений,F
,B
и выходы к клеткам наSheets(1)
объект (который ограничиваетсяSheets(1)
объекта , чтобы сохранить 2 байта)Использование:
источник
C 349 байт
Компилируется с помощью gcc (с большим количеством предупреждений)
Немного более отступ версия:
Вот 364-байтовая версия, которая обрабатывает числа больше 100
источник
Perl, 275 байт
Отступы предназначены для удобства чтения и не являются частью кода.
Объяснение:
Код работает, отслеживая хеш всех мест, в которых была сохранена черепаха, и соответствующее значение
%m
. Например: in3 5
,$m{0,2}
содержит2
и$m{1,-3}
=26
. Это продолжается таким образом, пока не достигнет места, которое уже было определено. Кроме того, он отслеживает текущие границы пути черепахи, используя в$a,$b,$c,$d
качестве максимумов и минимумов.Как только он достигает места, где он уже был, он печатает путь, используя границы, все заполнено пробелами.
Нет ограничений ни по размеру пути, ни по размеру чисел.
источник
PHP , 292 байта
Попробуйте онлайн!
Отступы для ясности не учитываются.
Следует по тому же алгоритму, что и ответ Perl. Отслеживайте, где черепаха была в 2D-массиве,
$a
отслеживайте, где черепаха обращена, и$u, $d, $l, $r
отслеживайте границы для печати.str_pad
позволяет нам гарантировать, что каждая запись имеет ширину ровно 3 пробела для форматирования печати.По какой-то причине я не могу понять, PHP не возражает против того, чтобы я не инициализировал половину переменных до 0, но искажает форматирование, если я не инициализирую другие, даже если он обычно обрабатывает неинициализированные переменные как 0, когда они первые используемый. Отсюда и
$x=$y=$u=$l=0
немного.источник
Python 2 ,
267262258249245243 байтаПопробуйте онлайн!
источник