Если вы возьмете лист миллиметровки и нарисуете наклонную линию, которая идет m
единицами вправо и n
единицами вверх, вы пересекаете n-1
горизонтальную и m-1
вертикальную линии сетки в некоторой последовательности. Напишите код для вывода этой последовательности.
Например, m=5
и n=3
дает:
Возможно , связанные с : Генерация евклидово ритмы , разбиений Фибоначчи , FizzBuzz
Входные данные: два натуральных числа, m,n
которые являются относительно простыми
Вывод: возврат или печать пересечений в виде последовательности двух разных токенов. Например, это может быть строка H
и V
, список True
и False
, или 0
«s и 1
» ы печатаются на отдельных строках. Между токенами может быть разделитель, если он всегда один и тот же, а не, скажем, переменное число пробелов.
Тестовые случаи:
Первый тестовый пример дает пустой вывод или не выводит.
1 1
1 2 H
2 1 V
1 3 HH
3 2 VHV
3 5 HVHHVH
5 3 VHVVHV
10 3 VVVHVVVHVVV
4 11 HHVHHHVHHHVHH
19 17 VHVHVHVHVHVHVHVHVVHVHVHVHVHVHVHVHV
39 100 HHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
В формате (m,n,output_as_list_of_0s_and_1s)
:
(1, 1, [])
(1, 2, [0])
(2, 1, [1])
(1, 3, [0, 0])
(3, 2, [1, 0, 1])
(3, 5, [0, 1, 0, 0, 1, 0])
(5, 3, [1, 0, 1, 1, 0, 1])
(10, 3, [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
(4, 11, [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0])
(19, 17, [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
(39, 100, [0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0])
Ответы:
Руби, 92; Страус 0.7.0 , 38
Вывод для них обоих использует 1 и 0 (например
101101
).Вот объяснение страуса:
И объяснение того, как все это работает, используя код Ruby в качестве руководства:
источник
Python, 53
Это использует вывод списка True / False. Здесь нет ничего особенного.
источник
Pyth -
3224 байтаПринимает ввод через стандартный ввод в формате
[m,n]
. Выводит результат в стандартный вывод в виде списка 0 и 1, где 0 = V и 1 = H.Протестируйте это онлайн
Объяснение:
источник
eM
так же, какmed
.@"VH"
так как вам разрешено печатать,0
а1
неV
иH
.J
. Вот то, что я имею до сих пор в 25 байтах: pyth.herokuapp.com/…jk
как вывод может быть список.Машинный код IA-32, 26 байтов
Hexdump кода:
Я начал со следующего кода C:
Он записывает вывод в предоставленный буфер. Он не возвращает длину вывода, но это на самом деле не нужно: длина вывода всегда
m + n - 2
:Чтобы преобразовать код C в машинный код, я сначала сделал некоторые настройки, чтобы одна из
if/else
веток была пустой, и сравнил0
вместоn
:Отсюда написание встроенного ассемблера просто:
источник
t
это «расстояние доbuzz
». Если расстояние хотя быn
, идиfizz
, а идиbuzz
; обновить расстояние; повторять, пока не будет 0.Python - 125 байт
Использует очень простой алгоритм, просто увеличивает координаты и определяет, когда он пересекает линии и печатает. Ищу перевести на Pyth.
Это время цикла проверяет количество
l
ines, а затем проверяет, перешло ли какое-либо из значений за границу int путем вычитания.Принимает ввод как
39, 100
из стандартного ввода и печатает какHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHHHVHHVHHHVHHVHHHVHHVHHHVHH
вывод в одну строку.источник
CJam, 15 байтов
Попробуй это здесь.
Он печатает
01
для V и10
для H.объяснение
Диагональная линия пересекает горизонтальную линию для каждого 1 / n всей диагональной линии и пересекает вертикальную линию для каждого 1 / м.
источник
TI-BASIC, 32
Непосредственная. Использует последовательность
0
и1
, разделенных переносами строк. Преимуществами TI-BASIC являются двухбайтовоеgcd(
и подразумеваемое умножение, но его недостатками являются цикл For, включающий конечное значение и 5 байтов, затраченных на ввод.источник
Python, 47
Как и в алгоритме Анатолия , но проверяется непосредственно с помощью модулей.
источник
Haskell, 78 байт
Пример использования:
Как это работает: составьте список значений x всех вертикальных пересечений
(x,0)
дляx
в [1,2, ..., m-1] (0
указывает на вертикаль) и добавьте список значений x всех горизонтальных пересечений(y*m/n,1)
дляy
в [1,2, ..., n-1] (1
указывает на горизонтальность). Сортируйте и извлекайте вторые элементы из пар.Проклятие дня: опять же я должен потратить 17 байтов,
import
потому что онsort
есть,Data.List
а не в стандартной библиотеке.источник
KDB (Q), 44 байта
объяснение
Найти все значения оси X точек пересечения и отсортировать их. Если mod 1 равен нулю, его «V», ненулевое значение «H».
Тестовое задание
источник
CJam,
2624 байтаПопробуйте онлайн
Очень простая, в значительной степени прямая реализация алгоритма типа Брезенхэма.
Объяснение:
Последнее
01
нужно вытолкнуть, потому что цикл прошел весь путь до конечной точки, что не является частью желаемого результата. Обратите внимание, что мы не можем просто уменьшить количество циклов на 1. В противном случаеN > M
все0
s из последней итерации будут отсутствовать, а нам нужно только избавиться от самой последней0
.источник
>
для;W<
.1
верхняя часть стека, я мог бы также использовать его продуктивно.