Mektup değiştirme zorluğu


17

Fikir basit. 3 dize (giriş virgülle ayrılmış, ayrı girişler veya dizi olarak olabilir) sağlayarak "görselleştirilmiş" bir harf değiştirme işlemi oluşturmanız gerekir. İlk bölüm düzeltmek istediğiniz kelimedir ve ikinci bölüm değiştirmek istediğiniz harflerdir ve üçüncü bölüm ise bölüm 2'deki harflerin yerine geçer.

Örneğin:

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

açıklama

Değiştirmeler kendi çiftleriyle adım adım yapılacaktır. İşte mississippi -is -i +iz +pçıktıyı vermek için girişi olan bir mpzspzspppörnek ( #7yukarıdaki örneğe bakın )

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

kurallar

  • Girişler her zaman bu sıradadır <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Değiştirilecek gruplar ve grupların değiştirilmesi asla karıştırılmayacaktır (yani: asla olmayacak -a +i -e +o).
  • Yerine Mektuplar edilir hep öneki -ve yedek harfler hep kodu bulunmaktadır +. (Ön ek zorunludur)
  • Değiştirilecek birden fazla harf grubu olabilir, bu nedenle ön eke bakmanız gerekir.
  • Değiştirilecek harf grubu miktarının ve yedek harf grubu miktarının her zaman eşit olduğunu varsayalım (yani: asla olmayacak -a -e +i)
  • Değiştirmeler büyük / küçük harfe duyarlıdır (bkz. Örnek #1ve #2).
  • Değiştirmeler, girdide verildikleri sırayla yapılır.
  • Harf değiştirmeleri diğer değiştirmelerle değiştirilebilir. Örneğe bakın #6.
  • İlk segment (başlangıç ​​sözcüğü) asla- veya +karakter içermez .
  • Bu kod golf çok kısa bayt kazanmak.

Liderler

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](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
Kural 2 ve 5 göz önüne alındığında, gerçekten ön eke bakmanıza gerek yoktur. N girişlerinde 0 girişi temel dizgidir, 1'den int'e (n / 2) girişler letter to replace(önekle -) ve giriş int (n / 2) +1'den n-1'e replacement(önekle +)
edc65

@ edc65% 100 doğru, meydan okuma önek için tasarlanmış olsa da (ve önekleri olmadan harf değiştirmeyi işleyemeyen bir yabancı olduğumu garip bir açıklama yapabilirim) ama gerçekte, bunu durdurmak için sadece başka bir engel çok önemsiz olmak - mevcut cevaplara bakarken (hepsi bu arada harika) karmaşık bir engel değildi. Ayrıca eğlenceli gerçek, bu zorluğun arkasındaki fikir bir Skype sohbetinde arkadaşımdan doğdu. Bir kelimeyi yanlış heceleyecekti ( gello) ve sonra bana mektup değiştirmelerini ( -g +h) gönderecekti çünkü göndermek yerine can sıkıcı olmak istiyordu hello*.
ʰᵈˑ

1
Girişler her zaman bu sıradadır Neden bu kadar kısıtlayıcı?
Luis Mendo

@LuisMendo Sanırım gerçekten önemli değil - ama arkadaşım ve ben bunu biçimlendirdik, ancak cevaplar bu gereksinime gönderildiğinden, gerçekten bir kural değişikliği yapamıyorum. Sandbox'ta sorgulanmadı, bu yüzden olumsuz olarak düşünmedim.
ʰᵈˑ

1
@udioica mükemmel bir şekilde doğrudur ve aslında "Değiştirmeler büyük / küçük harfe duyarlıdır" kuralını destekler. Uygulandığını görmek için snippet'i JavaScript yanıtında çalıştırın. (# 1 w orld` vs # 2 W orld)
edc65

Yanıtlar:


6

05AB1E , 15 17 bayt

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

Çevrimiçi deneyin!

açıklama

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

Veya daha az katı bir giriş formatıyla

vy`:

Çevrimiçi deneyin


6

JavaScript (ES6), 85 83 bayt

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]

Test senaryoları


5

Pyke, 13 11 bayt

z[zdcmt)[.:

Burada deneyin!

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

Veya farklı bir giriş biçimindeyse 2 bayt:

.:

Burada deneyin!


İş yerinde catbus.co.uk engellendi. Lütfen alternatif bir test paketini bağlayabilir misiniz?
ʰᵈˑ

2
@ ʰᵈˑ (Keyfi) iş güvenlik duvarı ayarlarınıza uymanın makul olduğuna inanmıyorum.
orlp

1
@orlp - Katılıyorum, bu bok. Ancak güvenlik duvarı ayarlarını yapmıyorum. Sadece test etmek istedim
ʰᵈˑ

2
@hd Pyke'i github.com/muddyfish/pyke adresinden indirebilirsiniz
Blue

4

Perl, 58 bayt

İçin 57 bayt kodu + 1 -p.

Bir satırdaki ilk öğeyi, sonra bir sonraki öğenin değiştirilmesini gerektirir. 4 bayt azaltmaya yardımcı olmak için farklı bir yaklaşım sunan @Dada'ya çok teşekkürler !

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

kullanım

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 bayt daha uzun perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. Daha kısa elde edemiyorum, ama belki de yapabilirsiniz :)
Dada

1
Anladım! 58 bayt: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (bir satırdaki ipi ve sonraki satırdaki "bayrakları" alır)
Dada

1
Müthiş! Bilgisayarda değilim ama yarın güncelleyeceğim! Teşekkürler!
Dom Hastings

2 $ civarı çevreleyen q {} hesabını kaldırmak istediğinizden emin misiniz? 3 ve 3 + anahtarları olduğunda bu başarısız olmaz mı? (Şimdi test edemiyorum, belki haklıydın, bu yüzden kaldır;))
Dada

@Dada ahhh, neden eklediğini merak ettim, test takımındaki tüm vakaları test ettim, ancak 3 değiştirme için 3'ü düşünmedim ...
Dom Hastings

3

GNU sed 86 Bayt

-R için +1 içerir

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

Çevrimiçi deneyin!

Misal:

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

3

PHP, 98 97 bayt

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

Bu zorluk str_replace'ın tam davranışını açıklar, bu yüzden php için tamamen değiştirme dizileri yapmakla ilgilidir. Ben sadece bir "alt dize" kullanarak yapmaya çalıştım ama bu en iyi çözüm olmayabilir. Gibi kullanın:

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"

edit: Titus sayesinde 1 bayt kaydedildi


Bu muhtemelen mümkün olan en kısa şeydir. Ama $v[0]>'+'bir bayt kurtarır $v[0]=='-'. Bunun ord($v)&4yerine de kullanabilirsiniz .
Titus

2

Java 7, 153133 bayt

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

Test edilmemiş ve test kodu:

Burada deneyin.

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

Çıktı:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp

Bu girdi için işe yarıyor mu new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Sadece (umarım) yanlış bir normal ifadeyle eşleşen bir şey yazmak.
Roman Gräf

@ RomanGräf Evet, çalışıyor ve çıktılar Rom No. Rom. Btw, gönderideki Try it here.bağlantıyı tıklatarak kendiniz deneyebilir ve ardından çatallayabilirsiniz. :)
Kevin Cruijssen

Biliyorum ama şu anda cep telefonumdayım. :(
Roman Gräf

2

PHP, 164 Bayt

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 bayt

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

Bu biçimde girdi kabul edilir:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Biçerdöverler -ve+ tek bir kayıt +halinde,- .
  • :1s<C-R>"-g: Kaydı , ayırıcı olarak doğrudan :skomuta eklenen bir kod snippet'i olarak kullanır -.


2

R, 98 94 bayt

Düzenleme: @rturnbull sayesinde 4 bayt kaydedildi

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

Test edilmemiş ve test senaryoları

Çünkü scanR-keman I düzgün çalışmıyor (girdiyi standart girdiden okur) bir işlevi yerine sararak programını vitrin. Fonksiyonun bir vektörü girdi olarak aldığını ve örneğin: tarafından çalıştırılabileceğini unutmayın f(c("Hello world", "-wo", "-ld", "+Ea", "+th")). Yukarıdaki gofled program kullanıcının stdin kullanarak giriş yapmasını isteyecek ve"Hello world" -wo -ld -Ea +th konsolda aynı sonucu verecektir.

R-kemanda kodu çalıştırın

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
}

Ayrıca bir test paketi bağlantısı sağlayabilir misiniz?
ʰᵈˑ

@ ʰᵈˑ bir R-keman test paketi ekledi. Test paketinin düzenlenen cevapta açıklandığı gibi stdin'den girdi okumak yerine bir işlev kullandığını unutmayın.
Billywob

"Giriş dizesi etrafında kullanmak zorunda olduğunuz için bu yanıt geçerli mi?
rturnbull

@rturnbull Neden olmasın anlamıyorum. Her girişi tırnak işareti ile sarmak ve enter tuşuna basmak "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th", genellikle dizelerin nasıl okunduğuna eşdeğer bir sonuç verir (örneğin :).
Billywob

1
Evet, gerçekten OP! Kişisel olarak cevabınızı olduğu gibi seviyorum, ancak bunun geçersiz olabileceğinden endişelendim. Diğer dillere verilen cevaplara baktığımızda tırnak işaretleri oldukça kabul görmüş gibi görünüyor. İlginize sahip iken, yapabileceğini düşünüyorum değiştirerek 4 bayt kapalı golf l=length(i)için l=length(i)/2ve daha sonra referanslar güncellenmesi l.
rturnbull

2

Haskell, 85 78 bayt

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

Kullanım örneği: ("mississippi" # "-is -i") "+lz +p"-> "mlzslzspppp".

Nasıl çalışır:

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

Düzenleme: @BlackCap kaydetmek için 6 bayt bulundu ve ben başka bir tane.


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

@BlackCap: Güzel, teşekkürler! flipInfix yapmaya gerek yok . Standart önek bir bayt daha kısadır.
nimi

1

Python 3, 93 bayt

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

Çevrimiçi deneyin!

Girdi, dizeleri olan bir listedir, yedek dizeler boşlukla ayrılmıştır.

Örnek girdi: ['mississippi','-is -i','+iz +p']


Test paketi bağlantısı ekleyebilir misiniz, lütfen?
ʰᵈˑ

Bağlantı sağlandı ve ayrıca boyutu biraz küçüldü.
Gábor Fekete

1

PowerShell v2 +, 90 bayt

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

Girdiyi -ve +dizeleri boşlukla ayrılmış olarak üç bağımsız değişken olarak alır . Bir -splitaçık gerçekleştirir $b( -splittek yönlü bir şekilde hareket ederken boşlukta ayrılır), sonra |%{...}bunların her birinde dolaşır. Kaldırdığımız her yineleme -, bir sonraki [$i++]değiştirme dizesini bulma ve +ondan çıkarma ve -creplace(büyük / küçük harfe duyarlı değiştirme) kullanarak dilimleme ve zar atma $ave geri kaydetme $a. Sonra, $aboru hattında bırakılır ve çıktı örtüktür.

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 bayt

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;

doğrudan yaklaşım. İle çalıştırın php -r '<code> <arguments>.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.