Плетение в ASCII


12

Представьте, что прямоугольная сетка |символов представляет собой натянутые нити на ткацком станке ( основы ), вокруг которых могут быть сплетены другие нити ( уток ), которые мы представим как -.

Вот нетканая основа ткацкого станка 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

Ответы:


5

Рубин, 72 байта

w,h,v,u,s,i=$*.map &:to_i;h.times{puts ((?-*v+?|*u)*w)[-i%(u+v),w];i+=s}

Не так много, чтобы сказать об этом. Я строю одно повторение -и |повторяю его wраз (просто чтобы быть уверенным), и я вырезаю соответствующий раздел для каждой строки.


Когда u + v == 1, достаточно ли w раз?
edc65

@ edc65 да, из-за %(u+v). В этом случае я только начинаю с индекса 0, поэтому wв строке остались символы.
Мартин Эндер

3

JavaScript (ES 6) 128

F=(w,h,i,v,u,s)=>{for(x=('-'[R='repeat'](v)+'|'[R](u))[R](w*h),l=v+u,i=-i%l+l,s=-s%l+l;h--;i+=s)console.log(x.substr(i,w)+'\n')}

Тестовое задание

F(11,8,2,5,3,-2)

||-----|||-
-----|||---
---|||-----
-|||-----||
||-----|||-
-----|||---
---|||-----
-|||-----||

2

Python, 92 байта

w,h,i,v,u,s=eval(A)
x=('|'*u+'-'*v)*w
while h:print(x[-i:]+x[:-i])[-w:];x=x[-s:]+x[:-s];h-=1

Хм ... Так хочется изучать рубин сейчас.

Ввод, назначая строковую переменную в следующем формате: «ширина, высота, начальный сдвиг, v, u, s».
Вставить перед программой:

A="80,80,0,2,2,-9"

1
Я верю, что так и должно быть while h. Я получаю дополнительный ряд.
Увлечения Кэлвина

1
Вы должны использовать систему ввода любого формата - разделите входные значения запятыми и оцените их.
Исаак

1

JavaScript (ES6), 111 байт

Немного другой подход ES6, использующий функционал Array.from.

fпринимает аргументы (w,h,i,v,u,s)и возвращает строку. Новые строки добавлены в код и буквальные символы новой строки в строке заменены \nна ясность; не отражается в количестве байтов.

f=(w,h,i,v,u,s)=>(A=Array).from(A(h),(_,j)=>A.from(A(w),
(_,k)=>(j*((x=v+u)-s)+x+k-i)%x<v?'-':'|').join``).join`\n`

использование

console.log(f(5,4,0,1,3,-2)) /*

-|||-
||-||
-|||-
||-||

*/

Версия без объяснений

Я сохранил несколько байтов, создав псевдоним для Array, который не отражается в версии без заглядывания.

// take input and create an array of length h (height):
f = (w,h,i,v,u,s) => Array.from( Array(h),

    // in each row position j, create an array of length w (width):
    (_,j) => Array.from( Array(w), 

        // in each cell, place - or | depending on the pattern (i,v,u,s)
        // and current position (j,k):
        (_,k) => ( j * ( ( x = v + u ) - s ) + x + k - i ) % x < v ? '-' : '|'

    // turn each row into a string:
    ).join``

// join rows with newlines:
).join`\n`

0

C 357 байтов

#include<stdio.h>
int w,h,t,v,u,s,i,j,l,f;int main(){scanf("%d %d %d %d %d %d",&w,&h,&t,&v,&u,&s);l=v+u;char g[l];g[l]='\0';f=0;while(u--){g[v+u]='|';}while(v--){g[v]='-';}for(i=0;i<h;i++){for(j=0;j<w;j++){printf("%c",g[abs(t+f+j)%l]);}printf("\n");f-=s;}}

«Это удобнее, чем кажется». «Это должно быть». - Гия и Эйдон (никто не получит эту ссылку. Подсказка: "Плетите Мэт")

Так что я работаю над этим около пяти часов, и я сдаюсь. Я понятия не имею, как заставить этот код работать. После первого ряда он продолжает двигаться в обратном направлении, а затем становится совершенно неправильным (7 4 0 2 2 1).

Вот более простая версия, которую вы можете прочитать легче. Все, что я делаю, это извлекаю ввод, создаю массив шаблонов, а затем печатаю внутри циклов

#include<stdio.h>
int w,h,t,v,u,s,i,j,l,f;
int main(){
    scanf("%d %d %d %d %d %d",&w,&h,&t,&v,&u,&s);
    l=v+u;char g[l];g[l]='\0';f=0;
    while(u--){g[v+u]='|';}while(v--){g[v]='-';}
    for(i=0;i<h;i++){
        for(j=0;j<w;j++){
            printf("%c",g[abs(t+f+j)%l]); // THIS is the line that needs help.
        }
        printf("\n");
        f-=s;
    }
}

Вы можете легко проверить это здесь: 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? Это сохраняет только один символ на цикл.
11684

Я пробовал это несколько раз, но это сводило цифры, и я не мог найти способ их использовать.
Несс

Странный. Другой способ? ++i? Это всего лишь выстрел в темноте.
11684

Нет; оно будет увеличиваться до того, как число будет использовано для сравнения, и вы получите h-1 итераций. Проблема с использованием вообще ++ во втором разделе объявления цикла for заключается в том, что я увеличивается до того, как вы даже используете его в цикле. Работа с отключенным номером может потребовать -1 где-то в математике, и это делает ярлык не стоящим. Если это не выполнимо без этого -1. Я до сих пор не могу понять это.
Несс

Конечно! Facepalm .
11684

0

Haskell, 126 байт

f w h i v u s=putStr.unlines$take h$take w<$>(iterate(drop(mod s(u+v)))$drop(mod(-i)(u+v)).cycle$('-'<$[1..v])++('|'<$[1..u]))

1
Тривиальный гольф будет меняться f w h i v u sна (w?h)i v u s. Инфиксная функция
H.PWiz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.