ASCII में बुनाई


12

कल्पना कीजिए कि |पात्रों का एक आयताकार ग्रिड एक करघे ( ताना ) पर तना हुआ तारों का प्रतिनिधित्व करता है जो कि अन्य धागे ( बाने ), जिन्हें हम प्रतिनिधित्व करेंगे -, चारों ओर बुना जा सकता है।

यहाँ 7 × 4 करघा का अलिखित ताना है:

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

ऐसे कई तरीके हैं जिनसे ताना को बुना जा सकता है, सबसे सरल सादा बुनाई है

एक सादे बुनाई की पहली पंक्ति में, पहला ताना स्ट्रिंग के ऊपर से शुरू होता है, दूसरे स्ट्रिंग के नीचे जाता है, फिर तीसरे स्ट्रिंग के ऊपर, फिर चौथे से नीचे, और इसी तरह।

दूसरी बाने की पंक्ति पहले के समान है लेकिन एक ताना स्ट्रिंग द्वारा दाईं ओर ऑफसेट होती है, इसलिए यह फिर से शुरू होता है, और इसी तरह आगे बढ़ता है।

हमारे 7 × 4 लूम पर सादा बुनाई इस तरह दिखता है:

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

हम यह कहते हुए सादे बुनाई का वर्णन कर सकते हैं कि 1 बार ताना समाप्त हो जाता है , फिर 1 बार के तहत , और प्रत्येक बाद की पंक्ति को दाईं ओर 1 स्ट्रिंग स्थानांतरित किया जाता है।

एक सामान्यीकृत बुनाई को वी के वी बार पर जाने के बाद वर्णित किया जा सकता है , फिर यू बार के तहत , प्रत्येक बाद की पंक्ति को एस स्ट्रिंग्स द्वारा दाईं ओर स्थानांतरित कर दिया जाता है । (सभी मान पूर्णांक हैं, s 0 या ऋणात्मक हो सकता है, u और v गैर-ऋणात्मक होना चाहिए।)

V = 1 , u = 2 , s = 2 , टवील बुनाई का एक प्रकार के साथ एक 7 × 4 करघा :

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

चुनौती

आपका काम कम से कम कार्यक्रम (बाइट्स में) है कि सलाखों और डैश दिया की एक बुनी पैटर्न का उत्पादन लिखना है वी , यू , एस , चौड़ाई और करघा की ऊंचाई, और प्रारंभिक पारी

प्रारंभिक पारी तार बाने में पहली पंक्ति (उपरोक्त उदाहरण में 0) सही करने के लिए स्थानांतरित कर दिया है की संख्या है। बाद के प्रत्येक पंक्ति से स्थानांतरित कर दिया है रों अधिक स्ट्रिंग्स।

आपका कार्यक्रम इन 6 नंबरों को प्रारूप (स्टड, एक फ़ंक्शन कॉल, आदि) का उपयोग करने के लिए कुछ आसान में लेना चाहिए और स्टडआउट के लिए बार और आयतों के बुने हुए ग्रिड को आउटपुट करना चाहिए। आप मान सकते हैं कि सभी इनपुट मान्य हैं। (सभी मान पूर्णांक हैं, चौड़ाई और ऊंचाई सकारात्मक होनी चाहिए, प्रारंभिक बदलाव कुछ भी हो सकता है।)

उदाहरण

चौड़ाई = 5, ऊंचाई = 4, प्रारंभिक पारी = 0, v = 1, u = 3, s = -2:

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

चौड़ाई = 5, ऊंचाई = 4, प्रारंभिक पारी = 3, वी = 1, यू = 3, एस = -2:

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

चौड़ाई = 5, ऊंचाई = 4, प्रारंभिक पारी = 1, वी = 1, यू = 1, एस = 0:

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

चौड़ाई = 5, ऊंचाई = 4, प्रारंभिक पारी = 0, वी = 1, यू = 0, एस = 0:

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

टिप्पणियाँ

  • पैटर्न हमेशा ग्रिड के ऊपरी बाएं कोने में ताना से शुरू होता है (जब तक कि शुरू में स्थानांतरित नहीं किया जाता)।
  • सभी बायीं ओर के धागे बाईं ओर से आते हैं। वे इस तरह सर्पिल नहीं करते हैं
  • यू + वी जरूरी नहीं कि ग्रिड चौड़ाई के एक से अधिक हो।
  • यू और वी दोनों 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

जावास्क्रिप्ट (ईएस 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

हम्म ... तो अब रूबी सीखने के लिए ललचाती है।

इस प्रारूप में एक स्ट्रिंग चर निर्दिष्ट करके इनपुट: "चौड़ाई, ऊंचाई, प्रारंभिक पारी, वी, यू, एस"।
कार्यक्रम से पहले चिपकाएँ:

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

1
मेरा मानना ​​है कि यह होना चाहिए while h। मुझे एक अतिरिक्त पंक्ति मिल रही है।
केल्विन के

1
आपको किसी भी इनपुट प्रारूप प्रणाली का उपयोग करना चाहिए - इनपुट मानों को अल्पविराम से अलग करें, और इसे निकालें।
isaacg

1

जावास्क्रिप्ट (ईएस 6), 111 बाइट्स

कार्यात्मक Array.from का उपयोग करके थोड़ा अलग ES6 दृष्टिकोण।

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)) /*

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

*/

स्पष्टीकरण के साथ Ungolfed संस्करण

मैंने ऐरे के लिए एक उपनाम बनाकर कुछ बाइट्स को बचा लिया, जो कि अनगुल्ड संस्करण में परिलक्षित नहीं होता है।

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

सी, 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 नीचे दिए गए STDIN इनपुट बॉक्स में "7 4 0 1 1 1" का उपयोग करें। संख्याओं को संपादित करना शुरू करें, और आप समस्याओं को देखेंगे।

क्षमा करें, मैं एक काम के समाधान के साथ नहीं आ सका; मैं इसके लिए खुद से नफरत कर रहा हूं। मैंने बहुत समय बिताया है कि इसे अपलोड न करने के लिए किसी और को ठीक करूं।

मैं इस प्रिंटफ को कुछ समय के लिए शीर्ष पंक्ति (आसान) को उनमें से बाकी (समस्या पंक्तियों) से अलग करने के लिए उपयोग कर रहा हूं: printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);


for(i=0;i++<h;)? दूसरी लूप के लिए समान चाल? हालांकि यह प्रति लूप केवल एक चार बचाता है।
11684

मैंने कोशिश की कि कुछ बार, लेकिन वह संख्या को बंद कर देता है, और मुझे उनका उपयोग करने का कोई तरीका नहीं मिला।
नेस

अजीब। दूसरा रास्ता? ++i? हालांकि यह अंधेरे में सिर्फ एक शॉट है।
11684

नहीं; इससे पहले कि संख्या का उपयोग तुलना के लिए भी किया जाएगा और आप h-1 पुनरावृत्तियों के साथ समाप्त करेंगे। लूप डिक्लेरेशन के दूसरे खंड में ++ का उपयोग करने के साथ समस्या यह है कि इससे पहले कि आप इसे लूप के भीतर भी उपयोग करें, मैं पहले से ही वृद्धि कर रहा हूं। ऑफ-नंबर से निपटने के लिए गणित में कहीं -1 की आवश्यकता हो सकती है, और यह शॉर्टकट को इसके लायक नहीं बनाता है। जब तक कि यह उसके बिना उल्लेखनीय न हो जाए। मैं अभी भी इसका पता नहीं लगा सकता।
नेस

बेशक! फेसपालम
11684

0

हास्केल, 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.