편지 대치 도전


17

아이디어는 간단하다. 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

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# 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 % true, 도전은 접두사를 갖도록 설계되었지만 (접두어없이 문자 교체를 처리 할 수없는 외계인이라는 이상한 설명을 만들 수는 있지만) 실제로는 이것을 막는 또 다른 장벽 일뿐입니다 너무 사소한-현재 답변을 보는 것은 (그러나 모든 것이 훌륭합니다) 복잡한 장벽이 아닙니다. 또한 재미있는 사실은,이 도전의 배경이 Skype 채팅에서 내 친구로부터 생성되었다는 것입니다. 그는 ( gello) 단어의 철자를 잘못 입력 한 다음을 보내는 -g +h대신 성가신 문자 를 원했기 때문에 대체 문자 ( ) 를 보내주었습니다 hello*.
ʰᵈˑ

1
입력은 항상이 순서입니다. 왜 그렇게 제한적입니까?
Luis Mendo

@LuisMendo 나는 그것이 중요하지 않다고 생각합니다.하지만 그것은 내 친구와 내가 그것을 형식화 한 방법이지만 답변 이이 요구 사항에 게시되었으므로 실제로 규칙을 변경할 수는 없습니다. 샌드 박스에서 의문의 여지가 없었으므로 부정적인 것으로 생각하지 않았습니다.
ʰᵈˑ

1
@udioica는 완벽하게 맞으며 실제로 "대체는 대소 문자를 구분합니다"규칙을 지원합니다. JavaScript 응답에서 스 니펫을 실행하여 구현 된 것을 확인하십시오. (# 1 w orld` vs # 2 W orld)
edc65

답변:


6

05AB1E , 15 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

자바 스크립트 (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에서 파이크를 다운로드 할 수 있습니다
Blue

4

펄, 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'. 나는 그것을 더 짧게 얻을 수는 없지만 어쩌면 당신은 할 수 있습니다 :)
Dada

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

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"

편집 : Titus 덕분에 1 바이트 절약


이것은 아마도 가장 짧은 것입니다. 그러나 $v[0]>'+'1 바이트 이상을 절약 $v[0]=='-'합니다. ord($v)&4대신 사용할 수도 있습니다 .
Titus

2

자바 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."}? (정말로) 잘못된 정규식과 일치하는 것을 작성하는 것입니다.
Roman Gräf

@ RomanGräf 예, 작동 및 출력 Rom No. Rom. Btw, Try it here.게시물 의 링크를 클릭 한 다음 포크 하여 직접 시도해 볼 수 있습니다 . :)
Kevin Cruijssen

알고 있지만 현재 휴대 전화를 사용하고 있습니다. :(
Roman Gräf

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

Ungolfed 및 테스트 사례

때문에 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-fiddle 테스트 스위트를 추가했습니다. 테스트 스위트는 편집 된 답변에 설명 된대로 stdin에서 입력을 읽는 대신 함수를 사용합니다.
Billywob

"입력 문자열 주위에서 사용해야하므로이 답변이 유효 합니까?
rturnbull

@rturnbull 나는 왜 안보이는 지 모르겠다. 모든 항목을 따옴표로 묶고 Enter 키를 누르면 "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th"일반적으로 문자열을 읽는 방식 과 동일한 결과 (예 :)가 생성됩니다.
Billywob

1
그래, 정말 OP에 달려있다! 나는 개인적으로 당신의 대답을 그대로 좋아하지만 그것이 유효하지 않을까 걱정했습니다. 다른 언어에 대한 답변을 보면 따옴표가 허용되는 것처럼 보입니다. 내가 관심을 가지고 있지만, 나는 당신이 할 수있는 생각 변경하여 4 바이트 오프 골프 l=length(i)l=length(i)/2하고 나중에 참조를 업데이트 l.
rturnbull

2

하스켈, 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 replaceflip)a.zip(g b).g;g=map tail.words
BlackCap

@BlackCap : 감사합니다! flip삽입 할 필요가 없습니다 . 표준 접두사는 1 바이트 더 짧습니다.
nimi

1

파이썬 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']


테스트 스위트 링크를 추가 할 수 있습니까?
ʰᵈˑ

링크가 제공되었으며 크기도 약간 줄었습니다.
Gábor Fekete

1

PowerShell v2 +, 90 바이트

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

공백을 사용하여 -+문자열을 입력하여 세 개의 인수로 입력을 받습니다. 수행하는 -split$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.