Представьте, что прямоугольная сетка |
символов представляет собой натянутые нити на ткацком станке ( основы ), вокруг которых могут быть сплетены другие нити ( уток ), которые мы представим как -
.
Вот нетканая основа ткацкого станка 7 × 4:
|||||||
|||||||
|||||||
|||||||
Существует несколько способов вплетения утка в основу, самым простым из которых является простое переплетение .
В первом ряду простого плетения уток начинается над первой строкой основы, идет под второй строкой, затем над третьей строкой, затем под четвертой и т. Д.
Вторая уточная строка идентична первой, но смещена вправо на одну строку основы, поэтому она начинается под, затем переходит и так далее.
На нашем ткацком станке 7 × 4 простое плетение выглядит так:
-|-|-|-
|-|-|-|
-|-|-|-
|-|-|-|
Мы можем описать простое плетение, сказав, что уток проходит основную часть 1 раз, затем менее 1 раза, и каждая последующая строка сдвигается на 1 строку вправо.
Обобщенное плетение можно описать, если уток будет проходить через основу v раз, затем под u раз, причем каждый последующий ряд сдвигается на s строк вправо. (Все значения являются целыми числами, s может быть 0 или отрицательным, u и v должны быть неотрицательными.)
Ткацкий станок 7 × 4 с v = 1 , u = 2 , s = 2 , тип переплетения твила :
-||-||-
||-||-|
|-||-||
-||-||-
Вызов
Ваша задача состоит в том, чтобы написать самую короткую программу (в байтах), которая создает тканый узор из полос и штрихов, заданных v , u , s , шириной и высотой ткацкого станка и начальным смещением .
Начальное смещение является числом строк , первая строка в утке смещаются вправо (0 в вышеприведенных примерах). Каждая последующая строка сдвигается на s больше строк.
Ваша программа должна взять эти 6 чисел в удобном для использования формате (стандартный ввод, вызов функции и т. Д.) И вывести сетку из полос и прямоугольников в стандартный вывод. Вы можете предположить, что все данные верны. (Все значения целые, ширина и высота должны быть положительными, начальный сдвиг может быть любым.)
Примеры
ширина = 5, высота = 4, начальный сдвиг = 0, v = 1, u = 3, s = -2:
-|||-
||-||
-|||-
||-||
ширина = 5, высота = 4, начальный сдвиг = 3, v = 1, u = 3, s = -2:
|||-|
|-|||
|||-|
|-|||
ширина = 5, высота = 4, начальный сдвиг = 1, v = 1, u = 1, s = 0:
|-|-|
|-|-|
|-|-|
|-|-|
ширина = 5, высота = 4, начальный сдвиг = 0, v = 1, u = 0, s = 0:
-----
-----
-----
-----
Примечания
- Узор всегда начинается с утка поверх основы в верхнем левом углу сетки (если только он не был смещен).
- Все уточные нити входят слева. Они не спираль , как это .
- u + v не обязательно кратно ширине сетки.
- u и v не могут быть оба 0
%(u+v)
. В этом случае я только начинаю с индекса0
, поэтомуw
в строке остались символы.JavaScript (ES 6) 128
Тестовое задание
источник
Python, 92 байта
Хм ... Так хочется изучать рубин сейчас.
Ввод, назначая строковую переменную в следующем формате: «ширина, высота, начальный сдвиг, v, u, s».
Вставить перед программой:
источник
while h
. Я получаю дополнительный ряд.JavaScript (ES6), 111 байт
Немного другой подход ES6, использующий функционал Array.from.
f
принимает аргументы(w,h,i,v,u,s)
и возвращает строку. Новые строки добавлены в код и буквальные символы новой строки в строке заменены\n
на ясность; не отражается в количестве байтов.использование
Версия без объяснений
Я сохранил несколько байтов, создав псевдоним для Array, который не отражается в версии без заглядывания.
источник
C 357 байтов
«Это удобнее, чем кажется». «Это должно быть». - Гия и Эйдон (никто не получит эту ссылку. Подсказка: "Плетите Мэт")
Так что я работаю над этим около пяти часов, и я сдаюсь. Я понятия не имею, как заставить этот код работать. После первого ряда он продолжает двигаться в обратном направлении, а затем становится совершенно неправильным (7 4 0 2 2 1).
Вот более простая версия, которую вы можете прочитать легче. Все, что я делаю, это извлекаю ввод, создаю массив шаблонов, а затем печатаю внутри циклов
Вы можете легко проверить это здесь: http://www.compileonline.com/compile_c_online.php, используя «7 4 0 1 1 1» в поле ввода STDIN внизу. Начните редактировать цифры, и вы увидите проблемы.
Извините, я не смог найти рабочее решение; Я ненавижу себя за это. Я потратил слишком много времени, чтобы не загружать его, чтобы кто-то еще исправил.
Некоторое время я использовал этот printf для дальнейшего разделения верхней строки (легкой) на остальные (строки проблем):
printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);
источник
for(i=0;i++<h;)
? Тот же трюк для второго цикла for? Это сохраняет только один символ на цикл.++i
? Это всего лишь выстрел в темноте.Haskell, 126 байт
источник
f w h i v u s
на(w?h)i v u s
. Инфиксная функция