ASCII로 직조


12

직사각형의 |문자 격자가 직조기 ( 뒤틀림 ) 의 팽팽한 끈을 나타내고 있다고 상상해보십시오. 다른 실 ( 위사 ) -이 짜여 질 수 있습니다.

다음은 7 × 4 베틀의 부직포 워프입니다.

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

씨실이 날실로 직조 될 수있는 방법은 여러 가지가 있는데, 가장 간단한 것은 평직 이다.

평직의 첫 번째 줄에서 위 사는 첫 번째 날실 위에서 시작하여 두 번째 줄 아래로, 그 다음 세 번째 줄 아래로, 그런 다음 네 번째 줄 아래로 간다.

두 번째 위사 행은 첫 번째 행과 동일하지만 하나의 날실 문자열에 의해 오른쪽으로 오프셋되므로 아래에서 시작하여 계속됩니다.

7 × 4 베틀에서 평직은 다음과 같습니다.

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

우리는 위사가 날실을 1 회, 1 회 미만으로 하고 각 후속 행이 1 열 오른쪽 으로 이동 한다고 말함으로써 평직을 설명 할 수 있습니다 .

일반화 된 직조는 위사가 뒤틀림을 v 회 초과 한 다음 u 회 이하 로 이동하여 각각의 후속 행이 s 스트링에 의해 오른쪽 으로 이동함으로써 설명 될 수있다 . (모든 값은 정수이며 s 는 0 또는 음수 일 수 있으며 uv 는 음수가 아니어야합니다.)

v = 1 , u = 2 , s = 2능직 직물7x4 직기 :

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

도전

당신의 임무는 v , u , s , 직기의 너비와 높이 및 초기 시프트가 주어진 막대와 대시의 짠 패턴을 생성하는 가장 짧은 프로그램 (바이트)을 작성하는 것 입니다.

초기 시프트 위사의 첫 번째 행이 (상기 예에서 0) 우측으로 시프트 스트링 수있다. 이후의 각 행은 어긋나게 이상의 문자열.

프로그램은 사용하기 쉬운 형식 (stdin, 함수 호출 등) 으로이 6 개의 숫자를 가져 와서 바 및 사각형의 짠 그리드를 표준 출력으로 출력해야합니다. 모든 입력이 유효하다고 가정 할 수 있습니다. (모든 값은 정수이고 너비와 높이는 양수 여야합니다 . 초기 이동 은 무엇이든 가능합니다.)

너비 = 5, 높이 = 4, 초기 이동 = 0, v = 1, u = 3, s = -2 :

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

너비 = 5, 높이 = 4, 초기 이동 = 3, v = 1, u = 3, s = -2 :

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

너비 = 5, 높이 = 4, 초기 이동 = 1, v = 1, u = 1, s = 0 :

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

너비 = 5, 높이 = 4, 초기 이동 = 0, v = 1, u = 0, s = 0 :

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

노트

  • 패턴은 항상 그리드의 왼쪽 상단 모서리에있는 날실 위사가 시작됩니다 (처음 이동하지 않은 경우).
  • 모든 씨실은 왼쪽에서 들어옵니다. 그들은 이렇게 나선 하지 않습니다 .
  • u + v 는 그리드 폭의 배수 일 필요는 없습니다.
  • uv 는 모두 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). 이 경우 index 만 시작 0하므로 w문자열에 문자가 남아 있습니다.
Martin Ender

3

자바 스크립트 (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

파이썬, 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

흠 .. 이제 루비를 배우고 싶었습니다.

"폭, 높이, 초기 시프트, v, u, s"형식으로 문자열 변수를 지정하여 입력합니다.
프로그램 앞에 붙여 넣기 :

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

1
나는 그것이되어야한다고 믿는다 while h. 줄이 더 늘어납니다.
Calvin 's Hobbies

1
모든 입력 형식 시스템을 사용해야합니다. 입력 값을 쉼표로 구분하여 평가하십시오.
isaacg

1

자바 스크립트 (ES6), 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)) /*

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

*/

설명이 포함 된 언 골프 버전

Array의 별칭을 만들어 일부 바이트를 저장했습니다. 이것은 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

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

그래서 나는 지금 약 5 시간 동안이 일을하고있다가 포기했습니다. 이 코드를 작동시키는 방법을 모르겠습니다. 첫 번째 행 이후에도 계속 거꾸로 된 다음 완전히 잘못됩니다 (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;
    }
}

아래의 STDIN 입력 상자에 "7 4 0 1 1 1"을 사용하여 http://www.compileonline.com/compile_c_online.php 에서 쉽게 테스트 할 수 있습니다 . 숫자 편집을 시작하면 문제가 나타납니다.

죄송합니다. 작동하는 솔루션을 찾지 못했습니다. 나는 이것을 싫어하고 있습니다. 다른 사람이 수정하도록 업로드하지 않는 데 너무 많은 시간을 보냈습니다.

나는이 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

아니; 숫자가 비교에 사용되기 전에 증가하고 h-1 반복으로 끝납니다. for 루프 선언의 두 번째 섹션에서 ++를 사용하는 문제는 루프 내에서 사용하기 전에 i가 증가한다는 것입니다. 숫자 이외의 숫자를 처리하려면 수학 어딘가에 -1이 필요할 수 있으며 바로 가기가 가치가 없습니다. 이것이 -1없이 가능하지 않은 경우. 나는 아직도 그것을 알아낼 수 없다.
Ness

물론이야! facepalm .
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. 삽입 기능
H.PWiz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.