文字列内の文字の混合


10

stdin/ command-line arguments / function arguments を介して入力を取り、文字列内の文字を混合し、次にを介して最終的な文字列を出力する関数/プログラムを作成する必要がありますstdout

入力には、最初に文字列(空またはでないnull)、スペース、次にスペースで区切られた偶数の非負数が含まれます。関数の引数を介して入力が行われる場合、文字列は引数の1つであり、スペースで区切られた整数はもう1つの引数です。連続する数値のペアに対応するインデックスで文字列の文字を交換する必要があります。

例えば:

Hello_world! 0 6

結果として

wello_Horld!

仮定

  • 0ベースまたは1ベースのインデックスを選択でき、指定されたインデックスは常に範囲内であると想定できます。
  • 文字列が100文字を超えることはないだろうとだけ範囲のASCII文字が含まれています!~(包括的、0x7Eにする文字コード0x21で)。リファレンスについては、ASCII表を参照してください。
  • ペアの2つのインデックスは同一である可能性があります(その場合、そのステップでは何も交換されません)。

得点

これはコードゴルフなので、最短の提出(バイト単位)が勝ちます。

テストケース

Hello_world! 0 6 => wello_Horld!
First 1 2 1 0 0 4 => tFisr
(Second!$$) 8 7 10 1 => ()econd$!$S
~Third~ 0 0 6 6 0 6 6 0 => ~Third~

2
今後の課題については、フィードバックを取得してメインに投稿する前に課題を磨くことができるサンドボックスをお勧めます(これにより、修正が必要な課題に深刻な欠陥が見つかった場合に既存の回答を無効にするリスクが最小限に抑えられます)。
マーティンエンダー、2015年

コマンドライン引数などではなく、標準入力での入力が必要なのはなぜですか?
lrn

@lrn、そうです。さらに2つのオプションを追加しました。
Spikatrix

インデックスのリストを、それらが実装する関数に渡される配列として取得できると想定している、以下の一連のソリューションを参照してください。私があなたの定義を読み取る方法では、入力は単一の文字列であり、インデックスとそれらが操作する文字列が含まれています。入力文字列からインデックスを抽出することは、ゴルフに必要なコードの一部です。どの解釈が正しいかを明確にできますか?
Reto Koradi

@RetoKoradi、いいえ。入力は完全な文字列ではありません。文字列があり、その後に数字があります。数字は文字列に含まれません。
Spikatrix

回答:


6

CJam、11バイト

rr{irie\r}h

使い方

これは少し異なるアプローチで、入力に数のペアが残るまでdo-whileループを実行するだけです。

r                 e# Read the first string
 r                e# Read the first number of the first number pair in the input
  {      }h       e# Do a do-while loop
   i              e# Convert the first number from the pair to integer
    ri            e# Read the second number from the pair and convert to intger
      e\          e# String X Y e\ works by swapping the Xth index with the Yth index in the
                  e# String
        r         e# This is our exit condition of the do-while loop. If we still have
                  e# a number on the input left, that means there are more pairs to swap.
                  e# Otherwise, we exit the loop and the result is printed automatically

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


6

Python 3、89 86バイト

[*s],*L=input().split()
while L:a,b,*L=map(int,L);s[a],s[b]=s[b],s[a]
print(*s,sep="")

すべてのものを開梱します。(@potatoのおかげで3バイト節約)


数バイトを節約し、これを行います。[*s],*L=input().split()その後、行を削除できます。私はあなたのソリューションが本当に好きです、それは非常にゴルフされていますが、それはほとんどエレガントです。
ジャガイモ

@potatoあらまあ、私はあなたがそのように2つのアンパックを一緒に持つことができることを知りませんでした(あなたは3.5でしかそれを行うことができると思いました)。ありがとう!
Sp3000

4

CJam、13バイト

r[q~]2/{~e\}/

ここでテストしてください。

説明

r             e# Read the first token, i.e. the string.
 [q~]         e# Read the rest of the input, eval it and wrap it in an array.
     2/       e# Split the array into pairs of consecutive elements.
       {   }/ e# For each pair.
        ~     e# Unwrap the array.
         e\   e# Swap the corresponding elements in the string.

うわあ。そんなに早く答えは期待できませんでした!
Spikatrix

2

C(137 b)

f(char*T,int*V,int L){int C=0;for(int j=0;j<strlen(T);C=++j){for(int i=L-1;i+1;i--)if(C==V[i]){C=V[i-i%2*2+1];i-=i%2;}printf("%c",T[C]);}}

説明が来ています...

議論

T =タイプchar *の単語。

V =偶数の整数要素の配列。

L = Vの長さ

出力

混合ストリング

それはどのように機能しますか?

配列Vの数値を逆にスイープし、実際のポイントまですべての進行状況を追跡した後、文字列のn番目の要素を配置します。

input = T = "First"、V = {1,2,1,0,0,4}

V反転= {4,0,0,1,2,1}

V[0] = 4th element -> index 0
0 -> 1
1->2

4th element 't' receives the second = 'r'

V[1] = 0 -> index 4
4 isnt mentionned after so , no changes

0 element='F' receives the fourth= 't'

V[3] = 1st element -> index 0
no changes

V[4] = 2 -> index 1
no changes after ..

ここで試してください


1
@ Agawa001、もっともっとゴルフできます。戻り値の型は、int(予期しない動作が発生する場合があります)必要とされていない、とintのパラメータである変数は必要ありませんint、代わりに、ループ内で宣言する変数は、ループ、使用の外に一箇所に宣言することができるputchar代わりに、printfなど
Spikatrix

2

Python 3-161 149

import sys
t=sys.stdin.read().split()
q=list(t[0])
c=1
i=int
while c<len(t):n=q;a=i(t[c]);b=i(t[c+1]);n[a]=q[b];n[b]=q[a];q=n;c+=2;
print(''.join(q))

いくつかの変数を交換;し、Timのコメントのように使用することで、さらにゴルフを楽しみました。

私はそれがゴルフをしているように見えることを期待しましたが、それほどではありません。


1
たくさんゴルフできます。をに変更whilewhile c<len(t):line1;line2;line3...ます。c=c+2に行くc+=2
ティム

@ティムあなたの助けをありがとう!
ASCIIThenANSI 2015年

cは0から始めるべきではありませんか?
Tim

@ティム・ノープ。c実際にはt、スワップする必要のある位置を取得するためのインデックス(入力)です。しかし、以来、t[0]私たちは周りのスワップに必要な、文字列であるt[1]t[2]スワップの最初のペアを保持します。
ASCIIThenANSI 2015年

ああ、なるほど。申し訳ありませんが、私の解決策は入力を分割したので、同じことをしたと思います:)
Tim

2

C、109の 107 102バイト

i;f(l){l=sizeof(a)/sizeof(*a);char t;for(;i<l;i+=2){t=s[a[i]];s[a[i]]=s[a[i+1]];s[a[i+1]]=t;}puts(s);}

注意:saグローバル配列として宣言する必要があります。s交換する文字列でaありint、すべての数値の配列です。

上記のコードが機能しない場合は、void f(){...}代わりに使用してみてくださいf(){...}

Ungolfedコード:

int a[]={1, 2, 1, 0, 0, 4};//Integer elements
char s[]="First";          //String to be swapped

i; //Auto initialized to 0 and defaults to type int
void f(l){ //Variables defaults to type int
  l=sizeof(a)/sizeof(*a); //Gets number of elements in array a
  char t;

  for(;i<l;i+=2){ 

    t=s[a[i]];
    s[a[i]]=s[a[i+1]];
    s[a[i+1]]=t;  //Swap each character

  }

  puts(s); //Print the final char array
}

ここでテストしてください


hmm urコードの方が小さい:)
Abr001am

笑変数宣言はどこにありますか?それはあなたのコードをきつく締めるチートな方法です:p
Abr001am

@ Agawa001、バイトはテストケースごとに異なるため、変数宣言は含めませんでした。
Spikatrix

これは、問題で定義されている入力と一致しません。入力は単一の文字列です。問題を完全に誤解していない限り、入力文字列からインデックス値を抽出する必要があります。
Reto Koradi

1

Python 3、135

x=input().split()
y=list(x[0])
z=[int(i)for i in x[1:]]
while z:p,c=y[z[0]],y[z[1]];y[z[0]],y[z[1]]=c,p;del z[0],z[0]
print(''.join(y))

説明:

x=input().split()         # Split the input into a list at each space
y=list(x[0])              # First item in list (the word) into a list of chars
z=[int(i)for i in x[1:]]  # Make the list of numbers, into integers
while z:                  # Loop untill the list z is empty
    p,c=y[z[0]],y[z[1]]   # Assign p to the first char and c to the second
    y[z[0]],y[z[1]]=c,p   # Swap around using p and c
    del z[0],z[0]         # Remove the first 2 items in the list of integers
print(''.join(y))         # Print out the altered list as a string

1

C、70バイト

入力文字列の長さが最大100であることを考えると、整数配列の終わりを示す「NULL」バイトを明確にすることにしました0xFF。おそらくこれは追加の入力としてはカウントされませんが、(最大で)7 3バイトのコストで、1ベースのインデックス'\0'にして配列の最後として使用できます。

f(s,i,t)char*s,*i;{for(;~*i;)t=s[*i],s[*i]=s[*++i],s[*i++]=t;puts(s);}

ほとんどの場合、tmp変数を使用して通常のスワッピングを行い、コンマ演算子がシーケンスポイントを導入して動作を定義します(xorスワップの一部の兆候とは異なり、文字数は少なくても動作が未定義になります)。

編集:要求に応じて、テストすることができます:http : //rextester.com/OVOQ23313


インデックスが入れ替えられた配列を取得するとは思いません。インデックスは入力文字列の一部であり、ポストされた(およびカウントされた)コードの一部として文字列からインデックスを解析する必要があります。説明から:「入力には、最初に文字列、スペース、次にスペースで区切られた偶数以外の非負数が含まれます。」
Reto Koradi

1

ダート-123

コマンドラインでの入力がスペースで自動的に分割されると仮定します。それ以外の場合x=x[0].split(' ');は、文字列をテキストとインデックスに分割するためのイニシャルが必要です。

main(x,{c,i:1,a,t}){c=x[0].split("");n()=>a=int.parse(x[i++]);for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);print(c.join());}

より多くの空白を使って:

main(x,{c,i:1,a,t}){
  c=x[0].split("");
  n()=>a=int.parse(x[i++]);
  for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);
  print(c.join());
}

これをdartpad.dartlang.orgで実行/テストします


私がこれをテストできるオンラインコンパイラを知っていますか?
Spikatrix

DartPadへのリンクを追加します。
2015年

1

リボル-71

s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s

非ゴルフ:

s: take i: split input " " 
foreach [a b] i [swap at s do a at s do b]
print s

これをどのようにテストしますか?これをテストするためのオンラインコンパイラはありますか?
Spikatrix

@CoolGuy-はい、try.rebol.nlでテストできます 。input関数はそこからSTDINを呼び出すことができません。回避策はinput、テストしたい値に設定することです。これが最初のテストの完全な例です-Rebol 3 NB input: "hello_World 1 7" s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print sDoをクリックしてください。Rebolは1ベースのインデックスを使用します。
draegtun、

@CoolGuy-または、rebolsource.net
draegtun

0

C、143バイト

main(a,v,i)char** v;{i=2;char s[101],t;strcpy(s,v[1]);for(;i<a;i+=2){t=s[atoi(v[i])];s[atoi(v[i])]=s[atoi(v[i+1])];s[atoi(v[i+1])]=t;}puts(s);}

上記のプログラムは、コマンドライン引数から入力を受け取り、文字列を配列にコピーし、対応する文字を交換して、変更された文字列を出力します。

Ungolfedコード:

main(int a,char** v,int i){ //Arguments of main 
  i = 2;
  char s[101],t;

  strcpy(s,v[1]); //Copy string literal into an array

  for(;i<a;i+=2){
    t=s[atoi(v[i])];
    s[atoi(v[i])]=s[atoi(v[i+1])];
    s[atoi(v[i+1])]=t;  //Swap each character
  }

  puts(s); // Output the final string
}

数字が1桁だけであると想定していますか?入力は100文字まで可能であることを考えると、それは有効ではないと思います。10インデックスの1つとして含まれている3番目の例も見てください。
Reto Koradi 2015年

@RetoKoradi、それを見つけてくれてありがとう。コードを修正しました。
Spikatrix

0

JavaScript(ES6)、95

単一の文字列入力で95バイト(以下の関数f)

75バイト、2つのパラメーター、文字列と数値配列(以下の関数g)

(EcmaScript 6、Firefoxのみ)

f=i=>
(
  n=i.split(' '),
  s=[...n.shift()],
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v),
  s.join('')
)

g=(s,n)=>
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v,s=[...s])
  &&s.join('')

// TEST
out=x=>O.innerHTML+=x+'\n'

;[['Hello_world! 0 6', 'wello_Horld!']
,['First 1 2 1 0 0 4','tFisr']
,['(Second!$$) 8 7 10 1','()econd$!$S']
,['~Third~ 0 0 6 6 0 6 6 0','~Third~']]
.forEach(t=>{
  u=f(t[0]),
  ok=u==t[1],
  out('Test '+(ok?'OK: ':'FAIL: ')+t[0]+'\n Result:' +u + '\n Check: '+t[1]+'\n')
})
<pre id=O></pre>

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