Проблема із заміною листа


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

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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*.
ʰᵈˑ

1
Вводи завжди в такому порядку, чому так обмежуючі?
Луїс Мендо

@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

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 ви можете завантажити Pyke на сайті github.com/muddyfish/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
Дивовижно! Я не за комп’ютером, але завтра оновлю це! Спасибі!
Дом Гастінгс

Ви впевнені у видаленні q {} навколо $ 2? Чи не вдалося б це зробити, якщо є 3 - і 3 + комутатори? (Я зараз не можу перевірити це, тому, можливо, ви мали рацію, тому видаліть його;))
Дада,

@Dada ahhh, мені було цікаво, чому ви це додали, я перевірив усі випадки в тестовому наборі, але не думав про заміну 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 все полягає у створенні масивів заміни. Я намагався це зробити, використовуючи лише одну "підрядку", але це може бути не найкращим рішенням. Використовуйте як:

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замість цього.
Тит

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. Btw, ви можете спробувати самостійно, натиснувши 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команду, з -роздільником.


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

Невикористані і тестові справи

Оскільки scan(зчитується вхід із stdin) не працює належним чином у R-скрипці, я демонструю програму, перетворивши її замість функції. Зверніть увагу , що функція приймає вектор в якості вхідного сигналу і може бути запущена , наприклад: 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, як пояснено в редагованій відповіді.
Billywob

Чи відповідає ця відповідь, оскільки вам доведеться використовувати "навколо вхідного рядка?
rturnbull

@rturnbull Я не бачу, чому ні. Обгортання кожного запису цитатами та натискання клавіші enter дасть еквівалентний результат (наприклад:), "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

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>.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.