ASCII'de dokuma


12

Dikdörtgen bir |karakter ızgarasının, tezgâh üzerindeki gergin ipleri ( çözgü ) temsil ettiğini, temsil edeceğimiz diğer ipliklerin ( atkı ) -etrafta dokunabileceğini hayal edin.

İşte 7 × 4 tezgahın dokunmamış çözgüsü:

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

Atkıların çözgü içine dokunabilmesinin birkaç yolu vardır, en basiti düz örgüdür .

Bir düz örgünün ilk sırasında atkı, birinci çözgü ipinin üzerinde başlar, ikinci ipin altına, daha sonra üçüncü ipin üstüne, sonra dördüncü altına vb. Gider.

İkinci atkı sırası birinciyle aynıdır, ancak bir çözgü ipi ile sağa kaydırılır, bu nedenle alttan başlar ve sonra devam eder.

7 × 4 tezgahımızda düz örgü şöyle görünür:

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

Biz atkı çözgü üzerine çıkması olduğunu söyleyerek düz dokuma tanımlayabilir 1 altında, ardından zaman 1 saat ve sonraki her satır kaydırılır 1 sağa dize.

Genelleştirilmiş bir örgü, atkının çözgü v zamanlarının ardından u zamanlarının altından geçerek her bir sıranın s telleri sağa kaydırılmasıyla tarif edilebilir . (Tüm değerler tamsayıdır, s 0 veya negatif olabilir, u ve v negatif olmamalıdır.)

V = 1 , u = 2 , s = 2 olan bir 7 × 4 dokuma tezgahı , bir tür dimi örgü :

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

Meydan okuma

Göreviniz, v , u , s , tezgahın genişliği ve yüksekliği ve ilk vardiya verilen dokuma çubuk ve çizgi deseni üreten en kısa programı (bayt cinsinden) yazmaktır .

İlk öteleme atkı ilk satır (örnekler yukarıda 0) sağa kaydırılır şeritlerinin sayısıdır. Birbirini takip eden her bir satır ile kaydırılır s birden fazla ipliklerin.

Programınız bu 6 sayıyı kullanımı kolay bazı formatlarda (stdin, fonksiyon çağrısı vb.) Almalı ve çubuk ve dikdörtgenlerin dokuma ızgarasını stdout'a çıkarmalıdır. Tüm girdilerin geçerli olduğunu varsayabilirsiniz. (Tüm değerler tamsayıdır, genişlik ve yükseklik pozitif olmalıdır, ilk kaydırma herhangi bir şey olabilir.)

Örnekler

genişlik = 5, yükseklik = 4, ilk kaydırma = 0, v = 1, u = 3, s = -2:

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

genişlik = 5, yükseklik = 4, ilk kaydırma = 3, v = 1, u = 3, s = -2:

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

genişlik = 5, yükseklik = 4, ilk kaydırma = 1, v = 1, u = 1, s = 0:

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

genişlik = 5, yükseklik = 4, ilk kaydırma = 0, v = 1, u = 0, s = 0:

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

notlar

  • Desen her zaman atkı, ızgaranın sol üst köşesindeki çözgü üzerinden başlar (başlangıçta kaydırılmadıkça).
  • Tüm atkı iplikleri soldan gelir. Onlar yok gibi sarmal bu .
  • u + v , mutlaka ızgara genişliğinin bir katı değildir.
  • u ve v her ikisi de 0 olmayabilir

Yanıtlar:


5

Yakut, 72 bayt

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

Bu konuda söylenecek çok şey yok. Ben bir tekrar oluşturmak -ve kez |tekrarlayın w(sadece emin olmak için), ve ben her satır için uygun bölümü dilimleyin.


U + v == 1 olduğunda, w kez yeterli mi?
edc65

@ edc65 evet, çünkü %(u+v). Bu durumda ben sadece dizinde başlıyorum 0, bu yüzden wdizede kalan karakterler var .
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')}

Ölçek

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

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

2

Python, 92 bayt

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 ... Yakut öğrenmek çok cazip.

Şu biçimde bir dize değişkeni atayarak girin: "genişlik, yükseklik, ilk kaydırma, v, u, s".
Programdan önce yapıştırın:

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

1
Olması gerektiğine inanıyorum while h. Fazladan bir satır alıyorum.
Calvin'in Hobileri

1
Herhangi bir giriş formatı sistemini kullanmalısınız - giriş değerlerini virgülle ayırın ve değerlendirin.
isaacg

1

JavaScript (ES6), 111 bayt

Array.from işlevini kullanarak biraz farklı bir ES6 yaklaşımı.

fargümanları alır (w,h,i,v,u,s)ve bir dize döndürür. Dize içindeki koda ve değişmez satırsonuna satır satırları eklenir \n; ikisi de bayt sayısına yansır.

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`

kullanım

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

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

*/

Açıklama ile birlikte yorum yapılmamış sürüm

Array için, ungolfed sürümüne yansıtılmayan bir takma ad oluşturarak bazı baytlar kurtardım.

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

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

"Göründüğünden daha rahat." "Olması gerekecekti." - Gia ve Eidon (Kimse bu referansı almayacak. İpucu: "Dokuma Mat")

Bu yüzden yaklaşık beş saattir bunun üzerinde çalışıyorum ve pes ediyorum. Nasıl bu kodu işe almak için hiçbir fikrim yok. İlk satırdan sonra geriye doğru devam eder ve sonra tamamen yanlış olur (7 4 0 2 2 1).

İşte daha kolay okuyabileceğiniz daha basit sürüm. Tek yaptığım girdi almak, şablon dizisini yapmak ve sonra döngüler içinde yazdırmak.

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

Buradan kolayca test edebilirsiniz: http://www.compileonline.com/compile_c_online.php alt taraftaki STDIN Giriş kutusunda "7 4 0 1 1 1" kullanarak. Sayıları düzenlemeye başlayın, sorunları göreceksiniz.

Maalesef çalışan bir çözüm bulamadım; Bunun için kendimden nefret ediyorum. Başka birinin düzeltmesi için yüklememek için çok fazla zaman harcadım.

Üst satır (daha kolay) geri kalanına (sorun satırları) ayırmak için bir süredir bu printf kullanıyorum: printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);


for(i=0;i++<h;)? İkinci for döngüsü için aynı hile? Gerçi döngü başına sadece bir karakter kaydeder.
11684

Bunu birkaç kez denedim, ama bu sayıları ortadan kaldırıyor ve bunları kullanmanın bir yolunu bulamadım.
Ness

Garip. Başka bir yol var mı? ++i? Bu sadece karanlıkta bir atış.
11684

Hayır; bu sayı karşılaştırma için kullanılmadan önce artar ve h-1 yinelemeleriyle sonuçlanırsınız. For döngüsü bildiriminin ikinci bölümünde hiç bir ++ kullanmayla ilgili sorun, döngü içinde bile kullanmadan önce i'nin artmasıdır. Off-number ile çalışmak, matematikte bir yerde -1 gerektirebilir ve bu da kısayolu buna değmez hale getirir. Bu -1 olmadan yapılabilir değilse. Hala anlayamıyorum.
Ness

Elbette! facepalm .
11684

0

Haskell, 126 bayt

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
Önemsiz bir golf için değiştirmek f w h i v u solacaktır (w?h)i v u s. Bir infix işlevi
H.PWiz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.