ทอด้วย ASCII


12

ลองนึกภาพ|ตัวละครที่เป็นรูปสี่เหลี่ยมผืนผ้ากริดเป็นตัวแทนของสตริงที่ตึงบนเครื่องทอผ้า ( ด้ายยืน ) ที่ด้ายอื่น ( ด้านซ้าย ) ซึ่งเราจะใช้แทน-สามารถถักทอ

นี่คือวิปริตที่ไม่ทอของทอผ้าขนาด 7 × 4:

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

มีหลายวิธีที่ผ้าสามารถทอเป็นวิปริตเป็นที่ง่ายเป็นทอธรรมดา

ในแถวแรกของการสานธรรมดาผ้าเริ่มต้นขึ้นเหนือสตริงวาร์ปแรกไปต่ำกว่าสตริงที่สองจากนั้นอยู่เหนือสตริงที่สามจากนั้นต่ำกว่าที่สี่และอื่น ๆ

แถวผ้าที่สองนั้นเหมือนกันกับแถวแรก แต่ชดเชยไปทางขวาด้วยสตริงวาร์ปหนึ่งอันดังนั้นมันจึงเริ่มจากด้านล่างแล้วข้ามไป

บนเครื่องทอผ้า 7 × 4 ของเราผ้าทอธรรมดามีลักษณะดังนี้:

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

เราสามารถอธิบายการทอธรรมดาได้โดยบอกว่าผ้าพุ่งผ่านวิปริต1ครั้งจากนั้นต่ำกว่า1ครั้งและแต่ละแถวถัดมาจะเลื่อน1สตริงไปทางขวา

สานทั่วไปสามารถอธิบายได้โดยมีผ้าไปกว่าวิปริตวีครั้งจากนั้นภายใต้ยูครั้งกับแต่ละแถวต่อมาขยับsสตริงไปทางขวา (ค่าทั้งหมดเป็นจำนวนเต็มsอาจเป็น 0 หรือลบได้uและvต้องไม่เป็นลบ)

เครื่องทอผ้า 7 × 4 ที่มีv = 1 , u = 2 , s = 2 , เครื่องทอลายทแยงชนิดหนึ่ง:

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

ท้าทาย

งานของคุณคือการเขียนโปรแกรมที่สั้นที่สุด (ไบต์) ที่ก่อให้เกิดรูปแบบการทอของบาร์และรอยขีดข่วนให้โวลต์ , U , s , ความกว้างและความสูงของเครื่องทอผ้าและการเปลี่ยนแปลงเริ่มต้น

การเปลี่ยนแปลงครั้งแรกคือจำนวนของสตริงที่แถวแรกในผ้าถูกเลื่อนไปทางขวา (0 ในตัวอย่างด้านบน) แต่ละแถวที่ตามมาจะเลื่อนโดยsสตริงมากขึ้น

โปรแกรมของคุณควรใช้ตัวเลข 6 ตัวเหล่านี้ในรูปแบบที่ใช้งานง่าย (stdin, function call, ฯลฯ ) และออกตารางกริดทอของแถบและสี่เหลี่ยมเพื่อ stdout คุณอาจจะถือว่าข้อมูลทั้งหมดนั้นถูกต้อง (ค่าทั้งหมดเป็นจำนวนเต็มความกว้างและความสูงต้องเป็นค่าบวกการเลื่อนครั้งแรกอาจเป็นอะไรก็ได้)

ตัวอย่าง

width = 5, height = 4, shift shift เริ่มต้น = 0, v = 1, u = 3, s = -2:

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

width = 5, height = 4, shift shift เริ่มต้น = 3, v = 1, u = 3, s = -2:

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

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

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

width = 5, height = 4, shift shift เริ่มต้น = 0, v = 1, u = 0, s = 0:

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

หมายเหตุ

  • รูปแบบเริ่มต้นด้วยการปล่อยทิ้งไว้เหนือเส้นโค้งที่มุมซ้ายบนของตาราง (ยกเว้นในกรณีแรกที่เลื่อน)
  • กระทู้ผ้าทั้งหมดมาจากด้านซ้าย พวกเขาไม่ได้มีเกลียวเช่นนี้
  • u + vไม่จำเป็นต้องเป็นความกว้างของกริดที่หลากหลาย
  • คุณและvอาจไม่ใช่ทั้งคู่เป็น 0

คำตอบ:


5

Ruby, 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ตัวอักขระเหลืออยู่ในสตริง
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')}

ทดสอบ

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

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

2

Python ขนาด 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

อืม ... อยากรู้เรื่องทับทิมตอนนี้

อินพุตโดยการกำหนดตัวแปรสตริงในรูปแบบนี้: "width, height, shift shift, v, u, s"
วางก่อนโปรแกรม:

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

1
while hผมเชื่อว่ามันควรจะเป็น ฉันได้แถวเพิ่ม
งานอดิเรกของ Calvin

1
คุณควรใช้ระบบรูปแบบการป้อนข้อมูลใด ๆ - ทำให้ค่าที่ป้อนด้วยเครื่องหมายจุลภาคคั่นและวิเคราะห์
isaacg

1

JavaScript (ES6), 111 ไบต์

วิธี ES6 ที่แตกต่างกันเล็กน้อยโดยใช้ Function 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;}}

"สะดวกสบายกว่าที่คิด" "มันจะต้องเป็น." - Gia และ Eidon (ไม่มีใครได้รับข้อมูลอ้างอิงนี้คำแนะนำ: "Weave Mat")

ดังนั้นฉันจึงได้ทำงานเกี่ยวกับเรื่องนี้มาห้าชั่วโมงแล้วและฉันก็ยอมแพ้ ฉันไม่รู้ว่าจะทำให้รหัสนี้ทำงานอย่างไร มันจะวนไปเรื่อย ๆ หลังจากแถวแรกแล้วก็ผิดทั้งหมด (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;)? เคล็ดลับที่เหมือนกันสำหรับ for-loop ที่สอง? มันบันทึกเพียงหนึ่งตัวอักษรต่อวงแม้ว่า
11684

ฉันลองสองสามครั้ง แต่มันทำให้ตัวเลขออกมาและฉันไม่สามารถหาวิธีใช้มันได้
Ness

แปลก. วิธีอื่น ๆ? ++i? นั่นเป็นเพียงการยิงในที่มืด
11684

Nope; ที่จะเพิ่มขึ้นก่อนที่จำนวนจะถูกใช้สำหรับการเปรียบเทียบและคุณจะต้องสิ้นสุดด้วยการทำซ้ำ h-1 ปัญหาของการใช้ ++ เลยในส่วนที่สองของการประกาศลูป for คือการที่ฉันเพิ่มค่าก่อนที่คุณจะใช้ภายในลูป การจัดการกับค่าปิดอาจต้องใช้ -1 ในคณิตศาสตร์และนั่นทำให้ทางลัดไม่คุ้มค่า เว้นแต่จะทำได้โดยไม่ใช้ -1 ฉันยังคิดไม่ออก
Ness

แน่นอน! facepalm
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ฟังก์ชั่น infix
H.PWiz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.