Menenun di ASCII

12

Bayangkan sebuah kotak |karakter berbentuk persegi panjang yang mewakili string kencang pada alat tenun ( lungsin ) yang dijalin dengan benang lain (benang pakan ), yang akan kita wakili -.

Berikut ini adalah lilitan tenun dari alat tenun 7 × 4:

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

Ada beberapa cara tenunan dapat dianyam ke dalam lungsin, yang paling sederhana adalah tenunan polos .

Pada baris pertama dari tenunan polos, pakan mulai di atas string lungsin pertama, berjalan di bawah string kedua, kemudian di atas string ketiga, lalu di bawah yang keempat, dan seterusnya.

Baris pakan kedua identik dengan yang pertama tetapi diimbangi ke kanan oleh satu string warp, sehingga mulai di bawah kemudian berjalan, dan seterusnya.

Pada alat tenun 7 × 4 kami, tenunan polos terlihat seperti ini:

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

Kita dapat menggambarkan tenunan polos dengan mengatakan bahwa pakan melewati waktu lungsin 1 , kemudian di bawah 1 waktu, dan setiap baris berikutnya digeser 1 string ke kanan.

Sebuah menenun umum dapat digambarkan dengan memiliki pakan pergi ke warp v kali, kemudian di bawah u kali, dengan setiap baris berikutnya digeser oleh s string ke kanan. (Semua nilai adalah bilangan bulat, s mungkin 0 atau negatif, u dan v harus non-negatif.)

Alat tenun 7 × 4 dengan v = 1 , u = 2 , s = 2 , sejenis tenunan kepar :

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

Tantangan

Tugas Anda adalah menulis program terpendek (dalam byte) yang menghasilkan pola anyaman batang dan garis yang diberikan v , u , s , lebar dan tinggi alat tenun, dan pergeseran awal .

The pergeseran awal adalah jumlah string baris pertama di pakan digeser ke kanan (0 pada contoh di atas). Setiap baris berikutnya digeser oleh s lebih string.

Program Anda harus menggunakan 6 angka ini dalam beberapa format yang mudah digunakan (stdin, pemanggilan fungsi, dll.) Dan menampilkan kisi-kisi tenun bar dan persegi panjang ke stdout. Anda dapat menganggap semua input valid. (Semua nilai adalah bilangan bulat, lebar dan tinggi harus positif, pergeseran awal bisa apa saja.)

Contohnya

lebar = 5, tinggi = 4, pergeseran awal = 0, v = 1, u = 3, s = -2:

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

lebar = 5, tinggi = 4, pergeseran awal = 3, v = 1, u = 3, s = -2:

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

lebar = 5, tinggi = 4, pergeseran awal = 1, v = 1, u = 1, s = 0:

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

lebar = 5, tinggi = 4, pergeseran awal = 0, v = 1, u = 0, s = 0:

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

Catatan

  • Pola selalu dimulai dengan pakan di atas lungsin di sudut kiri atas kisi (kecuali awalnya bergeser).
  • Semua benang pakan masuk dari kiri. Mereka tidak spiral seperti ini .
  • u + v belum tentu kelipatan dari lebar kisi.
  • u dan v mungkin tidak keduanya 0
Hobi Calvin
sumber

Jawaban:

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}

Tidak banyak yang bisa dikatakan tentang ini. Saya membangun satu pengulangan -dan |, ulangi wkali (hanya untuk memastikan), dan saya memotong bagian yang sesuai untuk setiap baris.

Martin Ender
sumber
Ketika u + v == 1, apakah w kali cukup?
edc65
@ edc65 ya, karena itu %(u+v). Dalam hal ini saya hanya mulai di indeks 0, jadi saya punya wkarakter yang tersisa di string.
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')}

Uji

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

||-----|||-
-----|||---
---|||-----
-|||-----||
||-----|||-
-----|||---
---|||-----
-|||-----||
edc65
sumber
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 ... Jadi tergoda untuk belajar ruby ​​sekarang.

Input dengan menetapkan variabel string dalam format ini: "width, height, shift awal, v, u, s".
Rekatkan sebelum program:

A="80,80,0,2,2,-9"
Vektor
sumber
1
Saya percaya seharusnya begitu while h. Saya mendapat baris tambahan.
Hobi Calvin
1
Anda harus menggunakan sistem format input apa pun - pisahkan nilai input dengan koma, dan evaluasi.
isaacg
1

JavaScript (ES6), 111 byte

Pendekatan ES6 yang sedikit berbeda, menggunakan Array.from fungsional.

fmengambil argumen (w,h,i,v,u,s)dan mengembalikan string. Baris baru ditambahkan ke kode dan baris baru literal dalam string diganti oleh \nuntuk kejelasan; tidak tercermin dalam jumlah 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`

Pemakaian

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

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

*/

Versi tidak dikoleksi dengan penjelasan

Saya menyimpan beberapa byte dengan membuat alias untuk Array, yang tidak tercermin dalam versi yang tidak dikenali.

// 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`
Chris M.
sumber
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;}}

"Ini lebih nyaman daripada yang terlihat." "Pasti begitu." - Gia dan Eidon (Tidak ada yang akan mendapatkan referensi ini. Petunjuk: "Weave Mat")

Jadi saya sudah mengerjakan ini selama lima jam sekarang, dan saya menyerah. Saya tidak tahu bagaimana cara agar kode ini berfungsi. Itu terus berjalan mundur setelah baris pertama, dan kemudian sepenuhnya salah (7 4 0 2 2 1).

Inilah versi yang lebih sederhana yang dapat Anda baca dengan lebih mudah. Yang saya lakukan adalah mengambil input, membuat array template, dan kemudian mencetak di dalam loop.

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

Anda dapat dengan mudah mengujinya di sini: http://www.compileonline.com/compile_c_online.php menggunakan "7 4 0 1 1 1" di kotak Input STDIN di bagian bawah. Mulailah mengedit angka, dan Anda akan melihat masalahnya.

Maaf saya tidak bisa menemukan solusi yang berfungsi; Aku benci diriku sendiri karena ini. Saya telah menghabiskan terlalu banyak waktu untuk tidak mengunggahnya agar orang lain memperbaikinya.

Saya telah menggunakan printf ini untuk sementara waktu untuk memisahkan baris paling atas (mudah) dengan yang lainnya (baris masalah): printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);

Ness
sumber
for(i=0;i++<h;)? Trik yang sama untuk loop kedua? Ini menyimpan hanya satu char per loop.
11684
Saya memang mencobanya beberapa kali, tetapi itu membuat angka tidak aktif, dan saya tidak dapat menemukan cara untuk menggunakannya.
Ness
Aneh. Sebaliknya? ++i? Itu hanya tembakan dalam kegelapan.
11684
Nggak; yang akan bertambah sebelum nomor tersebut bahkan digunakan untuk perbandingan dan Anda akan berakhir dengan iterasi h-1. Masalah dengan menggunakan ++ sama sekali di bagian kedua dari deklarasi for loop adalah bahwa saya bertambah sebelum Anda bahkan menggunakannya di dalam loop. Berurusan dengan off-number mungkin memerlukan -1 di suatu tempat dalam matematika, dan itu membuat pintasan tidak sepadan. Kecuali ini bisa dilakukan tanpa -1. Saya masih belum bisa mengetahuinya.
Ness
Tentu saja! facepalm .
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]))
Angs
sumber
1
Sebuah golf sepele akan perubahan f w h i v u suntuk (w?h)i v u s. Fungsi infiks
H.PWiz