물결 모양의 줄을 한 줄씩 인쇄


23

도전

문자열 s과 정수 n를 매개 변수로 사용 하는 프로그램이나 함수를 작성하십시오 . 프로그램은 다음과 같이 변환 될 때 문자열을 인쇄하거나 반환해야합니다.

왼쪽 상단에서 시작하여 오른쪽 아래로 이동하여 s높이의 물결로 쓰십시오 n. 그런 다음 위에서 아래로 각 행을 공백없이 문자열로 결합하십시오.

문자열 "WATERMELON"과 높이가 3 인 경우

파도는 다음과 같아야합니다.

W   R   O
 A E M L N
  T   E

그런 다음 행을 위에서 아래로 결합하십시오.

WRO
AEMLN
TE

따라서 프로그램은 "WROAEMLNTE"라는 문자열을 반환해야합니다.

마찬가지로, 높이가 4 인 "WATERMELON"은 다음 파형을 생성해야합니다.

W     E
 A   M L
  T R   O
   E     N

그러면 프로그램은 "WEAMLTROEN"문자열을 반환해야합니다

규칙

입력

적절한 형식으로 입력 할 수 있습니다. 원하는 경우 문자열을 사용할 수 있습니다. 당신은 가정 할 수 있습니다0 < n <= s.length

산출

출력은 변환 된 문자열 (STDOUT로 리턴 또는 인쇄)과 후행 줄 바꿈으로 구성되어야합니다.

채점

이것은 이므로 바이트 단위의 최단 답변이 승리합니다! 표준 허점은 허용되지 않습니다.

테스트 사례

Input                        Output

programmingpuzzles, 5 ->     piermnlsomgzgapzru
codegolf, 3           ->     cgoeofdl
elephant, 4           ->     enlatehp
1234567, 3            ->     1524637
qwertyuiop, 1         ->     qwertyuiop

n> 1 이라고 가정 할 수 있습니까 ? 테스트 케이스를 명확히하고 추가하지 않은 경우
Luis Mendo

1
이라고 가정 할 수 n > 0있지만 n=1유효한 경우입니다. 질문을 지금 업데이트하겠습니다.
Cowabunghole

2
@Cowabunghole 나는 알고있다. :) Related는 단지 그것이 비슷하고 기존의 답변 이이 도전에 도움이 될 수 있음을 의미합니다. 나는 그들이 오른쪽에있는 링크 된 질문에 표시되도록 언급했습니다. 관련! = 복제되었습니다. ;)
Kevin Cruijssen

5
레일이 하나만 암호화 된 레일 펜스 암호는 본 적이 없습니다. Just sayin '
wooshinyobject

1
@Veskah 아 예, 오래된 더블 rot13 트릭.
wooshinyobject

답변:


5

껍질 , 6 바이트

δÖK…¢ḣ

온라인으로 사용해보십시오!

n = 1잘 작동합니다 .

설명

δÖK…¢ḣ  Implicit inputs, say n=4 and s="WATERMELON"
     ḣ  Range: [1,2,3,4]
    ¢   Cycle: [1,2,3,4,1,2,3,4,1,2,3,4..
   …    Rangify: [1,2,3,4,3,2,1,2,3,4,3,2..
δÖK     Sort s by this list: "WEAMLTROEN"
        Print implicitly.

고차 함수 δ는 후드 아래에서 이와 같이 작동합니다. 단항 함수와 목록을 가져 와서 새 목록을 반환하는 고차 함수가 있다고 가정합니다. 예를 들어, Ö함수를 가져 와서 키로 사용하여 목록을 정렬합니다. 그런 다음 δÖ이진 함수와 두 목록을 가져 와서 목록을 압축 Ö하고 이진 함수를 키로 사용하여 쌍을 정렬하는 데 적용 하고 마지막으로 쌍을 두 번째 좌표에 투영합니다. 우리 K는 키 함수로 사용하는데 , 이는 단순히 첫 번째 인수를 반환하고 두 번째 인수는 무시합니다.


6

MATL , 16 바이트

Zv3L)t?yn:)2$S}i

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

입력을 고려 5, 'programmingpuzzles'.

Zv     % Input, implicit: number n. Symmetric range
       % STACK: [1 2 3 4 5 4 3 2 1]
3L     % Push [1 -1+1j]. When used as an index, this means 1:end-1
       % STACK: [1 2 3 4 5 4 3 2 1], [1 -1+1j]
)      % Index. Removes last element
       % STACK: [1 2 3 4 5 4 3 2]
t      % Duplicate
       % STACK: [1 2 3 4 5 4 3 2], [1 2 3 4 5 4 3 2]
?      %   If non-empty and non-zero
       %   STACK: [1 2 3 4 5 4 3 2]
  y    %   Implict input: string s. Duplicate from below
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], 'programmingpuzzles'
  n    %   Number of elements
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], 18
  :    %   Range
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2], [1 2 3 ··· 17 18]
  )    %   Index modularly
       %   STACK: 'programmingpuzzles', [1 2 3 4 5 4 3 2 1 2 3 4 5 4 3 2 1 2]
  2$S  %   Two-input sort: stably sorts first input as given by the second
       %   STACK: 'piermnlsomgzgapzru'
}      % Else. This branch is entered when n=1. The stack contains an empty array
       %   STACK: []
  i    %   Take input
       %   STACK: [], [], 'programmingpuzzles'
       % End, implicit
       % Display stack, implicit. Empty arrays are not displayed


5

J , 54, 29, 27 26 바이트

hoosierEE 덕분에 -1 바이트

([\:#@[$[:}:|@i:@<:@]) ::[

온라인으로 사용해보십시오!


@LuisMendo Hmm, 다시 한번 중요한 것을 놓쳤습니다. 감사! 결정된.
Galen Ivanov

1
나는 처음에 그것을 놓친 다음 OP를 실현하고 물었다. n=1처음부터 다음 과 같은 테스트 사례가 있었어야합니다.
Luis Mendo

1
|@i:[:|i:바이트 를 절약하는 대신
hoosierEE

@hoosierEE 예, 감사합니다!
Galen Ivanov

5

R , 68 바이트

function(s,n)intToUtf8(unlist(split(utf8ToInt(s),-(n:(2.9-n)-1)^2)))

온라인으로 사용해보십시오!

  • @Giuseppe 덕분에 -10 바이트
  • 내가 바보이기 때문에 -17 바이트
  • n=1@ J.Doe 덕분에 -9 바이트 및 대소 문자 수정
  • @JayCe 덕분에 -3 바이트


3

05AB1E (레거시) , 11 (8) 바이트

Σ²Lû¨¾è¼

@LuisMendo 의 MATL 답변에서 영감을 얻었습니다 . 내가 바보이기 때문에 @Adnan
덕분에 -3 바이트 ..>.>

온라인으로 사용해보십시오 .

설명:

Σ           # Sort the (implicit) input-string by:
 ²L         #  Create a list in the range [1, second input-integer]
            #   i.e. 5 → [1,2,3,4,5]
   û        #  Palindromize it
            #   i.e. [1,2,3,4,5] → [1,2,3,4,5,4,3,2,1]
    ¨       #  Remove the last item
            #   i.e. [1,2,3,4,5,4,3,2,1] → [1,2,3,4,5,4,3,2]
     ¾è     #  Index into it (with wraparound) using the counter_variable (default 0)
            #   i.e. counter_variable = 0 → 1
            #   i.e. counter_variable = 13 → 4
       ¼    #  And after every iteration, increase the counter_variable by 1

참고 : counter_variable파이썬 레거시 버전의 05AB1E Σ에는 내장 인덱스가 없었기 때문에 N새로운 Elixir 재 작성 버전 인 05AB1E에 포함되어 있기 때문입니다. 왜 여전히 레거시 버전을 사용합니까? Elixir에서 재 작성하면 문자열을 문자 목록으로 암시 적으로 변환하기 때문에 문자열을 }J다시 출력으로 변환해야 è합니다. .. : S)


¹g∍05AB1E가에 순환 색인을 사용하므로 부품이 필요하지 않습니다 è.
Adnan

@Adnan Ah, 나는 바보입니다 ..>.> 감사합니다!
Kevin Cruijssen

2

Japt , 16 바이트

¬üÏu´VÑ aV°ÃÔc q

온라인으로 테스트하십시오!

설명

 ¬ üÏ   u´ VÑ  aV° Ã Ô c q
Uq üXY{Yu--V*2 aV++} w c q    Ungolfed
                               Implicit: U = input string, V = size of wave
Uq                             Split U into chars.
   üXY{            }           Group the items in U by the following key function:
       Y                         Take the index of the item.
        u--V*2                   Find its value modulo (V-1) * 2.
               aV++              Take the absolute difference between this and (V-1).
                                 This maps e.g. indices [0,1,2,3,4,5,6,7,...] with V=3 to
                                                        [2,1,0,1,2,1,0,1,...]
                                 The items are then grouped by these values, leading to
                                 [[2,6,...],[1,3,5,7,...],[0,4,...]].
                     w         Reverse the result, giving [[0,4,...],[1,3,5,7,...],[2,6,...]].
                       c       Flatten.
                         q     Join back into a single string.

oO 그 ü방법은 새로운가 ?
Luis felipe De jesus Munoz

그래, 토요일에 추가 :-)
ETHproductions

바이트를 저장하기 위해 문자형 배열로 입력을 받고 1을 출력하거나 -P다른 2를 저장하기 위해 플래그를 사용할 수 있습니다 .
Shaggy

2

젤리 , 8 바이트

6 인치는 높이 1에 실패합니다. 그것을 해결하는 데 사용되는 2 바이트 ... 7을 찾을 수 있습니까?

ŒḄṖȯ1ṁỤị

양의 정수와 문자 목록을 허용하는 문자 목록을 허용하는 2 진 링크.

온라인으로 사용해보십시오!

방법?

ŒḄṖȯ1ṁỤị - Link: positive integer N; list of characters, T
ŒḄ       - bounce (implicit range of) N -> [1,2,3,...,N-1,N,N-1,...,3,2,1]
  Ṗ      - pop off the final entry         [1,2,3,...,N-1,N,N-1,...,3,2]
   ȯ1    - OR one                          if this is [] get 1 instead
     ṁ   - mould like T (trim or repeat to make this list the same length as T)
      Ụ  - grade-up (get indices ordered by value - e.g. [1,2,3,2,1,2] -> [1,5,2,4,6,3])
       ị - index into T

2

자바 스크립트 (ES6), 75 바이트

@MattH가 제안한 더 짧은 공식 (-3 바이트)

로 입력을 (string)(n)받습니다.

s=>n=>--n?[...s].map((c,x)=>o[x=x/n&1?n-x%n:x%n]=[o[x]]+c,o=[])&&o.join``:s

온라인으로 사용해보십시오!


자바 스크립트 (ES7), 78 바이트

@ETHproductions 덕분에 4 바이트 절약

로 입력을 (string)(n)받습니다.

s=>n=>--n?[...s].map((c,x)=>o[x=n*n-(x%(n*2)-n)**2]=[o[x]]+c,o=[])&&o.join``:s

온라인으로 사용해보십시오!


내 솔루션은 결국 당신과 매우 비슷합니다. 당신은 절약 할 수 있습니다 -3의 삽입 인덱스를 계산 바이트 ox/n&1?n-x%n:x%n대신 n*n-(x%(n*2)-n)**2.
MattH

@MattH 잘 했어요. 감사!
Arnauld


1

MBASIC , 146 (159) 155 바이트

1 INPUT S$,N:DIM C$(N):P=1:D=1:FOR I=1 TO LEN(S$):C$(P)=C$(P)+MID$(S$,I,1)
2 IF N>1 THEN P=P+D
3 IF P=N OR P=1 THEN D=-D
4 NEXT:FOR I=1 TO N:PRINT C$(I);:NEXT

n = 1을 처리하도록 업데이트되었습니다.

산출:

? programmingpuzzles, 5
piermnlsomgzgapzru

? codegolf, 3
cgoeofdl

? elephant, 4
enlatehp

? 1234567, 3
1524637

? WATERMELON, 4
WEAMLTROEN

? qwertyuiop, 1
qwertyuiop

현재 케이스 n = 1을 지원하지 않습니다.
wooshinyobject

케이스 n = 1을 처리하도록 업데이트 됨
wooshinyobject

비교를 정리하여 4 바이트를 절약했습니다.
wooshinyobject

1

펄 6 , 49 바이트

->\n{*.comb.sort({-abs n-1-$++%(2*n-2||1)}).join}

온라인으로 사용해보십시오!

커리 기능으로 입력을받습니다.

설명:

->\n{*.comb.sort({-abs n-1-$++%(2*n-2||1)}).join}
->\n{                                           }  # Take an number
     *.comb        # Turn the string into a list of chars
           .sort({                       })   # And sort them by
                           $++    # The index of the char
                              %(2*n-2||1)  # Moduloed by 2*(n-1) or 1 if n is 0
                       n-1-       # Subtract that from n-1
                   abs            # get the absolute value
                  -               # And negate to reverse the list
                                          .join  # and join the characters

정렬 순서는 다음과 같습니다 (for n=5).

(-4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1 0 -1 -2 -3 -4 -3 -2 -1)

1

J , 24 바이트

4 :'x\:(#x)$}:|i:<:y'::[

온라인으로 사용해보십시오!

명시 적 이원 동사. 처럼 실행하십시오 'codegolf' f 3.

작동 원리

4 :'x\:(#x)$}:|i:<:y'::[    x: string, y: height
4 :                         Define a dyadic verb:
               i:<:y        Generate a range of -(y-1) .. y-1
            }:|             Take absolute value and remove last
       (#x)$             1) Repeat to match the string's length
    x\:                     Sort x by the decreasing order of above
                     ::[    If 1) causes `Length Error`, return the input string instead

일반적으로 명시 적 함수는의 형태로 추가 5 바이트를 사용합니다 n :'...'. 그러나 오류 처리가 추가되면의 괄호와 공간으로 인해 차이가 2 바이트로 줄어 듭니다 (tacit)<space>::.


왜 항상 사용하는 경향이 sort up있습니까?! 명시 적 동사는 여전히 3 바이트 더 짧습니다. 좋은 결정!
Galen Ivanov


1

Powershell, 99 95 바이트

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[((1..$n+$n..1)*$s.Length|gu)[$i++*($n-gt1)]-1]+=$_}
-join$r

테스트 스크립트 :

$f = {

param($s,$n)$r=,''*$n
$s|% t*y|%{$r[((1..$n+$n..1)*$s.Length|gu)[$i++*($n-gt1)]-1]+=$_}
-join$r

}

@(
    ,("1234567", 3            ,     "1524637")
    ,("qwertyuiop", 1         ,     "qwertyuiop")
    ,("codegolf", 3           ,     "cgoeofdl")
    ,("elephant", 4           ,     "enlatehp")
    ,("programmingpuzzles", 5 ,     "piermnlsomgzgapzru")
) | % {
    $s,$n,$e = $_
    $r = &$f $s $n
    "$($r-eq$e): $r"
}

산출:

True: 1524637
True: qwertyuiop
True: cgoeofdl
True: enlatehp
True: piermnlsomgzgapzru

설명

스크립트 :

  • 행 배열을 만들고
  • 적절한 값으로 행을 채 웁니다.
  • 결합 된 행을 반환합니다.

이 표현식 ((1..$n+$n..1)*$s.Length|gu 은 시퀀스를 생성하고 1,2,3,3,2,1,1,2,3,3,2,1... 인접한 복제본을 제거합니다. Get-Unique의gu 별명입니다 .

  • 들어 $n=3중복 제거 된 순서입니다 :1,2,3,2,1,2,3,2,1...
  • 들어 $n=1중복 제거 된 순서입니다 :1

이 표현식 $i++*($n-gt1) 은 중복 제거 된 시퀀스의 인덱스를 반환합니다. =$i++만약 $n>1그렇지 않으면,=0


1

루비 , 75 65 바이트

->s,h{a=['']*h;x=-k=1;s.map{|c|a[x+=k=h-x<2?-1:x<1?1:k]+=c};a*''}

온라인으로 사용해보십시오!

입력을 문자 배열로 취하고 문자열을 반환합니다.

그것이 어떻게 wokrs :

  • h문자열 만들기
  • 입력 문자열의 각 문자에 대해 색인을 기준으로 삽입 할 문자열을 결정하십시오 (수정할 문자열의 색인은 h다음과 같이 계속 증가 0합니다).
  • 함께 연결된 모든 문자열을 반환


@GB 마지막 경우에는 작동하지 않습니다
Asone Tuhid

1

C, 142134 바이트

Jonathan Frech 덕분에 8 바이트 절약

암호:

t;i;j;d;f(s,n)char*s;{for(t=strlen(s),i=0;i<n;i++)for(j=0;j+i<t;j=d+i+(n<2))d=j-i+2*~-n,putchar(s[i+j]),i>0&i<n-1&d<t&&putchar(s[d]);}

설명:

// C variable and function declaration magic
t;i;j;d;f(s,n)char*s;{
    // Iterate through each "row" of the string
    for(t=strlen(s),i=0;i<n;i++)
        // Iterate through each element on the row
        // Original index iterator here was j+=2*(n-1), which is a full "zig-zag" forward
        // The (n<2) is for the edge case of n==1, which will break the existing logic.
        for(j=0; j+i<t; j=d+i+(n<2))
            // If j+i is the "zig", d is the "zag": Original index was d=j+i+2*(n-i-1)
            // Two's complement swag here courtesy of Jonathan Frech
            d=j-i+2*~-n,
            putchar(s[i+j]),
            // Short circuit logic to write the "zag" character for the middle rows
            i>0 & i<n-1 & d<t && putchar(s[d]);
}

온라인으로 사용해보십시오!


1
PPCG에 오신 것을 환영합니다. 좋은 첫 골프. 134 바이트 (GCC 가정)
Jonathan Frech

0

, 21 바이트

⭆NΦη¬⌊E²﹪⁺μ⎇νι±ι∨⊗⊖θ¹

mim±i=0(mod2n2)

 N                      First input as a number
⭆                       Map over implicit range and join
   η                    Second input
  Φ                     Filter over characters
       ²                Literal 2
      E                 Map over implicit range
          μ             Character index
             ι ι        Outer index
              ±         Negate
            ν           Inner index
           ⎇            Ternary
         ⁺              Plus
                   θ    First input
                  ⊖     Decremented
                 ⊗      Doubled
                    ¹   Literal 1
                ∨       Logical Or
        ﹪               Modulo
     ⌊                  Minimum
    ¬                   Logical Not
                        Implicitly print

0

SNOBOL4 (CSNOBOL4) , 191 바이트

	S =INPUT
	N =INPUT
	A =ARRAY(N)
	A<1> =EQ(N,1) S	:S(O)
I	I =I + -1 ^ D
	S LEN(1) . X REM . S	:F(O)
	A<I> =A<I> X
	D =EQ(I,N) 1
	D =EQ(I * D,1)	:(I)
O	Y =Y + 1
	O =O A<Y>	:S(O)
	OUTPUT =O
END

온라인으로 사용해보십시오!

소요 SN별도의 줄에.

설명:

	S =INPUT			;* read S
	N =INPUT			;* read N
	A =ARRAY(N)			;* create array of size N
	A<1> =EQ(N,1) S	:S(O)		;* if N = 1, set A<1> to S and jump to O
I	I =I + -1 ^ D			;* index into I by I + (-1)^D (D starts as '' == 0)
	S LEN(1) . X REM . S	:F(O)	;* extract the first character as X and set S to the
					;* remaining characters, jumping to O when S is empty
	A<I> =A<I> X			;* set A<I> to A<I> concatenated with X
	D =EQ(I,N) 1			;* if I == N, D=1
	D =EQ(I * D,1)	:(I)		;* if I == D == 1, D = 0. Goto I
O	Y =Y + 1			;* increment the counter
	O =O A<Y>	:S(O)		;* concatenate the array contents until last cell
	OUTPUT =O			;* and print
END



0

Pyth , 22 21 바이트

|seMhD,V*lz+PUQP_UQzz

n다음 s에 별도의 줄에 입력을 받습니다 . 여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오 .

|seMhD,V*lz+PUQP_UQzz   Implicit: Q=eval(input()), z=remaining input

             UQ         Range [0-Q)
            P           All but last from the above
                         e.g. for Q=3, yields [0,1]
               P_UQ     All but last of reversed range
                         e.g. for Q=3, yields [2,1]
           +            Concatenate the previous two results
                          e.g. for Q=3, yields [0,1,2,1]
        *lz              Repeat len(z) times
      ,V           z    Vectorised pair the above with z, truncating longer to length of shorter
                          e.g. for Q=3, z=WATERMELON, yields:
                          [[0,'W'],[1,'A'],[2,'T'],[1,'E'],[0,'R'],[1,'M'],[2,'E'],[1,'L'],[0,'O'],[1,'N']]
    hD                  Sort the above by the first element
                          Note this is a stable sort, so relative ordering between equal keys is preserved
  eM                    Take the last element of each
 s                      Concatenate into string
                          Note that if n=1, the result of the above will be 0 (sum of empty array)
|                   z   If result of above is falsey, yield z instead

편집 : 빈 검사를 처리 끝으로 이동하여 바이트를 저장했습니다. 이전 버전: seMhD,V*lz|+PUQP_UQ]0z


0

빨강 , 153 바이트

func[s n][i: v: m: 1 b: collect[foreach c s[keep/only reduce[v i c]v: v + m
if all[n > 1(i: i + 1)%(n - 1)= 1][m: -1 * m]]]foreach k sort b[prin last k]]

온라인으로 사용해보십시오!

설명:

f: func [ s n ] [                      ; s is the string, n is the height
    i: 1                               ; index of the current character in the string
    v: 1                               ; value of the "ladder"
    m: 1                               ; step (1 or -1)
    b: collect [                       ; collect the values in a block b
        foreach c s [                  ; foreach character in the string 
            keep/only reduce [ v i c ] ; keep a block of the evaluated [value index char] 
            i: i + 1                   ; increase the index
            v: v + m                   ; calculate the value 
            if all [ n > 1             ; if height is greater than 1 and
                    i % (n - 1) = 1    ; we are at a pick/bottom of the ladder
                   ]
                [ m: -1 * m ]          ; reverse the step
        ]
    ]
    foreach k sort b [ prin last k ]   ; print the characters in the sorted block of blocks
]

0

문제에 대한 두 가지 해결책이 있습니다. 내가 먼저 한 첫 번째 해결책은 바이트를 절약 할 것이라고 생각한 다른 방법을 생각했지만 어쨌든 포함시키지 않았습니다.


해결책 1

PHP , 152 (144) 116 바이트

<?php
for($i=0;$i<$n=$argv[2];$i++)
    for($j=$i;$s=$argv[1][$j];$j+=$n<2|(($f=!$f|!$i)?$i<$n-1?$n+~$i:$i:$i)*2)
        echo $s;
  • @JoKing 덕분에 8 바이트
  • @Shaggy 덕분에 28 바이트

온라인으로 사용해보십시오!


해결책 2

PHP , 162 바이트

<?php
$s=$argv[0];
$n=$argv[1];
$l=strlen($s);
for($i=0;$i<$l;){
    for($j=0;$j<$n&&$i<$l;)
        $a[$j++].=$s[$i++];
    for($j=$n-2;$j>0&&$i<$l;)
        $a[$j--].=$s[$i++];
}
echo join($a);

온라인으로 사용해보십시오!


당신은 초기화 할 필요가 없습니다 $f$n-1-$i수 있습니다 $n-~$i. 144 바이트
Jo King

@JoKing의 개선에 -28 바이트 .
Shaggy

웁; 때 중단됩니다 n=1. 이것은 동일한 바이트 수에서 작동합니다.
Shaggy

후에 당신은 또한 짧은 태그를 사용하여 공간을 제거 할 수 있습니다 echo5 개 이상의 바이트 저장
얽히고 설킨

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.