レター交換チャレンジ


17

アイデアはシンプルです。3つの文字列を提供することにより、「視覚化された」文字置換を作成する必要があります(入力はコンマ区切り、個別の入力、または配列として使用できます)。最初のセグメントは修正する単語、2番目のセグメントは置換する文字、3番目のセグメントはセグメント2の文字の置換です。

例えば:

|    | Input                       | Starting Word | Output      |
|----|-----------------------------|---------------|-------------|
| #1 | Hello world -wo -ld +Ea +th | Hello world   | Hello Earth |
| #2 | Hello World -wo -ld +Ea +th | Hello World   | Hello Worth |
| #3 | Hello -llo +y               | Hello         | Hey         |
| #4 | Red -R -d +Gr +en           | Red           | Green       |
| #5 | mississippi -is -i +lz +p   | mississippi   | mlzslzspppp |
| #6 | Football -o -a +a +i        | Football      | Fiitbill    |
| #7 | mississippi -is -i +iz +p   | mississippi   | mpzspzspppp |

説明

置換は、それぞれのペアで段階的に行われます。これmississippi -is -i +iz +pは、出力を与えるための入力を含む図ですmpzspzsppp#7上記の例を参照)

| Step  | Input                         | Output        |
|------ |---------------------------    |-------------  |
| #1    | mississippi -is -i +iz +p     |               |
| #2    | mississippi -is +iz           | mizsizsippi   |
| #3    | mizsizsippi -i +p             | mpzspzspppp   |

ルール

  • 入力は常にこの順序です <starting_string> <list_of_letters_to_replace> <replacement_letters>です。
  • 置換する文字と置換するグループが混ざることはありません(つまり: -a +i -e +o)。
  • 置き換える文字には常に接頭辞が付きます-と交換手紙は、常に接頭辞が付きます+。(プレフィックスは必須です)
  • 置換する文字セットが複数ある場合があるため、プレフィックスを確認する必要があります。
  • 置換する文字グループの量と置換文字グループの量は常に等しいと仮定します(つまり: -a -e +i
  • 置換では大文字と小文字が区別されます(例を参照) #1とを#2)。
  • 置換は、入力で指定された順序で行われます。
  • 文字の置換は、他の置換に置き換えることができます。例を見る#6
  • 最初のセグメント(開始語)に-または+文字が。
  • これはコードゴルフなので、最短バイトが勝ちます。

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=96473,OVERRIDE_USER=38505;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


1
ルール2および5を指定すると、実際にプレフィックスを調べる必要はありません。入力がn個の場合、入力0は基本文字列、入力letter to replace-replacement+
1〜int

@ edc65 100%true、チャレンジは接頭辞を持つように設計されていますが(私は、接頭辞なしで文字の置換を処理できない外国人であるという奇妙な説明を作ることができます)、実際には、これを止めるのは単なる障壁です些細すぎる-現在の答えを見ると(すべて素晴らしい)、それは複雑な障壁ではありませんでした。また、面白い事実として、このチャレンジの背後にあるアイデアは、Skypeチャットで友人から生み出されました。彼は単語のつづりを誤って(gello)、送信する-g +h代わりに迷惑になりたかったので、文字の置き換え()を私に送りましたhello*
ʰᵈˑ

1
入力は常にこの順序で行われます
ルイスメンドー

@LuisMendo私はそれは本当に重要ではないと思います-しかし、それは私の友人と私がそれをフォーマットする方法ですが、答えがこの要件に投稿されているので、私は本当にルールを変更することはできません。それはサンドボックスで質問されなかったので、私はそれを否定的とは思わなかった。
ʰᵈˑ

1
@udioicaは完全に正しいものであり、実際には「置換では大文字と小文字が区別される」ルールをサポートしています。JavaScriptの回答でスニペットを実行して、実装されていることを確認します。(#1 wの orld`#2 VS W orld)
edc65

回答:


6

05AB1E15 17バイト

IIð¡€áIð¡€á‚øvy`:

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

説明

I                   # read starting string
 I                  # read letters to be replaced
  ð¡                # split on space
    ۇ              # and remove "-"
      I             # read replacement letters
       ð¡           # split on space
         ۇ         # and remove "+"
           ‚ø       # zip to produce pairs of [letters to replace, replacement letters]
             vy`:   # for each pair, replace in starting string

または、より厳密でない入力形式で

vy`:

オンラインで試す


6

JavaScript(ES6)、85 83バイト

f=(s,n=1,l=s.split(/ \W/))=>(r=l[n+l.length/2|0])?f(s.split(l[n]).join(r),n+1):l[0]

テストケース


5

パイク、13 11バイト

z[zdcmt)[.:

ここで試してみてください!

z           - input()
 [zdcmt)    - def func():
  zdc       -  input().split(" ")
     mt     -  map(>[1:], ^)
            - func()
        [   - func()
         .: - translate()

または、異なる入力形式の場合は2バイト:

.:

ここで試してみてください!


職場では、catbus.co.ukはブロックされています。別のテストスイートをリンクしてください。
ʰᵈˑ

2
@ʰᵈˑあなたの(任意の)職場のファイアウォール設定に準拠することは合理的ではないと思います。
orlp

1
@orlp-私は同意します、それはたわごとです。ただし、ファイアウォールの設定は行いません。私はちょうどそれをテストしたかった
ʰᵈˑ

2
@hd github.com/muddyfish/pykeでPykeをダウンロードできます
Blue

4

Perl、58バイト

57バイトのコード+の1 -p

1行目に最初のアイテムが必要で、次の行に置換が必要です。4バイト削減するのに役立つ別のアプローチを思いついた@Dadaに感謝します!

$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee

使用法

perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'Football
-o -a +a +i'
Fiitbill
perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'mississippi
-is -i +iz +p'
mpzspzspppp
perl -pe '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee' <<< 'mississippi
-ippi -i -mess +ee +e +tenn'
tennessee

4バイト長くなりますperl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'。私はそれを短くすることができませんが、多分あなたはできます:)
ダダ

1
ガッチャ!58バイト:perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'。(1行に文字列を取り、次の行に「フラグ」を取ります)
ダダ

1
驚くばかり!私はコンピューターにいませんが、明日更新します!ありがとう!
ドムヘイスティングス

$ 2を囲むq {}を削除してもよろしいですか?3-および3 +スイッチがある場合、これは失敗しませんか?(私は今それをテストすることはできないので、多分あなたは正しかったのでそれを削除する;))
ダダ

@Dadaああ、私はあなたがそれを追加しましたのだ、なぜ、私がテストスイート内のすべての例を不思議テストしなかったが、3 3の交換...について考えていませんでした
ドムヘイスティングス


3

PHP、98 97バイト

for($s=$argv[$i=1];$v=$argv[++$i];)$r[$v[0]>'+'][]=substr($v,1);echo str_replace($r[1],$r[0],$s);

このチャレンジでは、str_replaceの正確な動作を説明するため、phpの場合は、置換の配列を作成することがすべてです。1つの「サブストリング」のみを使用して実行しようとしましたが、それは最良の解決策ではない可能性があります。次のように使用します:

php -r "for($s=$argv[$i=1];$v=$argv[++$i];)$r[$v[0]>'+'][]=substr($v,1);echo str_replace($r[1],$r[0],$s);" "mississippi" "-is" "-i" "+iz" "+p"

編集:タイタスのおかげで1バイト保存


これはおそらく最短時間です。しかし、$v[0]>'+'1バイトを節約し$v[0]=='-'ます。ord($v)&4代わりに使用することもできます。
タイタス

2

Java 7、153 133バイト

String c(String[]a){String r=a[0],z[]=a[1].split(" ?-");for(int i=0;i<z.length;r=r.replace(z[i],a[2].split(" ?[+]")[i++]));return r;}

未ゴルフ&テストコード:

ここで試してみてください。

class M{
  static String c(String[] a){
    String r = a[0],
           z[] = a[1].split(" ?-");
    for(int i = 0; i < z.length; r = r.replace(z[i], a[2].split(" ?[+]")[i++]));
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(new String[]{ "Hello world", "-wo -ld", "+Ea +th" }));
    System.out.println(c(new String[]{ "Hello World", "-wo -ld", "+Ea +th" }));
    System.out.println(c(new String[]{ "Hello", "-llo", "+y" }));
    System.out.println(c(new String[]{ "Red", "-R -d", "+Gr +en" }));
    System.out.println(c(new String[]{ "mississippi", "-is -i", "+lz +p" }));
    System.out.println(c(new String[]{ "Football", "-o -a", "+a +i" }));
    System.out.println(c(new String[]{ "mississippi", "-is -i", "+iz +p" }));
  }
}

出力:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp

これは入力に対して機能しますnew String[]{'Rom Ro. Rom", "-Ro." , "+No."}か?(できれば)間違った正規表現に一致するものを書くだけです。
ローマングラフ

@RomanGräfはい、動作し、出力しますRom No. Rom。ところで、Try it here.投稿のリンクをクリックして自分で試してから、フォークすることができます。:)
ケビンクルーイッセン

私は知っているが、私は現在私の携帯電話にいます。:(
ローマングラフ

2

PHP、164バイト

preg_match_all("#^[^-+]+|-[\S]+|[+][\S]+#",$argv[1],$t);for($s=($a=$t[0])[0];++$i<$c=count($a)/2;)$s=str_replace(trim($a[+$i],"-"),trim($a[$i+$c^0],"+"),$s);echo$s;

2

Vim、25バイト

qq+dE+r-PdiW:1s<C-R>"-g<CR>@qq@q

次の形式の入力を想定しています。

mississippi
-is -i
+lz +p
  • +dE+r-PdiW:コンバイン-+を持つ単一のレジスタに、+Aに変身-
  • :1s<C-R>"-g:レジスタをコードスニペットとして使用し、区切り文字として:sコマンドに直接挿入し-ます。


2

R、98 94バイト

編集:@rturnbullのおかげで4バイト節約

i=scan(,"");s=i[1];i=gsub("\\+|-","",i[-1]);l=length(i)/2;for(j in 1:l)s=gsub(i[j],i[l+j],s);s

未ゴルフケースとテストケース

のでscanR-フィドルIで正常に動作しない(標準入力から入力を読み込む)の代わりに関数の中でそれをラップすることにより、プログラムを披露。関数は入力としてベクトルを取り、たとえば次のように実行できることに注意してくださいf(c("Hello world", "-wo", "-ld", "+Ea", "+th"))。上記のgofledプログラムは、stdinを使用して入力するようにユーザーに促します。"Hello world" -wo -ld -Ea +th、コンソールにしても同じ結果が得られます。

Rフィドルでコードを実行する

f=function(i){
    s=i[1]                                   # Separate first element
    i=gsub("\\+|-","",i[-1])                 # Remove + and - from all elements except first, store as vector i
    l=length(i)/2                            # calculate the length of the vector i (should always be even)
    for(j in 1:l)s=gsub(i[j],i[l+j],s)       # iteratively match element j in i and substitute with element l+j in i
    s                                        # print to stdout
}

テストスイートのリンクも提供してください。
ʰᵈˑ

@ʰᵈˑはRフィドルテストスイートを追加しました。編集された回答で説明されているように、テストスイートはstdinから入力を読み取る代わりに関数を使用することに注意してください。
ビリーウォブ

"入力文字列の周りで使用する必要があるため、この答えは有効ですか?
rturnbull

@rturnbullなぜそうなのかわかりません。すべてのエントリを引用符で囲んでEnterキーを押すと、同等の結果が得られます(例:"Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th":)が得られます。これは通常、文字列がとにかく読み取られる方法です。
ビリーウォブ

1
ええ、本当にOP次第です!私は個人的にあなたの答えがそのまま好きですが、それが無効であるかもしれないと心配しました。他の言語の回答を見ると、引用はかなり受け入れられているようです。私はあなたの注意を払っていますが、後のへの参照をに変更l=length(i)l=length(i)/2て更新することにより、4バイトをゴルフすることができると思いますl
rturnbull

2

Haskell、85 78バイト

import Data.Lists
g=map tail.words
a#b=foldl(flip$uncurry replace)a.zip(g b).g

使用例:("mississippi" # "-is -i") "+lz +p"->"mlzslzspppp"

使い方:

g=map tail.words              -- helper function that splits a string into a
                              -- list of words (at spaces) and drops the first
                              -- char of each word

                zip(g b).g    -- make pairs of strings to be replaced and its
                              -- replacement
foldl(flip$uncurry replace)a  -- execute each replacement, starting with the
                              -- original string
                              -- -> "flip" flips the arguments of "uncurry replace"
                              --           i.e. string before pair of replacements
                              -- "uncurry" turns a function that expects two
                              --           lists into one that expects a list of pairs

編集:@BlackCapは保存するために6バイトを見つけ、私自身ももう1バイト見つけました。


6バイト:import Data.Lists;a#b=foldl(uncurry replaceフリップ)a.zip(g b).g;g=map tail.words
-BlackCap

@BlackCap:いいね、ありがとう!flip中置する必要はありません。標準プレフィックスは1バイト短くなります。
-nimi

1

Python 3、93バイト

def f(s):
  s,m,p=s
  for n,o in zip(m.split(),p.split()):s=s.replace(n[1:],o[1:])
  return s

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

入力は文字列のリストで、置換文字列はスペースで区切られています。

入力例: ['mississippi','-is -i','+iz +p']


テストスイートのリンクを追加できますか?
ʰᵈˑ

リンクが提供され、サイズも少し小さくなりました。
ガボールフェケテ

1

PowerShell v2 +、90バイト

param($a,$b,$c)-split$b|%{$a=$a-creplace($_-replace'-'),((-split$c)[$i++]-replace'\+')};$a

入力を3つの引数として受け取り-+文字列とスペースをスペースで区切ります。-splitonを実行し$b-split単項式で動作するときは空白で分割します)、|%{...}それらのそれぞれをループします。繰り返しごとに-、を削除し、次の[$i++]置換文字列を見つけて+から削除し、-creplace(大文字と小文字を区別する置換)を使用してスライスし、さいの目に切っ$aて格納し$aます。次に、$aはパイプラインに残り、出力は暗黙的です。

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'mississippi' '-is -i' '+iz +p'
mpzspzspppp

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'Hello world' '-wo -ld' '+Ea +th'
Hello Earth

PS C:\Tools\Scripts\golfing> .\letter-replacement-challenge.ps1 'Hello World' '-wo -ld' '+Ea +th'
Hello Worth

1

PHP、106バイト

for($s=($v=$argv)[$i=1];$i++<$n=$argc/2;)$s=str_replace(substr($v[$i],1),substr($v[$n+$i-1],1),$s);echo$s;

直接的なアプローチ。で実行しphp -r '<code> <arguments>ます。

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