Dệt trong ASCII


12

Hãy tưởng tượng một lưới các |ký tự hình chữ nhật đại diện cho các chuỗi taut trên khung dệt ( sợi dọc ) mà các sợi khác ( sợi ngang ), mà chúng ta sẽ đại diện là -, có thể được dệt xung quanh.

Đây là sợi dọc không dệt của khung dệt 7 × 4:

|||||||
|||||||
|||||||
|||||||

Có một số cách sợi ngang có thể được dệt thành sợi dọc, đơn giản nhất là dệt trơn .

Trong hàng đầu tiên của một sợi dệt đơn giản, sợi ngang bắt đầu bên trên chuỗi dọc thứ nhất, bên dưới chuỗi thứ hai, sau đó bên trên chuỗi thứ ba, sau đó bên dưới chuỗi thứ tư, v.v.

Hàng ngang thứ hai giống hệt với hàng thứ nhất nhưng được bù ở bên phải bằng một chuỗi dọc, do đó, nó bắt đầu bên dưới rồi đi qua, v.v.

Trên khung dệt 7 × 4 của chúng tôi, kiểu dệt trơn trông như thế này:

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

Chúng ta có thể mô tả kiểu dệt đơn giản bằng cách nói rằng sợi ngang đi qua sợi dọc 1 lần, sau đó dưới 1 lần và mỗi hàng tiếp theo được dịch chuyển 1 chuỗi sang phải.

Một kiểu dệt tổng quát có thể được mô tả bằng cách đưa sợi ngang đi qua v lần v lần, sau đó dưới thời gian u , với mỗi hàng tiếp theo được dịch chuyển bởi các chuỗi s sang phải. (Tất cả các giá trị là số nguyên, s có thể là 0 hoặc âm, uv phải không âm.)

Một khung dệt 7 × 4 với v = 1 , u = 2 , s = 2 , một kiểu dệt chéo :

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

Thử thách

Nhiệm vụ của bạn là viết chương trình ngắn nhất (tính bằng byte) tạo ra một kiểu dệt các thanh và dấu gạch ngang cho v , u , s , chiều rộng và chiều cao của khung dệt và dịch chuyển ban đầu .

Sự thay đổi ban đầu là số chuỗi mà hàng đầu tiên trong sợi ngang được dịch sang phải (0 trong các ví dụ ở trên). Mỗi hàng tiếp theo được chuyển bởi s xâu hơn.

Chương trình của bạn sẽ nhận 6 số này ở một số định dạng dễ sử dụng (stdin, gọi hàm, v.v.) và xuất lưới dệt của các thanh và hình chữ nhật thành thiết bị xuất chuẩn. Bạn có thể cho rằng tất cả các đầu vào là hợp lệ. (Tất cả các giá trị là số nguyên, chiều rộng và chiều cao phải dương, sự thay đổi ban đầu có thể là bất cứ điều gì.)

Ví dụ

width = 5, height = 4, shift ban đầu = 0, v = 1, u = 3, s = -2:

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

width = 5, height = 4, shift ban đầu = 3, v = 1, u = 3, s = -2:

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

width = 5, height = 4, shift ban đầu = 1, v = 1, u = 1, s = 0:

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

width = 5, height = 4, shift ban đầu = 0, v = 1, u = 0, s = 0:

-----
-----
-----
-----

Ghi chú

  • Mẫu luôn bắt đầu với sợi ngang trên sợi dọc ở góc trên cùng bên trái của lưới (trừ khi thay đổi ban đầu).
  • Tất cả các sợi ngang đến từ bên trái. Họ không xoắn ốc như thế này .
  • u + v không nhất thiết là bội số của chiều rộng lưới.
  • uv có thể không phải là 0

Câu trả lời:


5

Ruby, 72 byte

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

Không có nhiều điều để nói về điều này. Tôi xây dựng một lần lặp lại -|, lặp lại wlần đó (chỉ để chắc chắn) và tôi cắt ra phần thích hợp cho mỗi dòng.


Khi u + v == 1, w có đủ lần không?
edc65

@ edc65 có, vì %(u+v). Trong trường hợp này, tôi chỉ bắt đầu ở chỉ mục 0, vì vậy tôi có các wký tự còn lại trong chuỗi.
Martin Ender

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

Kiểm tra

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

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

2

Python, 92 byte

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

Hmm ... Rất muốn học ruby ​​ngay bây giờ.

Nhập bằng cách chỉ định một biến chuỗi trong định dạng này: "chiều rộng, chiều cao, dịch chuyển ban đầu, v, u, s".
Dán trước chương trình:

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

1
Tôi tin rằng nó nên được while h. Tôi đang nhận thêm một hàng.
Sở thích của Calvin

1
Bạn nên sử dụng bất kỳ hệ thống định dạng đầu vào nào - làm cho các giá trị đầu vào được phân tách bằng dấu phẩy và đánh giá nó.
isaacg

1

JavaScript (ES6), 111 byte

Một cách tiếp cận ES6 hơi khác, sử dụng Array.from chức năng.

fnhận đối số (w,h,i,v,u,s)và trả về một chuỗi. Các dòng mới được thêm vào mã và dòng mới theo nghĩa đen trong chuỗi được thay thế bằng \ncho rõ ràng; không được phản ánh trong số byte.

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`

Sử dụng

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

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

*/

Phiên bản Ungolfed với lời giải thích

Tôi đã lưu một số byte bằng cách tạo bí danh cho Array, không được phản ánh trong phiên bản không được chỉnh sửa.

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

#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;}}

"Nó thoải mái hơn vẻ ngoài của nó." "Nó sẽ phải như vậy." - Gia và Eidon (Không ai có được tài liệu tham khảo này. Gợi ý: "Dệt Mat")

Vì vậy, tôi đã làm việc liên tục trong khoảng năm giờ và tôi bỏ cuộc. Tôi không biết làm thế nào để có được mã này để làm việc. Nó tiếp tục đi lùi sau hàng đầu tiên và sau đó hoàn toàn sai (7 4 0 2 2 1).

Đây là phiên bản đơn giản hơn bạn có thể đọc dễ dàng hơn. Tất cả những gì tôi làm là lấy dữ liệu đầu vào, tạo mảng mẫu và sau đó in trong các vòng lặp.

#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;
    }
}

Bạn có thể dễ dàng kiểm tra nó tại đây: http://www.compileonline.com/compile_c_online.php bằng cách sử dụng "7 4 0 1 1 1" trong hộp Nhập STDIN ở phía dưới. Bắt đầu chỉnh sửa các con số và bạn sẽ thấy các vấn đề.

Xin lỗi tôi không thể đưa ra một giải pháp làm việc; Tôi ghét bản thân mình vì điều này. Tôi đã dành quá nhiều thời gian để không tải nó lên để nhờ người khác sửa chữa.

Tôi đã sử dụng printf này một thời gian để phân tách hàng trên cùng (dễ dàng) với phần còn lại của chúng (các hàng có vấn đề): printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);


for(i=0;i++<h;)? Cùng một mẹo cho vòng lặp thứ hai? Nó chỉ tiết kiệm một char mỗi vòng lặp.
11684

Tôi đã thử điều đó một vài lần, nhưng điều đó làm cho các con số tắt và tôi không thể tìm ra cách sử dụng chúng.
Ness

Lạ thật. Cách khác xung quanh? ++i? Đó chỉ là một phát súng trong bóng tối.
11684

Không; sẽ tăng lên trước khi số thậm chí được sử dụng để so sánh và bạn sẽ kết thúc với các lần lặp h-1. Vấn đề với việc sử dụng ++ trong phần thứ hai của khai báo vòng lặp for là tôi được tăng lên trước khi bạn sử dụng nó trong vòng lặp. Đối phó với số tắt có thể yêu cầu -1 ở đâu đó trong toán học và điều đó làm cho phím tắt không có giá trị. Trừ khi điều này là có thể làm được mà không có -1. Tôi vẫn không thể tìm ra nó.
Ness

Tất nhiên! khẩu trang .
11684

0

Haskell, 126 byte

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
Một sân golf tầm thường sẽ được thay đổi f w h i v u scho (w?h)i v u s. Một chức năng infix
H.PWiz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.