インターレース文字列


34

あなたの課題は、同じ長さの2つの文字列が与えられたときに、他のすべての文字をスワップし、結果の文字列をいずれかの順序で出力/返すプログラムまたは関数を書くことです。

"Hello," "world!" --> "Hollo!" "werld,"
"code" "golf" --> "codf" "gole"
"happy" "angry" --> "hnpry" "aagpy"
"qwerty" "dvorak" --> "qvertk" "dworay"
"1, 2, 3" "a, b, c" --> "1, b, 3" "a, 2, c"
"3.141592653589" "2.718281828459" --> "3.111291623489" "2.748582858559"
"DJMcMayhem" "trichoplax" --> "DrMcMoylex" "tJichapham"
"Doorknob" "Downgoat" --> "Doonkoot" "Dowrgnab"
"Halloween" "Challenge" --> "Hhlloeegn" "Caallwnee"

ルール

  • 文字列にはASCII文字(32-126)のみが含まれます。
  • 文字列は常に同じ長さで、空になることはありません。
  • 任意の適切な形式の入力を受け入れることができます。個別のパラメーター、配列内の項目、1つ以上の改行で区切られ、連結されます。唯一の制限は、1つの文字列がもう一方の文字列よりも完全に前に来る必要があることです(たとえばa1\nb2\nc3、for "abc", "123"は無効です)。
  • 出力はどちらの順序でもかまいません(つまり、1番目または2番目の文字からスワップを開始できます)。また、上記の有効な形式でもかまいません。(改行で区切られた連結された2項目配列など)

得点

これはであるため、各言語のバイト単位の最短コードが優先されます。


11
+1 DrMcMoylex。:D
DJMcMayhem

3
「Dowrgnab」アナグラムから「Downgrab」(͡°͜ʖ͡°)
ママファンロール

「どちらの順序でも」ルールは、スワッピングが最初の文字または2番目の文字から開始できることを明示的に指摘する必要があります。
DLosc

@DrMcMoylex コード、ゴルフの例を見てください。2番目の文字からスワップを開始すると、c o d f、g o l eが得られます。最初の文字から開始:g o l e、c o d f。
DLosc

回答:


14

Haskell、37バイト

l=(,):flip(,):l
(unzip.).zipWith3($)l

2つの文字列を圧縮し、文字を交互に交換してから解凍します。

37バイトの再帰的な代替:

(a:b)?(c:d)=a:d?b
e?_=e
a%b=(a?b,b?a)

9

Python、I / Oゴルフで42バイト

def f(a,b):a[1::2],b[1::2]=b[1::2],a[1::2]

2つのリストの他のすべての文字を交換します。入力として文字の2つのリストを受け取り、それらを変更して出力します

l=list('cat')
m=list('dog')    
print l,m

def f(a,b):a[1::2],b[1::2]=b[1::2],a[1::2]

f(l,m)
print l,m

与える

['c', 'a', 't'] ['d', 'o', 'g']
['c', 'o', 't'] ['d', 'a', 'g']

1
それは賢いです。入力/出力形式は柔軟性が高すぎると思いますか?
ETHproductions

@ETHproductions確かではありませんが、リストが文字列よりも非常に操作しやすいのは、ほとんどがPython固有のものです。
-xnor

8

VIM、18、17のバイト

qqyljvPkvPll@qq@q

オンラインでお試しください!

下位互換性のため、これはVインタープリターを使用します。入力の形式は次のとおりです。

string1
string2

説明:

 qq                 " Start recording in register 'q'
   yl               " Yank one letter
     j              " Move down a row
      vP            " Swap the yanked letter and the letter under the cursor
        k           " Move back up a row
         vP         " Swap the yanked letter and the letter under the cursor
           ll       " Move two letters to the right. This will throw an error once we're done
             @q     " Call macro 'q' recursively
               q    " Stop recording.
                @q  " Start the recursive loop

用いて切断二文字のx代わりにyl、次にジュースPの代わりに第二vPlqqxjvPkPll@qq@q
Hauleth

@lukasz私は最初にそれを試しましたが、何らかの理由で、それは何度も実行し、最後の文字を実行すべきでないときに交換します。私はそれにいくつかのより多くのけれども見ていきます
DJMcMayhem

私の作品はv.tryitonline.net/...
Hauleth

1
@ŁukaszNiemierそのリンクには、私が投稿したものと同じコードがあります。あなたはヒットしました[save]]ボタンを?いずれにせよ、それは私のために働いていません。本当の理由はx、行の最後のキャラクターがカーソルを左に動かし、スワップの配置を台無しにしてしまうからです。
DJMcMayhem

6

Haskell、41バイト

(a:b)#(c:d)=(a,c):d#b
_#_=[]
(unzip.).(#)

文字列とのペアを返します。使用例:( (unzip.).(#) ) "Hello," "world!"-> ("Hollo!","werld,")

単純な再帰アプローチ:各文字列の最初の文字をペアとして取得し、(残りの)文字列を交換して再帰呼び出しを追加します。unzipペアのリストからリストのペアを作成します。


6

05AB1E11 10バイト

øvyNFÀ}})ø

オンラインでお試しください!

説明

input = ["code", "golf"]例として使用されます。

ø             # zip strings into list of pairs
              # STACK: ['cg', 'oo', 'dl', 'ef']
 vy           # for each pair
   NFÀ        # rotate left index times
      }}      # end-if, end-loop
              # STACK: 'cg, 'oo', 'dl', 'fe'
        )ø    # wrap in list and zip
              # OUTPUT: ['codf', 'gole']

5

Perl、48バイト

バイトカウントには、47バイトのコードと-pフラグが含まれます。

say<>=~s%.\K(.)%"s/.{$-[0]}\\K(.)/$1/;\$1"%geer

で実行し-p-Eフラグを立てます。各文字列が異なる行にあることを期待します。

perl -pE 'say<>=~s%.\K(.)%"s/.{$-[0]}\\K(.)/$1/;\$1"%geer' <<< "Hello
World"

説明

-p:入力をキャプチャ$_し、最後に出力します。(最初の文字列を取得して印刷するには)
<>:入力行を取得します。(2番目の文字列を取得するため)。
=~:に正規表現を適用する<>s%%%geerここで、おかげでr変更された文字列を返す(およびその後のおかげで印刷されていますsay)。
正規表現:
.\K(.)2つの文字を見つけ、2番目の文字をこのコードの評価結果に置き換えます"s/.{$-[0]}\\K(.)/$1/;\$1"
最初の部分、s/.{$-[0]}\\K(.)/$1/正規表現を適用します$_.{$-[0]}最初の文字をスキップして、外側の正規表現と同じポイントに到達し$-[0]ます(最初のキャプチャグループのインデックス、したがって、その場合は、置換する文字のインデックス)、次に文字をキャプチャします(.)そして、それを外側の正規表現の文字($1)に置き換えます。そして$1、その結果が"s/.{$-[0]}\\K(.)/$1/;\$1"内側の正規表現でキャプチャした文字になるように追加します。
あなたはそれに気づいたかもしれない$1私達はと遊ぶので、我々は両方の文字列(その二つの異なる文字)に置き換えたい文字を参照してください/ee二回正規表現の右側を評価する正規表現の修飾子:最初の1のみが置換されます$1そのISN \。が前に付かない


5

Python、55バイト

lambda a,b:[(-~len(a)/2*s)[::len(a)+1]for s in a+b,b+a]

スライス!

58バイト:

def f(a,b):n=len(a);print[(s*n)[:n*n:n+1]for s in a+b,b+a]

64バイト:

f=lambda a,b,s='',t='':a and f(b[1:],a[1:],s+a[0],t+b[0])or[s,t]

2つの文字列の文字をstに再帰的に蓄積し、最後にそれらのペアを出力します。代替は、各再帰呼び出しで入力文字列を切り替えることによって行われます。スペースで区切られた文字列の出力は同じ長さでした:

lambda a,b,s='',t=' ':a and f(b[1:],a[1:],s+a[0],t+b[0])or s+t

これは、2つの可能な文字列のそれぞれを最初の文字列として、各文字列から文字を交互に取得するという異なる再帰戦略をわずかに打ち負かしました。(65バイト)

g=lambda a,b:a and a[0]+g(b[1:],a[1:])
lambda a,b:(g(a,b),g(b,a))

4

MATL11 10 9 8バイト

1バイトオフのETHproductionsに感謝します!

"@X@YS&h

入力は、次のような2つの文字列を含む2D配列です['Halloween'; 'Challenge']。出力文字列は逆順です。

オンラインでお試しください!

説明

        % Input 2D array implicitly
"       % For each column
  @     %   Push current column
  X@    %   Push iteration index, starting at 1
  YS    %   Circularly shift the column by that amount
  &h    %   Concatenate horizontally with (concatenated) previous columns
        % End implicitly
        % Display implicitly

古いバージョン:9バイト

tZyP:1&YS

説明

        % Take input implicitly
t       % Duplicate 
        % STACK: ['Halloween'; 'Challenge'], ['Halloween'; 'Challenge']
Zy      % Size
        % STACK: ['Halloween'; 'Challenge'], [2 9]
P       % Flip array
        % STACK: ['Halloween'; 'Challenge'], [9 2]
:       % Range. Uses first element of the array as input
        % STACK: ['Halloween'; 'Challenge'], [1 2 3 4 5 6 7 8 9]
1&YS    % Circularly shift each column by those amounts respectively
        % STACK: [Caallwnee';'Hhlloeegn']
        % Display implicitly

@ETHproductionsはい!ありがとうございました!
ルイスメンドー

4

ゼリー、5 バイト

żṚż¥/

入力は個別の引数として、出力は連結されます。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

żṚż¥/  Main link. Left argument: s (string). Right argument: t (string)

ż      Zipwith; yield the array of pairs of corresponding characters of s and t.
   ¥   Combine the two links to the left into a dyadic chain:
 Ṛ         Reverse the chain's left argument.
  ż        Zip the result with the chain's right argument.
    /  Reduce the return value of the initial ż by the quicklink Ṛż¥.




3

JavaScript(ES6)、51 54

3バイト保存されたthx @Neilを編集

配列の入出力がある関数

p=>p.map((w,i)=>w.replace(/./g,(c,j)=>p[i+j&1][j]))

私はこれがもう1つ好きですが、55です(入力に2つの文字列、出力に配列)

(a,b)=>[...a].reduce(([p,q],c,i)=>[q+c,p+b[i]],['',''])

テスト

f=
p=>p.map((w,i)=>w.replace(/./g,(c,j)=>p[i+j&1][j]))

function go() {
  var a=A.value, b=B.value
  if (a.length == b.length)
    O.textContent = f([a,b]).join('\n')
  else
    O.textContent = '- different length -'
    
}

go()
<input id=A value='Hello,'><input id=B value='world!'>
<button onclick='go()'>go</button><pre id=O></pre>


replace3バイト節約します:p=>p.map((w,i)=>w.replace(/./g,(c,j)=>a[i+j&1][j]))
ニール


2

JavaScript(ES6)、55バイト

f=([c,...s],[d,...t],o="",p="")=>c?f(t,s,o+c,p+d):[o,p]

私は正規表現を使用して代替文字を置き換えることで何か巧妙なことをしたかったのですが、最終的には67 57バイトかかりました:

a=>a.map((s,i)=>a[+!i].replace(/.(.?)/g,(_,c,j)=>s[j]+c))

いいね 私が持っていたf=([a,...A],[b,...B])=>a?[a+f(B,A)[0],b+f(A,B)[0]]:[""]同じ長さのために。
ETHproductions

もっと良くしたかったのですが、まさか1つ少なくなりました。非再帰的な回答を投稿する時間
-edc65

@ edc65使用するのmapは良いアイデアで、正規表現の回答から10バイト削り取られました。それでも長すぎます。
ニール

2

Perl、40バイト

+1を含む -n

STDINの行として文字列を指定します

interlace.pl
hello
world
^D

interlace.pl

#!/usr/bin/perl -n
s/./${1&$.+pos}[pos]=$&/seg}{print@0,@1

2

Java、132 103 100バイト

配列を返すこと(他の改善点もある)と29バイトの節約を提案してくれたKevin Cruijssenに感謝します!オリビエ・グレゴワールも3バイト!

char[]c(char[]s,int l){for(int o=l;o-->0;)if(o%2>0){char t=s[o];s[o]=s[l+o+1];s[l+o+1]=t;}return s;}

このように呼び出されます:

public static void main(String[] args) {
    System.out.println(c("Hello,world!".toCharArray(), 5)); // 5 is the length of each "String"
}

出力:

Hollo,werld!

入力は基本的に任意の方法でフォーマットできるという事実(この場合、コンマで区切られた文字列の単一のchar配列)を利用し、出力規則も非常に緩やかです。


こんにちは、元の入力形式です。ただし、もっとゴルフをすることもできます:char[]c(char[]s,int l){for(int o=l,t;o-->0;)if(l%2>0){t=s[l];s[l]=s[l+o+1];s[l+o+1]=(char)t;}return s;}103バイト)出力を直接印刷する代わりに返します。入力例:System.out.println(c("Hello,world!".toCharArray(), 5));; 出力例:Hollo,werld!
ケビンCruijssen 16年

確かに、何らかの理由でchar配列を返すことを考えていませんでした。それは素晴らしいことです!
ヒピノ

結果はそうHollo!werld,であるべきですHollo,werld!(句読点は正しくありません)。私は、これが6の代わりに5の入力値に固定することができると信じ
オリヴィエグレゴワール

にキャストtしているのでchar、forループで直接宣言してみませんcharか?そうすることで、数バイトを節約できます。
オリビエグレゴワール

残念ながら、forループ初期化子内でcharを宣言することはできませんが、charを個別に宣言する方がキャストより短く、実際に1バイト単位であるかどうかを確認するよう促しました。
ヒピノ

1

C、124バイト

main(c,v)char**v;{char a[99],b[99];for(c=0;v[1][c]^0;++c){a[c]=v[1+c%2][c];b[c]=v[2-c%2][c];}a[c]=0;b[c]=0;puts(a);puts(b);}

で呼び出す:

program.exe string1 string2

文字列の長さは98文字に制限されています。



1

ラケット208バイト

(let((sl string->list)(ls list->string)(r reverse))(let p((s(sl s))(t(sl t))(u'())(v'())(g #t))(if(null? s)
(list(ls(r u))(ls(r v)))(p(cdr s)(cdr t)(cons(car(if g s t))u)(cons(car(if g t s))v)(if g #f #t)))))

ゴルフをしていない:

(define (f s t)
  (let ((sl string->list)                ; create short names of fns
        (ls list->string)
        (r reverse))
    (let loop ((s (sl s))                ; convert string to lists
               (t (sl t))
               (u '())                   ; create empty new lists
               (v '())
               (g #t))                   ; a boolean flag
      (if (null? s)                      ; if done, return new lists converted back to strings
          (list (ls (r u))
                (ls (r v)))
          (loop (rest s)
                (rest t)                 ; keep adding chars to new lists alternately
                (cons (first (if g s t)) u) 
                (cons (first (if g t s)) v)
                (if g #f #t))            ; alternate the boolean flag
          ))))

テスト:

(f "abcdef" "123456")

出力:

'("a2c4e6" "1b3d5f")

上記は再帰バージョンです。

反復バージョン:

(let*((sl string->list)(ls list->string)(r reverse)(s(sl s))(t(sl t))(l'())(k'())(p(λ(a b g)(set! l(cons(if g a b)l))
(set! k(cons(if g b a)k)))))(for((i s)(j t)(n(in-naturals)))(p i j(if(= 0(modulo n 2)) #t #f)))(list(ls(r l))(ls(r k))))

ゴルフをしていない:

(define (f s t)
  (let* ((sl string->list)              ; create short form of fn names
         (ls list->string)
         (r reverse)

         (s (sl s))                     ; convert strings to lists
         (t (sl t))

         (l '())                        ; create empty lists for new sequences
         (k '())

         (p (λ(a b g)                   ; fn to add chars to one or other list
              (set! l (cons (if g a b) l))
              (set! k (cons (if g b a) k)))))

    (for ((i s)(j t)(n (in-naturals)))  ; loop with both strings
          (p i j                        ; add to new lists alternately
             (if (= 0 (modulo n 2)) #t #f)))

    (list (ls (r l))                  ; convert reversed lists to strings
          (ls (r k)))))

1

PowerShell v2 +、82バイト

param($a,$b)$i=0;[char[]]$a|%{$c+=($_,$b[$i])[$i%2];$d+=($b[$i],$_)[$i++%2]};$c;$d

まだゴルフをしています...いや。他の答えのように正規表現を使用せずにこれをゴルフダウンすることはできないようです(コピーアルゴリズムのブーイング)。

そのため$a$b文字列として、インデックス$iをに設定し、-array として0キャスト$achar、ループを介して送信します|%{...}。各繰り返し、我々している文字列を連結へ$c$d、アレイを選択し(すなわち、前後に交互にそれがよう)にインデックスを付けることもできます。次に、パイプラインを離れて$c、プログラムの完了時に$d暗黙的な出力Write-Outputが行われます。


1

Lithp、120文字(-v1フラグの場合は+3)

読みやすくするために行を2つに分割:

#P::((invoke P "map" (js-bridge #W,I::(replace W (regex "." "g")
     (js-bridge #C,J::(index (index P (& (+ I J) 1)) J))))))

一部の関数はまだ標準ライブラリの一部ではない-v1ため、フラグが必要run.jsです。

サンプル使用法:

(
    (def f #P::((invoke P "map" (js-bridge #W,I::(replace W (regex "." "g")
                (js-bridge #C,J::(index (index P (& (+ I J) 1)) J)))))))
    (print (f (list "Hello," "world!")))
)

標準ライブラリに十分な時間を費やしていないこの種のハイライト。js-bridge/12回使用し、長い正規表現形式を使用invoke/*する必要があるほか、すべてを使用してmapを呼び出すと、必要以上に長くなります。

私の標準ライブラリでさらに作業する時間だと思います。


1

PHP、79バイト

for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][+$i]??" $y";

以前のバージョンのPHP、82バイト

for(;$i<strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])$x.=$a[1+$i%2][$i];echo"$x $y";

for(...)echo$a[1+$i%2][$i];echo" $y";(-2)
タイタス

Titusのコメントの構築for(;$i<=strlen(($a=$argv)[1]);$y.=$a[2-$i%2][$i++])echo$a[1+$i%2][$i]??" $y";はさらに-2ですが、
PHP

@ user59178素敵ですが、さらに1バイトが必要です
ヨルグヒュルサーマン

あなたは?それは私のために働く、あなたはちょうど得るNotice: String offset cast occurred in Command line code on line 1
-user59178

@ user59178はい、最初の単語の最初の文字を印刷するには
ヨルグヒュルサーマン

1

C、54 52バイト

f(char*a,char*b,char*c){while(*c++=*a++,*c++=*b++);}

出力cがすでに望ましい長さを持っていると仮定します。

使用法:

main(){
 char a[]="123456";
 char b[]="abcdef";
 char c[sizeof(a)+sizeof(b)-1];
 f(a,b,c);
 puts(c);

}

出力の作成を主張する場合、91バイトのソリューションがあります

char*g(char*a,char*b){char*c=malloc(2*strlen(a)),*d=c;while(*c++=*a++,*c++=*b++);return d;}

使用法:

main(){
 char a[]="123456";
 char b[]="abcdef";
 puts(g(a,b));
}

0

C、150バイト

ヘッダーファイルとmain()の戻り型とreturnステートメントの典型的な省略を使用しました。警告がスローされますが、問題なくコンパイルされます。また、変数式を使用した配列宣言を可能にするGCC固有のトリックも使用しました。

プログラムはコマンドラインからの文字列を想定しているため、プログラムはで実行する必要があります./a.out string1 string2

main(int a,char**v){int x=strlen(v[1]);char s[x],t[x],c;strcpy(s,v[1]);strcpy(t,v[2]);for(a=0;a<x;++a)if(a%2)c=s[a],s[a]=t[a],t[a]=c;puts(s),puts(t);}

またはより読みやすく、

main(int a,char**v){
    int x=strlen(v[1]);
    char s[x],t[x],c;
    strcpy(s,v[1]);strcpy(t,v[2]);
    for(a=0;a<x;++a)
        if(a%2)c=s[a],s[a]=t[a],t[a]=c;
    puts(s),puts(t);
}

0

Mathematica、51バイト

入力を文字の2つの配列の配列として受け取り、出力を同じ形式にします。この関数は、(mod 2)操作を使用して新しい配列を作成するだけです。

Table[#[[Mod[j+i,2]+1,j]],{i,2},{j,Length@#[[1]]}]&

0

QBasic 4.5、172バイト

痛い、これは古いQBasicで苦痛になります...

DEFSTR A-D:INPUT A,B
IF LEN(A)MOD 2=1 THEN A=A+" ":B=B+" "
FOR x=1 TO LEN(A) STEP 2
C=C+MID$(A,x,1)+MID$(B,x+1,1):D=D+MID$(B,x,1)+MID$(A,x+1,1):NEXT:?RTRIM$(C),RTRIM$(D)

おもしろい事実:をDEFSTR使用すると、のA代わりにを使用できるため、コストよりも多くのバイトを節約できますa$


0

QBIC、112バイト

QBICは多くのQBasicボイラープレートを合理化できますが、MID$QBICにはサブストリング関数がないため、QBasicでメインエンジンを実行する必要があります。それでも、60バイト節約できます。

;;_LA|~a%2=1|A=A+@ | B=B+C][1,a,2|X=X+$MID$(A$,b,1)+MID$(B$,b+1,1):Y$=Y$+MID$(B$,b,1)+MID$(A$,b+1,1)|]?_tX|,_tY|

MIND$=> MIN$テキスト。
チャールズではないチャールズ

0

Java、68バイト

(a,b)->{for(int i=a.length;--i>0;){char t=a[--i];a[i]=b[i];b[i]=t;}}

非ゴルフとテスト

import java.util.Arrays;
import java.util.Collection;
import java.util.function.BiConsumer;

public class Main {

  static BiConsumer<char[], char[]> func = (left, right) -> {
      for (int i = left.length; --i > 0;) {
        char temp = left[--i];
        left[i] = right[i];
        right[i] = temp;
      }
    };

  public static void main(String[] args) {
    test("Hello,","world!", "Hollo!", "werld,");
    test("code", "golf", "codf", "gole");
    test("happy", "angry", "hnpry", "aagpy");
  }

  private static void test(String left, String right, String x, String y) {
    char[] leftChars = left.toCharArray();
    char[] rightChars = right.toCharArray();
    func.accept(leftChars, rightChars);
    Collection mixed = Arrays.asList(new String(leftChars), new String(rightChars));
    if (mixed.containsAll(Arrays.asList(x, y))) {
      System.out.println("OK");
    } else {
      System.out.printf("NOK: %s, %s -> %s%n", left, right, mixed);
    }
  }
}

0

APL、12

{↓(⍳⍴⊃⍵)⊖↑⍵}

説明:{...}は関数を定義します。⍵は正しい引数です。テイク(↑)は、2つの文字列からマトリックスを作成し、各列(n)をn回回転します。ここで、nは括弧(⍳⍴⊃⍵)の部分です。これは、最初の引数の長さのイオタとして定義されています。(例:length = 5 ==> 1 2 3 4 5)。したがって、最初の列は1回、2番目は2回(元の位置に戻る)、3番目の列は3回、など...

tryapl.orgで試してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.