Codegolf — Плетение В Ascii

  • Автор темы Алексей Юзвиков
  • Обновлено
  • 22, Oct 2024
  • #1

Представьте себе прямоугольную сетку

 
 
 
 
 
 
 -----
-----
-----
-----
 
characters represents the taut strings on a loom (the warp) that other threads (уток), которую мы представим как |-|-| |-|-| |-|-| |-|-| , can be woven around.

Вот нетканая основа ткацкого станка 7×4:

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

Существует несколько способов вплетения утка в основу, самый простой из которых — полотняное переплетение.

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

Второй уточный ряд идентичен первому, но смещен вправо на одну нить основы, поэтому он начинается снизу, затем переходит вверх и так далее.

На нашем ткацком станке 7×4 полотняное переплетение выглядит так:

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

Мы можем описать полотняное переплетение, сказав, что уток проходит по основе. 1 время, то под 1 время, и каждая последующая строка сдвигается 1 строка вправо.

Обобщенное переплетение можно описать, если уток проходит по основе. в раз, то под ты раз, причем каждая последующая строка сдвигается на с струны вправо. (Все значения являются целыми числами, с может быть 0 или отрицательным, ты и в должно быть неотрицательным.)

Ткацкий станок 7×4 с в = 1, ты = 2, с = 2, тип саржевое переплетение:

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

Испытание

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

начальная смена — количество нитей, на которые первый ряд в утке сдвинут вправо (0 в примерах выше). Каждая последующая строка сдвигается на с больше строк.

Ваша программа должна принять эти 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:

|

Примечания

  • Рисунок всегда начинается с утка над основой в верхнем левом углу сетки (если изначально он не был смещен).
  • Все уточные нити идут слева. Они не спиральный этот.
  • ты + в не обязательно кратно ширине сетки.
  • ты и в оба не могут быть 0

#код-гольф #ascii-art

Алексей Юзвиков


Рег
28 Oct, 2020

Тем
98

Постов
201

Баллов
711
  • 26, Oct 2024
  • #2

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

 
 
 
 
 
 
 
 
 
 
 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]))
 

Об этом особо нечего сказать. Я строю одно повторение printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]); and #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; } } , повтори это #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;}} times (just to be sure), and the I slice out the appropriate section for each line.

 

Gitlyt


Рег
12 Oct, 2010

Тем
69

Постов
204

Баллов
579
  • 26, Oct 2024
  • #3

JavaScript (ES 6) 128

// 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`

Тест

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

Питон, 92 байта

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`

Хм... Так хочется сейчас выучить Ruby.

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

\n ||answer||

JavaScript (ES6), 111 байт

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

(w,h,i,v,u,s) takes arguments f и возвращает строку. В код добавлены новые строки, а буквальная новая строка в строке заменена на A="80,80,0,2,2,-9" for clarity; neither reflected in byte count.

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

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

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

Ungolfed версия с объяснением

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

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')} ||answer||

С, 357 байт

w

«Это удобнее, чем кажется». «Так и должно быть». -- Джиа и Эйдон (Никто не увидит эту отсылку. Подсказка: «Плетение коврика»)

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

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

|

Вы можете легко протестировать это здесь: http://www.compileonline.com/compile_c_online.php используя «7 4 0 1 1 1» в поле ввода STDIN внизу. Начните редактировать цифры, и вы увидите проблемы.

Извините, я не смог найти рабочего решения; Я ненавижу себя за это. Я потратил слишком много времени, чтобы не загрузить его, чтобы кто-то другой исправил.

Я использовал этот printf некоторое время, чтобы дополнительно отделить верхнюю строку (просто) от остальных (проблемные строки): -

 

Doctoruie


Рег
04 Dec, 2004

Тем
72

Постов
199

Баллов
629
  • 26, Oct 2024
  • #4

Хаскель, 126 байт

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

Rossie80


Рег
05 Sep, 2011

Тем
69

Постов
196

Баллов
571
Тем
403,760
Комментарии
400,028
Опыт
2,418,908