Tantangan penggantian surat


17

Idenya sederhana. Anda harus membuat penggantian surat "divisualisasikan", dengan memberikan 3 string (input dapat dipisahkan koma, input terpisah, atau sebagai larik). Segmen pertama adalah kata yang ingin Anda koreksi, dan segmen kedua adalah huruf yang ingin Anda ganti, dan segmen ketiga adalah pengganti untuk huruf-huruf di segmen 2.

Sebagai contoh:

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

Penjelasan

Penggantian harus dilakukan langkah demi langkah dengan pasangannya masing-masing. Berikut ini adalah ilustrasi dengan input mississippi -is -i +iz +puntuk memberikan output mpzspzsppp(lihat contoh di #7atas)

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

Aturan

  • Input selalu dalam urutan ini <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Surat untuk mengganti dan mengganti kelompok tidak akan pernah dicampur (yaitu: tidak akan pernah ada -a +i -e +o).
  • Surat untuk diganti selalu diawali dengan -dan surat pengganti selalu diawali dengan +. (Awalan wajib)
  • Mungkin ada lebih dari satu set surat untuk diganti, jadi Anda harus melihat awalan.
  • Asumsikan jumlah grup surat yang akan diganti dan jumlah grup surat pengganti selalu sama (yaitu: tidak akan pernah ada -a -e +i)
  • Penggantian adalah case-sensitive (lihat contoh #1dan #2).
  • Penggantian dilakukan sesuai urutan yang diberikan pada input.
  • Penggantian surat dapat diganti dengan penggantian lainnya. Lihat contoh #6.
  • Segmen pertama (kata awal) tidak akan pernah menyertakan -atau +karakter.
  • Ini adalah kode-golf sehingga byte terpendek menang.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard reguler dan tinjauan pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](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
Diberikan aturan 2 dan 5, Anda benar-benar tidak perlu melihat awalan. Dengan n input, input 0 adalah string dasar, input 1 ke int (n / 2) adalah letter to replace(dengan awalan -) dan input int (n / 2) +1 ke n-1 adalah replacement(dengan awalan +)
edc65

@ edc65 100% benar, meskipun tantangannya dirancang untuk memiliki awalan (dan saya bisa membuat beberapa penjelasan aneh bahwa saya adalah orang asing yang tidak dapat memproses penggantian surat tanpa awalan mereka) tetapi pada kenyataannya, itu hanya penghalang lain untuk menghentikan ini terlalu sepele - meskipun melihat jawaban saat ini (semuanya bagus), itu bukan penghalang yang kompleks. Fakta yang juga menyenangkan, ide di balik tantangan ini muncul dari teman saya di obrolan Skype. Dia salah mengeja kata ( gello), dan kemudian mengirim saya pengganti surat ( -g +h) karena dia ingin mengganggu daripada mengirim hello*.
ʰᵈˑ

1
Input selalu dalam urutan ini. Mengapa sangat membatasi?
Luis Mendo

@LuisMendo Saya kira itu tidak terlalu masalah - tetapi begitulah cara teman saya dan saya memformatnya, tetapi karena jawaban telah diposting untuk persyaratan ini, saya tidak bisa benar-benar membuat perubahan aturan. Itu tidak dipertanyakan di kotak pasir, jadi saya tidak menganggapnya sebagai negatif.
ʰᵈˑ

1
@udioica benar-benar benar dan sebenarnya mendukung aturan "Replacements are-sensitive". Jalankan cuplikan dalam jawaban JavaScript untuk melihatnya diterapkan. (# 1 w orld` vs # 2 W orld)
edc65

Jawaban:


6

05AB1E , 15 17 byte

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

Cobalah online!

Penjelasan

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

Atau dengan format input yang kurang ketat

vy`:

Cobalah online


6

JavaScript (ES6), 85 83 byte

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]

Uji kasus


5

Pyke, 13 11 byte

z[zdcmt)[.:

Coba di sini!

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

Atau 2 byte jika dalam format input berbeda:

.:

Coba di sini!


Di tempat kerja catbus.co.uk diblokir. Apakah Anda dapat menghubungkan test suite alternatif?
ʰᵈˑ

2
@ ʰᵈˑ Saya tidak percaya menyesuaikan dengan pengaturan firewall kerja Anda (sewenang-wenang) adalah masuk akal.
orlp

1
@ orlp - Saya setuju, ini omong kosong. Tapi saya tidak mengatur pengaturan firewall. Saya hanya ingin mengujinya
ʰᵈˑ

2
@hd Anda dapat mengunduh Pyke di github.com/muddyfish/pyke
Blue

4

Perl, 58 byte

57 byte kode +1 untuk -p.

Membutuhkan item pertama di satu baris, lalu penggantian di baris berikutnya. Terima kasih banyak kepada @Dada yang menggunakan pendekatan berbeda untuk membantu mengurangi sebesar 4 byte!

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

Pemakaian

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 byte lebih lama, ada perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. Saya tidak bisa mengatur untuk membuatnya lebih pendek, tapi mungkin Anda bisa :)
Dada

1
Kena kau! 58 byte: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (mengambil string pada satu baris, dan "bendera" pada baris berikutnya)
Dada

1
Luar biasa! Saya tidak di komputer tetapi saya akan memperbaruinya besok! Terima kasih!
Dom Hastings

Apakah Anda yakin tentang menghapus q {} sekitar $ 2? Bukankah ini akan gagal ketika ada 3 - dan 3 + switch? (Saya tidak bisa mengujinya sekarang, jadi mungkin Anda benar, jadi lepaskan;))
Dada

@Dada ahhh, saya bertanya-tanya mengapa Anda menambahkannya, saya menguji semua case di test suite, tetapi tidak memikirkan penggantian 3 untuk 3 ...
Dom Hastings

3

GNU sed 86 Bytes

Termasuk +1 untuk -r

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

Cobalah online!

Contoh:

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

3

PHP, 98 97 byte

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

Tantangan ini menggambarkan perilaku str_replace yang tepat, jadi untuk php itu semua tentang membuat array pengganti. Saya mencoba melakukannya dengan hanya menggunakan satu "substring" tetapi itu mungkin bukan solusi terbaik. Gunakan seperti:

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"

sunting: 1 byte disimpan berkat Titus


Ini mungkin hal yang sesingkat mungkin. Tetapi $v[0]>'+'menghemat satu byte lebih $v[0]=='-'. Anda juga bisa menggunakannya ord($v)&4.
Titus

2

Java 7, 153 133 byte

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;}

Tidak digabungkan & kode uji:

Coba di sini.

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" }));
  }
}

Keluaran:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp

Apakah ini berfungsi untuk input new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Hanya menulis sesuatu yang (semoga) cocok dengan regex yang salah.
Roman Gräf

@ RomanGräf Ya, bekerja dan menghasilkan Rom No. Rom. Btw, Anda dapat mencobanya sendiri dengan mengeklik Try it here.tautan di pos, dan kemudian mem-forknya. :)
Kevin Cruijssen

Saya tahu tetapi saya saat ini di ponsel saya. :(
Roman Gräf

2

PHP, 164 Bytes

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 byte

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

Mengasumsikan input dalam format ini:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Menggabungkan -dan +menjadi register tunggal, dengan+ diubah menjadi a -.
  • :1s<C-R>"-g: Menggunakan register sebagai potongan kode, disisipkan langsung ke :sperintah, dengan -sebagai pemisah.


2

R, 98 94 byte

Sunting: disimpan 4 byte berkat @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

Kasus yang tidak disatukan dan diuji

Karena scan(membaca input dari stdin) tidak berfungsi dengan benar di R-fiddle saya menampilkan program dengan membungkusnya dalam suatu fungsi sebagai gantinya. Perhatikan bahwa fungsi mengambil vektor sebagai masukan dan dapat dijalankan oleh misalnya: f(c("Hello world", "-wo", "-ld", "+Ea", "+th")). Program gofled di atas akan meminta pengguna untuk memasukkan menggunakan stdin di mana mengetik"Hello world" -wo -ld -Ea +th di konsol akan menghasilkan hasil yang sama.

Jalankan kode pada R-fiddle

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
}

Bisakah Anda memberikan tautan test suite juga?
ʰᵈˑ

@ ʰᵈˑ menambahkan suite uji R-fiddle. Perhatikan bahwa test suite menggunakan fungsi alih-alih membaca input dari stdin seperti yang dijelaskan dalam jawaban yang diedit.
Billywob

Apakah jawaban ini valid, karena Anda harus menggunakan "sekitar string input?
rturnbull

@ Artbullbull Saya tidak melihat mengapa tidak. Membungkus setiap entri dengan tanda kutip dan menekan enter akan menghasilkan hasil yang setara (misalnya:) "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th"yang biasanya bagaimana string dibaca.
Billywob

1
Ya itu benar-benar terserah OP! Saya pribadi suka jawaban Anda apa adanya, tetapi saya khawatir jawaban itu mungkin tidak valid. Melihat jawaban untuk bahasa lain sepertinya kutipan cukup diterima. Sementara saya memiliki perhatian Anda, saya pikir Anda dapat golf off 4 byte dengan mengubah l=length(i)ke l=length(i)/2dan memperbarui referensi kemudian l.
rturnbull

2

Haskell, 85 78 byte

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

Contoh penggunaan: ("mississippi" # "-is -i") "+lz +p" -> "mlzslzspppp".

Bagaimana itu bekerja:

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

Sunting: @BlackCap menemukan 6 byte untuk disimpan dan saya sendiri yang lain.


6 byte: import Data.Lists;a#b=foldl(uncurry replaceflip)a.zip(g b).g;g=map tail.words
BlackCap

@ BlackCap: Bagus, terima kasih! Tidak perlu membuat flipinfiks. Awalan standar lebih pendek satu byte.
nimi

1

Python 3, 93 byte

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

Cobalah online!

Input adalah daftar dengan string, string pengganti dipisahkan oleh ruang.

Input contoh: ['mississippi','-is -i','+iz +p']


Apakah Anda dapat menambahkan tautan test suite?
ʰᵈˑ

Tautan yang disediakan dan ukurannya juga sedikit berkurang.
Gábor Fekete

1

PowerShell v2 +, 90 byte

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

Mengambil input sebagai tiga argumen, dengan string -dan +dipisahkan oleh spasi. Lakukan -spliton $b( -splitsaat berakting dalam mode unary terbagi di whitespace), kemudian |%{...}lewati masing-masing. Setiap iterasi yang kami lepaskan -, menemukan [$i++]string pengganti berikutnya dan menghapusnya +, dan menggunakan -creplace(penggantian case-sensitive) untuk mengiris dan memotong $adan menyimpannya kembali $a. Kemudian, $adibiarkan di atas pipa dan output tersirat.

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 byte

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;

pendekatan lurus ke depan. Jalankan dengan php -r '<code> <arguments>.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.