인터리빙 반전


20

문자열이 주어지면 인터리빙 방식으로 뒤집습니다. 0 인덱스로 abcdefghiabcdefghij에 대해 수행하는 방법은 다음과 같습니다 .

  1. 짝수 인덱스의 문자를 홀수 인덱스의 문자와 분리하십시오.
    아 세기
     bdfh
    아 세기 bdfhj
  2. 홀수 인덱스에서 문자를 뒤집습니다.
    아 세기
     hfdb
    아 세기 jhfdb
  3. 하나의 문자열로 다시 인터리브하십시오.
    ahcfedgbi 
    ajchefgdib

규칙

  • 짝수 길이와 홀수 길이 문자열을 모두 지원해야합니다.
  • 인덱스가 0 인 경우 홀수 인덱스에서 문자를 반전시키지 않아야합니다.
  • 물론 1- 인덱스 방식으로, 짝수 인덱스에서 문자를 뒤집지 않아야합니다.
  • 입력은 줄 바꿈이없는 인쇄 가능한 ASCII (코드 포인트 32-126)로 구성됩니다.
  • 문자열 또는 문자 목록 (1 문자 문자열이 아님)으로 입력 할 수 있습니다. 예를 들면 String/ char[]또는 char*허용되지만 String[]/ char[][]또는 char**수 없습니다.

테스트 사례

Input
Output

Hello, World!
HdlroW ,olle!

Hello World!
H!llooW rlde

ABCDEFGHIJKLMNOPQRSTUVWXYZ
AZCXEVGTIRKPMNOLQJSHUFWDYB

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 }"{$y&w(u*s,q.o0m2k4i6g8e:c<a>_@]B[DYFWHUJSLQNOPMRKTIVGXEZC\A^?`=b;d9f7h5j3l1n/p-r+t)v'x%z#|!~

P
P

AB
AB

xyz
xyz

빈 문자열의 경우 빈 문자열 자체를 반환하십시오.



나는 이것이 80 년대 나 90 년대에 아이들로 배운 "비밀 코드"(돼지 라틴어와 같은 종류)라는 것을 기억합니다. 내 친구와 나는 이것을 사용하여 비밀 메시지를 인코딩 할 것이며, 나는 우리 편지를 찾은 성인이 그 편지를 알아 낸 것으로 생각하지 않습니다 ...
phyrfox

@phyrfox 당신은 이것과 비슷한 레일 펜스 암호를 생각할 것입니다 .
Carmeister

아 기억 나네요
12Me21

답변:


7

젤리 , 7 바이트

s2ZU2¦Z

이것은 전체 프로그램입니다.

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

작동 원리

s2ZU2¦Z  Main link. Argument: s (string)

s2       Split s into pairs.
  Z      Zip/tranpose, grouping characters by the parity of their indices.
     ¦   Sparse application:
   U         Upend; reverse both strings in the pair.
    2        Replace the second string with the reversed string.
      Z  Zip/transpose, interleaving the two strings.

정확히 바이트 단위로 제 솔루션입니다.
Outgolfer Erik

3
모두 같은 생각이 훌륭합니다. ;)
Dennis

12

MATL , 8 바이트

t2L)P5M(

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

설명

t     % Implicit input. Duplicate
      % STACK: 'abcdefghi', 'abcdefghi'
2L    % Push [2, 2, 1j]. This represents 2:2:end when used as an index
      % STACK: 'abcdefghi', 'abcdefghi', [2, 2, 1j]
)     % Get entries at those indices
      % STACK: 'abcdefghi', 'bdfh'
P     % Flip
      % STACK: 'abcdefghi', 'hfdb'
5M    % Push [2, 2, 1j] again
      % STACK: 'abcdefghi', 'hfdb', [2, 2, 1j]
(     % Write entries at those indices. Implicit display
      % STACK: 'ahcfedgbi'

5
그래서 2L"밀어 [2,2,1j]"이며, 5M"밀어 [2,2,1j] 다시"입니다 ... 그리고 어떤 사람들은 골프의 언어를 읽을 수 없습니다 말!
Leo

3
@Leo :-D 2L는 미리 정의 된 리터럴을 생성합니다. 5M최근 함수 호출에 대한 입력을 저장하는 자동 클립 보드입니다. 실제로 2L동일한 바이트 수로 대체 될 수 있습니다.
Luis Mendo

7

Alice , 10 바이트

/ZY
\IOR@/

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

이 프로그램의 바이트 중 절반은 소스를 올바르게 포맷하는 데 사용되며 실제 명령은 IYRZOAlice가이 작업에 적합한 내장을 가지고 있기 때문에이 입니다.

설명

내가 말했듯이, 거울 ( /\), 줄 바꿈 및 @ip가 올바른 방향으로 움직이고 마지막에 프로그램을 종료하기 위해 있습니다. 선형화 된 실제 코드는 다음과 같습니다.

IYRZO
I      Input a line
 Y     Unzip it into its even positions and its odd ones
  R    Reverse the odd positions
   Z   Zip it back again
    O  Output

아주 간단합니다.


코너에서 거울이 어떻게 작동하는지 파악할 수 있다면 ...
Luis Mendo

@LuisMendo는 먼저 거울을 통과하여 기본 (수평 / 수직) 모드에서 서수 (대각선) 모드로 또는 그 반대로 변경합니다. 그런 다음 기본 모드 인 경우 줄 / 열의 다른쪽으로 줄 바꿈하는 반면, 서수 모드 인 경우 모퉁이로 되돌아옵니다. 이 경우 남동쪽 거울은 서수 모드에서 만나고, 추기경으로 전환하고 두 번째 줄의 시작 부분으로 랩핑합니다. 여기서 다른 거울은 다시 서수로 돌아가 북동쪽으로 이동하기 시작합니다
Leo

아, 그래서 수신 거부는 당신이 왔던 것과 같은 방향으로 만 대각선에 있습니다. 그런 다음 생각보다 간단합니다. 감사!
Luis Mendo

6

자바 (OpenJDK 8) , 108 96 94 93 바이트

@Neil의 깔끔한 사용법 을 사용 하여 1 바이트를 절약했습니다.s[s.length+~i|1]

String f(char[]s){int a=s.length,b=0;String c="";for(;b<a;b++)c+=s[b%2<1?b:a+~b|1];return c;}

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


1
100 바이트 미만의 Java는 합법적 인 것으로 간주됩니다.
Outgolfer Erik

" Java (OpenJDK 8 ) "그렇다면 왜 재귀없이 Java 7 메소드를 사용하고 있습니까? 대체하여 자바 8 람다를 사용 String f(char[]s)하여 s->... 그리고 당신은 넣어 아니라 바이트를 저장할 수 있습니다 int내부에 대한 루프 초기화를 : for(int a=s.length,b=0;b<a;b++). 온라인으로 사용해보십시오.
Kevin Cruijssen



3

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

f=
s=>s.replace(/./g,(c,i)=>i%2?s[s.length+~i|1]:c)
<input oninput=o.textContent=f(this.value)><pre id=o>


3

젤리 , 9 바이트

Ḋm2U
m2żÇ

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

Ḋm2U Helper Link -> Dequeue (return last len-1 elements), take every second element, reverse
m2żÇ Main Link -> Take every second element, then interleave with the result of the helper link

Dennis 덕분에 -1 바이트


당신이 교체하는 경우 ¢Ç, 당신은 필요하지 않습니다 ³도우미 링크.
Dennis

@Dennis 오 내가 처음으로 생각한 것> _> 신경 쓰지 마라, 뭔가 망 쳤어. 감사!
HyperNeutrino

3

망막 ,17 13 바이트

O^$`(?<=\G.).

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

Neil 덕분에 오류가 수정되었습니다.

Kobi 덕분에 4 바이트를 절약했습니다.

홀수 개의 문자가 앞에 오는 각 문자를 선택하고 반대로합니다. \G마지막 일치와 일치하는를 사용하여 이를 수행합니다 .


마지막 테스트 케이스가 잘못되었습니다. $대신 대신 사용해야 합니다 #.
Neil

@Neil Whoops, 당신은 완전히 옳습니다. 결정된!
FryAmTheEggman

\Glookbehind에서 대신 사용할 수 있으며$ : O^`(?<=\G.).(12 bytes)
Kobi

1
@ 고비 팁 주셔서 감사합니다! 그러나 불행히도 $모든 입력이 사전 사전 순으로 정렬되어 있기 때문에 제거 할 수있는 것처럼 보였습니다 . 코드가 실패하는 새로운 테스트 사례를 추가했습니다.
FryAmTheEggman

@FryAmTheEggman-알겠습니다. 운이 좋았다고 생각합니다.
Kobi

2

PHP> = 7.1, 58 바이트

for(;$i<$l=strlen($a=$argn);$i++)echo$a[$i&1?-$i-$l%2:$i];

온라인 버전


1
완전한. OS는 더 많이 입력해야한다고 말하지만, 그 7 개의 문자는 모든 것을 말합니다.
Titus

2

APL (Dyalog) , 9 바이트

⎕IO←0홀수 및 짝수를 올바르게 정의하려면 많은 시스템에서 기본값이 필요합니다 .

⌽@{2|⍳≢⍵}

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

 역

@ 마스크에 의해 필터링 된 요소에서

{ 익명 함수

2| 의 모드 -2

 지수

 탈리 (길이)

 논쟁 거리

} 논쟁에


이 질문이 게시되었을 때 v16도 나오지 않았습니까?
Zacharý

@ Zacharý 베타 버전이지만 더 이상 중요하지 않습니다 .
Adám

오, 이제 v17을 사용하겠습니까?
Zacharý

1

로다 , 34 바이트

f a{a/=""a[::2]<>reverse(a[1::2])}

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

설명

a/=""                    Convert the argument a into an array of length-1 strings
      <>                 Interleave
a[::2]                   Every even element of a with
        reverse(a[1::2]) Every odd element of a reversed

동일한 바이트 수의 대체 솔루션이 있습니다.

36 34 바이트

{[_/""]|_[::2]<>reverse(_1[1::2])}

이것은 입력 스트림에서 문자열로 입력을받는 익명 함수입니다.




1

하스켈 , 63 바이트

(_:r)!(a:s)=a:s!r
_!_=[]
f s=([' '|even$length s]++reverse s)!s

온라인으로 사용해보십시오! 사용법 : f "some string".

와 같은 홀수 문자열의 abcdefghi경우 함수 f는 문자열과 그 역전을 함수에 전달하여 !두 문자열에서 문자를 가져 오는 것을 번갈아 가며 보냅니다. 문자열조차도 작동하지 않으므로 오프셋을 올바르게 얻으려면 먼저 더미 문자를 추가해야합니다.


1

C, 69 바이트

c,l;f(char*s){l=strlen(s);for(c=0;c<l;++c)putchar(s[c&1?l-l%2-c:c]);}

꽤 간단합니다. 문자열을 걸어 현재 문자 또는 반대 문자를 인쇄합니다.

언 골프하고 설명 :

f(char *str) {
    int len = strlen(str);      // Get the total length
    for(int c = 0; c<len; ++c)  // Loop over the string
        putchar(s[              // Print the char that is,
            c & 1               // if c is odd,
                ? l - l % 2 - c // c chars from the end (adjusting odd lengths),
                : c             // and at index c otherwise
        ]);
}

1

수학, 82 바이트

""<>(f=Flatten)[{#&@@#,Reverse@Last@#}&@f[Characters@#~Partition~UpTo@2,{2}],{2}]&

1

apt , 14 13 바이트

12 바이트 코드, -P플래그는 +1

@Shaggy 덕분에 1 바이트 절약

¬ë íU¬Åë w)c

설명:

¬ë íU¬Åë w)c
¬                   Split the input into an array of chars
 ë                  Get every other char, starting at index 0
   í                Pair with:
    U¬                Input, split into a char array
      Å               .slice(1)
       ë              Get every other char
         w            Reverse
           c       Flatten
-P                 Join into a string

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


흠, ë2,1오히려 추악합니다. ó o아마도 당신이 대신 할 수 있다고 생각합니다 .
ETHproductions

@ETHproductions 그래, 나도 Åë작동하는 것 같아 .
Oliver

오, 좋은 것 :-)
ETHproductions


1

K (oK) , 18 바이트

해결책:

{x[w:&2!!#x]:x@|w}

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

예 :

> {x[w:&2!!#x]:x@|w}"Hello, World!"
"HdlroW ,olle!"
> {x[w:&2!!#x]:x@|w}"Hello World!"
"H!llooW rlde"

설명:

대부분 오른쪽에서 왼쪽으로 해석되고, 홀수 표시 문자를 찾아서 뒤집어 문자열에 다시 넣습니다.

{x[w:&2!!#x]:x@|w} / solution
{                } / lambda function with implicit parameter x
         #x        / count x,    #"Hello, World!" -> 13
        !          / til,        !13 -> 0 1 2 3 4 5 6 7 8 9 10 11 12
      2!           / 2 modulo,   2!0 1 2 3 4 5 6 7 8 9 10 11 12 -> 0 1 0 1 0 1 0 1 0 1 0 1 0
     &             / where true, @0 1 0 1 0 1 0 1 0 1 0 1 0 -> 1 3 5 7 9 11
   w:              / store in variable w
               |w  / reverse w,  |1 3 5 7 9 11 -> 11 9 7 5 3 1
             x@    / index into x at these indices
 x[        ]:      / assign right to x at these indices

1

J, 26 바이트

[:,@,./(0 1$~#)]`(|.@])/.]

언 골프

[: ,@,./ (0 1 $~ #) ]`(|.@])/. ]

설명

  • (0 1$~#)]`(|.@])/.]/.를 사용 하여 입력을 짝수 / 홀수 그룹으로 나누십시오. 입력 (0 1$~#)길이에 주기적으로 0과 1을 반복하여 그룹 정의를 작성하십시오. 우리는 주요 동사에 건의 한 형태의 키를 사용하는데 ]`(|.@]), 이는 첫 번째 그룹에 신원을 적용하고 두 번째 그룹을 뒤집습니다 (|.@]).
  • 이제 우리는 홀수 그룹을 뒤집은 두 그룹을 가지게되었습니다. ,@,./

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


21 바이트 (\:2|#\)({~/:)#\<.#\., 19 바이트 [:,@,./]]| ./. ~ 2 | #`
miles

감사합니다 마일. 두 번째 오타가 있습니까? 내가지고있어 오류
요나

@ 마일즈도 첫 번째 방법 : 구문 분석 및 기술적으로 발생하는 상황을 이해하지만 전반적인 전략을 보지 못했습니다. 당신은 명확히 할 수 있습니까?
Jonah

아, [:,@,./]]`|./.~2|#\
마일

17 바이트0,@|:]]`|./.~2|#\
마일

0

파이썬 3, 93 87 바이트

lambda s:"".join("".join(t)for t in zip(s[::2],reversed(s[1::2])))+("",s[-1])[len(s)%2]

교체 reversed(s[1::2])s[1::2][::-1]할인율 4 바이트
씨 Xcoder에게

결국 83 바이트까지 내려 가며 골프를 즐길 수 있습니다.f=lambda s,j="".join:j(j(t)for t in zip(s[::2],s[1::2][::-1]))+("",s[-1])[len(s)%2]
Mr. Xcoder

0

펄 6 ,  63 58  55 바이트

{[~] .comb[{flat roundrobin (0,2...^*>=$_),[R,] 1,3...^*>=$_}]}

그것을 테스트

{[~] flat roundrobin .comb[{0,2...*},{$_-1-$_%2,*-2...*}]}

그것을 테스트

{[~] flat roundrobin .comb[{0,2...*},{[R,] 1,3...^$_}]}

그것을 테스트

{  # bare block lambda with implicit parameter 「$_」

  [~]                 # reduce using string concatenation operator

    flat              # make the following a flat list

    roundrobin        # grab one from each of the following 2 lists,
                      # repeat until both are empty

    .comb\            # split the input into graphemes (implicit method call)

    [                 # index into that sequence



      { 0, 2 ... * }, # code block producing every non-negative even number


      {               # code block producing reversed odd numbers
                      # (「$_」 here contains the number of available elements)

        [R,]          # reduce with reversed comma operator
                      # (shorter than 「reverse」)

        1, 3 ...^ $_  # odd numbers stopping before it gets
                      # to the number of input elements
      }


    ]
}

입력 목록 중 하나가 소진 되 자마자 멈추기 때문에 roundrobin대신 에 사용해야했습니다 .zipzip




0

GNU APL 1.2, 24 바이트

R[X]←⌽R[X←2×⍳⌊.5×⍴R←⍞]◊R

APL은 오른쪽에서 왼쪽으로 작동합니다. ⍴R←⍞사용자 입력을 할당 R한 다음 길이를 평가합니다. 플로어 기능 을 곱하고 .5적용 하여이를 반으로 줄 입니다. 1에서 인수까지 모든 숫자를 반환합니다.

APL은 배열에서 작동하므로 방금 각 요소의 배가 된 배열 은 짝수 인덱스 (1 인덱스)를 제공합니다.⎕IO )를 제공합니다 .1에 .

벡터의 여러 인덱스에 액세스 할 때 APL은 벡터의 해당 인덱스에있는 요소를 제공합니다. R[X←2×⍳⌊.5×⍴R←⍞]짝수 색인 요소 만 제공합니다. 요소를 반대로합니다. 그런 다음 반전 된 값을 짝수 인덱스에 다시 지정하십시오 (이 인덱스를 지정하여 X6 바이트 를 절약 함).

문 구분 기호입니다. 반전이 완료된 후 평가 R하여 결과를 인쇄하십시오.


0

-F 플래그 = 49 바이트의 경우 Perl 5, 46 + 3

while(++$x<@F){print$F[$x%2?$x-1:@F-$x-$#F%2]}

사용 -F플래그를 입력을 문자 배열로 자동 분할합니다.@F . 배열을 반복하고 홀수 입력의 끝에서 짝수 인덱스 또는 해당 인덱스 (홀수 길이 문자열에 대한 것)의 해당 요소를 출력합니다.

후행 줄 바꿈으로 입력을받습니다. 후행 줄 바꿈없이 사전 증분을 변경할 수 있습니다.$x 사후 .

좀 더 읽기 쉽다 :

while(++$x<@F) { #While the index is less than the number of elements in the array. $x is 1-indexing the array despite the fact that perl is 0-indexed because it keeps us from having to use a proper for loop or a do-while loop
    if($x%2) { #If $x is odd
        print $F[$x-1] #Print the element
    } else {
        print $F[@F-$x-$#F%2] #Print from the end. $#F%2 fixes it for odd length strings    
    }
}

0

05AB1E , 21 바이트

DgÉi¶«}2ô.BøRćR‚˜øJ¶K

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

나는 이것이 05AB1E에서 아직 수행되지 않은 이유를 추측하고 있습니다.

또 다른 경우에는 zip기능 대신 자동 드롭-마지막 요소가 아프게됩니다.

추신 : 당신이 내 대답에 개선 제안이 있다면, 당신의 자신을 게시; 당신이 요점을 얻도록 보증하기에 충분할 것입니다. 나는이 대답이 매우 부끄럽다.


0

q / kdb +, 70 56 47 38 35 29 27 바이트

해결책:

{x[w]:x(|)w:(&)#:[x]#0 1;x}

예:

q){x[w]:x(|)w:(&)#:[x]#0 1;x}"Hello, World!"
"HdlroW ,olle!"
q){x[w]:x(|)w:(&)#:[x]#0 1;x}"Hello World!"
"H!llooW rlde"

설명:

문자열의 홀수 색인을 찾아서이 목록을 뒤집고이 지점에서 요소를 가져온 다음 원래 문자열에 해당 위치에 다시 할당하십시오.

{x[w]:x reverse w:where count[x]#0 1;x} / ungolfed
{                                   ; } / lambda function with two lines
                                 0 1    / the list (0;1)
                                #       / take
                        count[x]        / length of input
                  where                 / indices where this is > 0
                w:                      / save in variable w
        reverse                         / reverse this list
      x                                 / index into x at these points
     :                                  / assignment             
 x[w]                                   / assign x at indices with new values
                                     x  / return x

편집 :

  • -9 바이트; 출력 전환 count에 대해 (#:), til에 대해 (!), where에 대한 (&:)reverse대한 (|:).

  • -3 바이트; 출력 스위칭 (#:)을 위해 (#), (&:)대한 (&)(|:)대한(|)

  • -6 바이트; 완전한 다시 쓰기

  • -2 바이트; 적용하지 않고 과제를 사용하는 것


0

05AB1E , 12 바이트

RDgÈúøvyNÉè?

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

RDgÈúøvyNÉè?   Implicit input: "abcdefghij"
R              Reverse the string: "jihgfedcba"
 DgÈú          Put (length is even?1:0) spaces in front of it " jihgfedcba"
     ø         Zip (reinjects the input implicitly): ["a ", "bj", "ci", ...]
      vy       For each element of the list
        NÉè    Extract&push element[iteration is odd?1:0] 
           ?   Print without newline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.