字母替换挑战


17

这个想法很简单。您必须通过提供3个字符串(输入可以用逗号分隔,单独的输入或作为数组)来创建“可视化”字母替换。第一部分是您要纠正的单词,第二部分是您想要替换的字母,第三部分是第二部分中字母的替换。

例如:

|    | 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
  • 第一部分(起始词)将永远不会包含-+字符。
  • 这是代码高尔夫球,因此最短的字节获胜。

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

# 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是基本字符串,输入1到INT(N / 2)是letter to replace(前缀-)和输入INT(N / 2)+1至n-1是replacement(前缀+
edc65

@ edc65 100%正确,尽管挑战被设计为带有前缀(而且我可以做出一些奇怪的解释,即我是一个没有字母前缀就无法处理字母替换的外星人),但实际上,这只是阻止它的另一个障碍太琐碎了-尽管看一下当前的答案(顺便说一句,一切都很棒),但这并不是一个复杂的障碍。另一个有趣的事实是,我的朋友在Skype聊天中产生了这个挑战的想法。他拼错了一个单词(gello),然后将替换字母(-g +h)发送给我,因为他想烦人而不是发送hello*
2016年

1
输入总是按此顺序进行的为什么如此严格?
路易斯·门多

@LuisMendo我猜这并不重要-但这是我和我的朋友格式化的方式,但是由于答案已发布到此要求中,因此我无法真正更改规则。沙盒上没有质疑它,所以我不认为它是负面的。
2016年

1
@udioica完全正确,它实际上支持“替换区分大小写”规则。运行JavaScript答案中的代码片段以查看其实现。(#1 w orld` vs#2 W orld)
edc65 '16

Answers:


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

Pyke,13 11个字节

z[zdcmt)[.:

在这里尝试!

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

如果输入格式不同,则为2个字节:

.:

在这里尝试!


在工作中,catbus.co.uk被阻止。您可以链接其他测试套件吗?
2016年

2
@ʰᵈˑ我认为符合您的(任意)工作防火墙设置是不合理的。
Orlp

1
@orlp-我同意,很糟糕。但是我没有设置防火墙设置。我只是想测试一下
1616年

2
@hd,您可以从github.com/muddyfish/pyke下载Pyke
蓝色

4

Perl,58个字节

57字节代码+ 1个 -p

在一行中需要第一个项目,然后在下一行中进行替换。非常感谢@Dada,他提出了另一种方法来帮助减少4个字节!

$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'。(在一行上获取字符串,在下一行上获取“标志”)
Dada

1
太棒了!我不在电脑旁,但明天会更新!谢谢!
Dom Hastings

您确定要删除$ 2周围的q {}吗?当有3-和3 +开关时,这不会失败吗?(我现在无法对其进行测试,所以也许您是对的,所以删除它;))
Dada

@Dada ahhh,我确实想知道为什么要添加它,我测试了测试套件中的所有情况,但没有想到3换3的替换法……
Dom Hastings

3

GNU sed 86字节

包括+1的-r

:;s,^([^-]*)(\w+)([^-]*-)\2( [^+]*\+)(\w*),\1\5\3\2\4\5,
t;s,-[^-+]*,,;s,\+[^-+]*,,;t

在线尝试!

例:

$ echo 'Hello world -wo -ld +Ea +th'|sed -rf replace.sed
Hello Earth

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来说,这就是制作替换数组的全部。我尝试仅使用一个“子字符串”来执行此操作,但这可能不是最佳解决方案。使用方式如下:

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]>'+'节省一个字节$v[0]=='-'。您也可以使用ord($v)&4
泰特斯(Titus)

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)

@RomanGräf是的,可以工作并输出Rom No. Rom。顺便说一句,您可以通过单击Try it here.帖子中的链接,然后进行分叉来自己尝试。:)
Kevin Cruijssen '16

我知道,但是我目前正在使用手机。:(
罗曼·格拉夫

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:组合-+成单个寄存器,与+变成了-
  • :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

取消测试案例

因为scan(从stdin读取输入)在R-fiddle中无法正常工作,所以我通过将其包装在函数中来展示该程序。注意,该函数将向量作为输入,可以通过例如:运行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
}

还可以提供测试套件链接吗?
2016年

@ʰᵈˑ添加了R-fiddle测试套件。请注意,测试套件使用函数代替从标准输入中读取输入,如编辑答案中所述。
Billywob

因为您必须"在输入字符串周围使用,所以此答案有效吗?
rturnbull

@rturnbull我不明白为什么不。用引号包裹每个条目,然后按Enter键将产生等效的结果(例如"Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th":),这通常是如何以任何方式读取字符串的结果。
Billywob

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个字节,而我本人则是另一个。


6个字节:import Data.Lists;a#b=foldl(uncurry replace翻转)a.zip(g b).g;g=map tail.words
BlackCap,

@BlackCap:很好,谢谢!无需添加中flip缀。标准前缀短一个字节。
nimi


1

PowerShell v2 +,90字节

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

将输入作为三个参数,并且-+字符串用空格分隔。执行一个-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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.