Письмо-заменитель

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.
  • Первый сегмент (начальное слово) никогда не будет включать -ни +символов.
  • Это код-гольф, поэтому выигрывают самые короткие байты.

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# 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*.
ʰᵈˑ
1
Входы всегда в таком порядке. Почему это так ограниченно?
Луис Мендо
@ LuisMendo Полагаю, это не имеет значения, но именно так мы с моим другом отформатировали его, но, поскольку ответы на это требование были опубликованы, я не могу действительно изменить правило. Это не было опрошено в песочнице, поэтому я не думал об этом как о негативе.
ʰᵈˑ
1
@udioica совершенно прав и фактически поддерживает правило «Замены с учетом регистра». Запустите фрагмент в ответе JavaScript, чтобы увидеть его реализацию. (# 1 w orld` против # 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`:

Попробуйте онлайн

Emigna
источник
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]

Контрольные примеры

Arnauld
источник
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 вы можете скачать Pyke на github.com/muddyfish/pyke
Blue
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'. Я не могу получить его короче, но, может быть, вы можете :)
Dada
1
Попался! 58 байт: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (принимает строку в одну строку и «флаги» на следующую строку)
Dada
1
Потрясающие! Я не за компьютером, но я обновлю это завтра! Благодарность!
Дом Гастингс
Вы уверены, что удалили q {}, окружающий $ 2? Разве это не даст сбой, когда есть 3 - и 3 + переключатели? (Я не могу проверить это сейчас, так что, возможно, вы были правы, так что удалите его;))
Dada
@ Дадаааааа, я действительно удивлялся, почему ты добавил это, я проверял все случаи в наборе тестов, но не думал о замене 3 на 3 ...
Дом Хастингс
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 байт сохранен благодаря Титу

user59178
источник
Это, наверное, самая короткая вещь из всех возможных. Но $v[0]>'+'сохраняет один байт $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;}

Ungolfed & тестовый код:

Попробуй это здесь.

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: Объединяет -и +в один регистр, с +превращением в -.
  • :1s<C-R>"-g: Использует регистр как фрагмент кода, вставленный непосредственно в :sкоманду, -в качестве разделителя.
udioica
источник
2

R, 98 94 байта

Редактировать: сохранено 4 байта благодаря @rturnbull

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 и тестовые случаи

Поскольку scan(читает ввод из stdin) не работает должным образом в R-fiddle, я демонстрирую программу, вместо этого заключая ее в функцию. Обратите внимание, что функция принимает вектор в качестве входных данных и может быть запущена, например:f(c("Hello world", "-wo", "-ld", "+Ea", "+th")) . Программа gofled выше предложит пользователю ввести с помощью стандартного ввода, в результате чего введите"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
}
Billywob
источник
Можете ли вы предоставить ссылку на набор тестов, пожалуйста?
ʰᵈˑ
@ ʰᵈˑ добавил набор тестов R-fiddle. Обратите внимание, что набор тестов использует функцию вместо чтения ввода из стандартного ввода, как описано в отредактированном ответе.
Billywob
Является ли этот ответ действительным, так как вы должны использовать "вокруг входной строки?
rturnbull
@ rturnbull Не понимаю, почему нет. Заключение каждой записи в кавычки и нажатие клавиши ввода приведет к эквивалентному результату (например:), "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th"который обычно так или иначе читается как строки.
Billywob
1
Да, это действительно до ОП! Мне лично нравится ваш ответ как есть, но я волновался, что он может быть недействительным. Глядя на ответы для других языков, кажется, что цитаты довольно приемлемы. Хотя у меня есть ваше внимание, я думаю , что вы можете играть в гольф от 4 байта путем изменения l=length(i)к l=length(i)/2и обновлению позже ссылки 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инфикс. Стандартный префикс на один байт короче.
Ними
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

Принимает входной сигнал в виде трех аргументов, с -и +строк , разделенных пробелами. Выполняет -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
AdmBorkBork
источник
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>.

Titus
источник