Ткання в 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 номерів у простому у використанні форматі (stdin, виклик функції тощо) та виводити ткану сітку з брусків та прямокутників у stdout. Ви можете припустити, що всі дані є дійсними. (Усі значення - цілі числа, ширина та висота повинні бути позитивними, початковий зсув може бути будь-яким.)

Приклади

ширина = 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

Пітон, 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
Вам слід скористатися будь-якою системою вхідного формату - зробіть вхідні значення комами відокремленими та зрівняйте їх.
isaacg

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;)? Той самий трюк для другого для-циклу? Хоча це економить лише один графік на цикл.
11684,

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

Дивно. Інакше? ++i? Це просто постріл у темряві, хоча.
11684,

Ніп; це збільшиться, перш ніж число навіть буде використано для порівняння, і ви закінчите ітерації h-1. Проблема з використанням ++ взагалі у другому розділі декларації для циклу полягає в тому, що я збільшується до того, як ви навіть використаєте його в циклі. Для вирішення проблеми із номером може знадобитися -1 десь у математиці, і це робить ярлик не вартим. Якщо тільки це неможливо зробити без цього -1. Я досі не можу це зрозуміти.
Несс

Звичайно! обличчя .
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.