Stellen Sie sich ein rechteckiges |
Zeichengitter vor, das die gespannten Fäden auf einem Webstuhl ( die Kette ) darstellt, um die andere Fäden ( der Schuss ), die wir darstellen -
, gewebt werden können.
Hier ist die ungewebte Kette eines 7 × 4-Webstuhls:
|||||||
|||||||
|||||||
|||||||
Es gibt eine Reihe von Möglichkeiten, wie der Schuss in die Kette eingewebt werden kann, wobei die einfachste die Leinwandbindung ist .
In der ersten Reihe einer Leinwandbindung beginnt der Schuss über der ersten Kette, geht unter der zweiten Kette, dann über der dritten Kette, dann unter der vierten Kette und so weiter.
Die zweite Schussreihe ist mit der ersten identisch, aber um einen Kettfaden nach rechts versetzt. Sie beginnt also unter und geht dann über und so weiter.
Auf unserem 7 × 4-Webstuhl sieht die Leinwandbindung folgendermaßen aus:
-|-|-|-
|-|-|-|
-|-|-|-
|-|-|-|
Wir können die Leinwandbindung beschreiben damit , dass der Schussfaden über die Kett- geht 1 Mal dann unter 1 Zeit, und jede nachfolgende Zeile verschoben 1 String nach rechts.
Eine verallgemeinerte Bindung kann beschrieben werden, indem der Schuss die Kett- V- Zeiten und dann die U- Zeiten durchläuft , wobei jede nachfolgende Reihe um s- Ketten nach rechts verschoben wird . (Alle Werte sind Ganzzahlen, s kann 0 oder negativ sein, u und v dürfen nicht negativ sein.)
Eine 7 × 4-Webmaschine mit v = 1 , u = 2 , s = 2 , eine Art Köperbindung :
-||-||-
||-||-|
|-||-||
-||-||-
Herausforderung
Ihre Aufgabe ist es, das kürzeste Programm (in Bytes) zu schreiben, das ein gewebtes Muster aus Strichen und Strichen erzeugt, wenn v , u , s , die Breite und Höhe des Webstuhls und die anfängliche Verschiebung gegeben sind .
Die anfängliche Verschiebung ist die Anzahl der Fäden, um die die erste Reihe im Schuss nach rechts verschoben ist (0 in den obigen Beispielen). Jede folgende Reihe wird durch verschobene s mehr Strings.
Ihr Programm sollte diese 6 Zahlen in einem einfach zu verwendenden Format (stdin, ein Funktionsaufruf usw.) aufnehmen und das gewebte Gitter aus Balken und Rechtecken an stdout ausgeben. Sie können davon ausgehen, dass alle Eingaben gültig sind. (Alle Werte sind ganze Zahlen, Breite und Höhe müssen positiv sein, die anfängliche Verschiebung kann beliebig sein.)
Beispiele
width = 5, height = 4, initial shift = 0, v = 1, u = 3, s = -2:
-|||-
||-||
-|||-
||-||
width = 5, height = 4, initial shift = 3, v = 1, u = 3, s = -2:
|||-|
|-|||
|||-|
|-|||
width = 5, height = 4, initial shift = 1, v = 1, u = 1, s = 0:
|-|-|
|-|-|
|-|-|
|-|-|
width = 5, height = 4, initial shift = 0, v = 1, u = 0, s = 0:
-----
-----
-----
-----
Anmerkungen
- Das Muster beginnt immer mit dem Schuss über der Kette in der oberen linken Ecke des Gitters (sofern nicht anfänglich verschoben).
- Alle Schussfäden kommen von links. Sie tun nicht wie Spirale dies .
- u + v ist nicht unbedingt ein Vielfaches der Gitterbreite.
- u und v dürfen nicht beide 0 sein
%(u+v)
. In diesem Fall beginne ich immer nur mit dem Index0
, sodass ich nochw
Zeichen in der Zeichenfolge habe.JavaScript (ES 6) 128
Prüfung
quelle
Python, 92 Bytes
Hmm ... So versucht, Rubin jetzt zu lernen.
Eingabe durch Zuweisen einer Zeichenfolgenvariablen in diesem Format: "Breite, Höhe, Anfangsverschiebung, v, u, s".
Einfügen vor dem Programm:
quelle
while h
. Ich bekomme eine zusätzliche Reihe.JavaScript (ES6), 111 Byte
Ein etwas anderer ES6-Ansatz unter Verwendung des funktionalen Array.from.
f
Nimmt Argumente(w,h,i,v,u,s)
und gibt einen String zurück. Dem Code hinzugefügte Zeilenumbrüche und wörtliche Zeilenumbrüche in der Zeichenfolge wurden\n
aus Gründen der Übersichtlichkeit durch ersetzt. Weder spiegelt sich in der Anzahl der Bytes wider.Verwendung
Ungolfed Version mit Erklärung
Ich habe einige Bytes gespart, indem ich einen Alias für Array erstellt habe, der in der ungolfed-Version nicht berücksichtigt wird.
quelle
C 357 Bytes
"Es ist bequemer als es aussieht." "Es müsste sein." - Gia und Eidon (Niemand wird diese Referenz bekommen. Hinweis: "Webmatte")
Also habe ich jetzt ungefähr fünf Stunden lang daran gearbeitet und ich gebe auf. Ich habe keine Ahnung, wie dieser Code funktioniert. Es geht nach der ersten Reihe immer rückwärts und wird dann völlig falsch (7 4 0 2 2 1).
Hier ist die einfachere Version, die Sie leichter lesen können. Ich rufe nur die Eingabe ab, erstelle das Vorlagenarray und drucke dann innerhalb der Schleifen.
Sie können es hier ganz einfach testen: http://www.compileonline.com/compile_c_online.php mit "7 4 0 1 1 1" im STDIN-Eingabefeld unten. Beginnen Sie mit der Bearbeitung der Zahlen, und Sie werden die Probleme sehen.
Entschuldigung, ich konnte keine funktionierende Lösung finden. Ich hasse mich dafür. Ich habe zu viel Zeit damit verbracht, es nicht hochzuladen, um es von jemand anderem reparieren zu lassen.
Ich benutze dieses printf für eine Weile, um die obere Reihe (einfach) weiter von den restlichen (die Problemreihen) zu trennen:
printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);
quelle
for(i=0;i++<h;)
? Gleicher Trick für die zweite for-Schleife? Es spart jedoch nur ein Zeichen pro Schleife.++i
? Das ist aber nur ein Schuss in die Dunkelheit.Haskell, 126 Bytes
quelle
f w h i v u s
für(w?h)i v u s
. Eine Infix-Funktion