Wyzwanie zamiany listów


17

Pomysł jest prosty. Musisz stworzyć „wizualizowaną” zamianę liter, podając 3 ciągi znaków (dane wejściowe mogą być oddzielone przecinkami, osobne dane wejściowe lub jako tablica). Pierwszy segment to słowo, które chcesz poprawić, a drugi segment to litery, które chcesz zastąpić, a trzeci segment zastępuje litery w segmencie 2.

Na przykład:

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

Wyjaśnienie

Wymianę należy wykonywać krok po kroku za pomocą odpowiedniej pary. Oto ilustracja z mississippi -is -i +iz +pdanymi wejściowymi do podania wyniku mpzspzsppp(patrz przykład #7powyżej)

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

Zasady

  • Dane wejściowe są zawsze w tej kolejności <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Listy do zastąpienia i grupy zastępcze nigdy nie będą mieszane (tzn. Nigdy nie będzie -a +i -e +o).
  • Litery do zamiany są zawsze poprzedzone prefiksem, -a litery zastępujące są zawsze poprzedzone prefiksem +. (Prefiks jest obowiązkowy)
  • Może być więcej niż jeden zestaw liter do zastąpienia, więc musisz spojrzeć na prefiks.
  • Załóżmy, że liczba grup liter do zastąpienia i liczba zastępczych grup liter są zawsze równe (tzn .: nigdy nie będzie -a -e +i)
  • W zamiennikach rozróżniana jest wielkość liter (patrz przykład #1i #2).
  • Wymiana odbywa się w kolejności, w jakiej została podana w danych wejściowych.
  • Zastąpienia literowe można zastąpić innymi zamiennikami. Patrz przykład #6.
  • The (słowo zaczynające) pierwszy segment będzie nigdy zawierać -lub +znaków.
  • To jest golf golfowy, więc wygrywają najkrótsze bajty.

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](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
Biorąc pod uwagę zasady 2 i 5, naprawdę nie musisz patrzeć na prefiks. Przy n wejściach wejście 0 jest łańcuchem bazowym, wejścia 1 do int (n / 2) są letter to replace(z przedrostkiem -), a wejścia int (n / 2) +1 do n-1 to replacement(z przedrostkiem +)
edc65

@ edc65 100% prawda, chociaż wyzwanie miało mieć prefiks (i mógłbym wymyślić jakieś dziwne wyjaśnienie, że jestem kosmitą, który nie może przetwarzać zamiany liter bez ich prefiksu), ale w rzeczywistości jest to kolejna bariera, aby to zatrzymać zbyt trywialne - choć patrząc na aktualne odpowiedzi (wszystkie są świetne), nie była to złożona bariera. Ciekawostką jest, że pomysł stojący za tym wyzwaniem zrodził się od mojego znajomego na czacie Skype. Błędnie przeliterował słowo ( gello), a następnie przesłał mi zamienniki listów ( -g +h), ponieważ zamiast wysyłać, chciał być denerwujący hello*.
ʰᵈˑ

1
Dane wejściowe są zawsze w tej kolejności. Dlaczego tak restrykcyjne?
Luis Mendo

@LuisMendo Wydaje mi się, że to naprawdę nie ma znaczenia - ale tak właśnie sformatowałem mój przyjaciel i ja, ale ponieważ odpowiedzi na ten wymóg zostały opublikowane, tak naprawdę nie mogę zmienić reguły. Nie był kwestionowany w piaskownicy, więc nie uważałem tego za negatywne.
ʰᵈˑ

1
@udioica ma perfekcyjną rację i w rzeczywistości obsługuje regułę „Zamienniki uwzględniają wielkość liter”. Uruchom fragment kodu w odpowiedzi JavaScript, aby zobaczyć, jak został zaimplementowany. (# 1 w orld` vs # 2 W orld)
edc65 17.10.16

Odpowiedzi:


6

05AB1E , 15 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Lub z mniej ścisłym formatem wejściowym

vy`:

Wypróbuj online


6

JavaScript (ES6), 85 83 bajtów

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]

Przypadki testowe


5

Pyke, 13 11 bajtów

z[zdcmt)[.:

Wypróbuj tutaj!

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

Lub 2 bajty, jeśli mają inny format wejściowy:

.:

Wypróbuj tutaj!


W pracy catbus.co.uk jest zablokowany. Czy możesz połączyć alternatywny pakiet testowy?
ʰᵈˑ

2
@ ʰᵈˑ Nie wydaje mi się, że zgodność z (dowolnymi) ustawieniami zapory pracy jest uzasadniona.
lub

1
@orlp - Zgadzam się, to gówno. Ale nie ustawiam ustawień zapory. Chciałem tylko to przetestować
ʰᵈˑ

2
@hd Możesz pobrać Pyke ze strony github.com/muddyfish/pyke
Blue

4

Perl, 58 bajtów

Kod 57 bajtów + 1 dla -p.

Wymaga pierwszego elementu w jednym wierszu, a następnie zamienników w następnym. Ogromne podziękowania dla @Dada, który wymyślił inne podejście do zmniejszenia o 4 bajty!

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

Stosowanie

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

Jeszcze 4 bajty perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. Nie mogę go skrócić, ale może zdołasz :)
Dada,

1
Gotcha! 58 bajtów: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (bierze ciąg w jednym wierszu, a „flagi” w następnym wierszu)
Dada,

1
Niesamowite! Nie jestem przy komputerze, ale zaktualizuję to jutro! Dzięki!
Dom Hastings,

Czy na pewno chcesz usunąć q {} otaczające 2 USD? Czy to nie zawiedzie, gdy są przełączniki 3 - i 3 +? (Nie mogę go teraz przetestować, więc może miałeś rację, więc usuń go;))
Dada,

@Dada ahhh, zastanawiałem się, dlaczego to dodałeś, przetestowałem wszystkie przypadki w pakiecie testowym, ale nie pomyślałem o zamianie 3 za 3 ...
Dom Hastings

3

GNU sed 86 bajtów

Obejmuje +1 za -r

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

Wypróbuj online!

Przykład:

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

3

PHP, 98 97 bajtów

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

To wyzwanie opisuje dokładne zachowanie str_replace, więc w php chodzi o tworzenie tablic zamienników. Próbowałem to zrobić, używając tylko jednego „podciągu”, ale to może nie być najlepsze rozwiązanie. Użyj jak:

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"

edycja: 1 bajt zapisany dzięki Tytusowi


To prawdopodobnie najkrótsza możliwa rzecz. Ale $v[0]>'+'oszczędza jeden bajt $v[0]=='-'. Możesz również użyć ord($v)&4zamiast tego.
Tytus

2

Java 7, 153 133 bajty

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

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wynik:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp

Czy to działa na dane wejściowe new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Po prostu napisanie czegoś, co (mam nadzieję) pasuje do złego wyrażenia regularnego.
Roman Gräf

@ RomanGräf Tak, działa i wychodzi Rom No. Rom. Przy okazji możesz spróbować samodzielnie, klikając Try it here.link w poście, a następnie rozwidlając go. :)
Kevin Cruijssen

Wiem, ale obecnie jestem na telefonie komórkowym. :(
Roman Gräf

2

PHP, 164 bajtów

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 bajtów

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

Zakłada dane wejściowe w tym formacie:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Kombajny -i +do jednego z rejestrów, z+ przekształcony w- .
  • :1s<C-R>"-g: Używa rejestru jako fragmentu kodu wstawionego bezpośrednio do :spolecenia, z -separatorem.


2

R, 98 bajtów

Edycja: zapisano 4 bajty dzięki @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

Przypadki bez golfa i testy

Ponieważ scan(odczytuje dane wejściowe ze standardowego wejścia) nie działa poprawnie w skrzypcach typu R, dlatego pokazuję program, zawijając go w funkcji. Zauważ, że funkcja przyjmuje wektor jako dane wejściowe i może być uruchomiona np f(c("Hello world", "-wo", "-ld", "+Ea", "+th")). : Program gofled powyżej zachęciłby użytkownika do wprowadzenia danych za pomocą stdin, podczas którego wpisuje się"Hello world" -wo -ld -Ea +th w konsoli dałoby ten sam wynik.

Uruchom kod na skrzypcach 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
}

Czy możesz również podać link do zestawu testów?
ʰᵈˑ

@ ʰᵈˑ dodał pakiet testowy skrzypiec R. Zauważ, że pakiet testowy używa funkcji zamiast odczytu danych wejściowych ze standardowego wejścia, jak wyjaśniono w edytowanej odpowiedzi.
Billywob 17.10.16

Czy ta odpowiedź jest prawidłowa, ponieważ musisz użyć "wokół ciągu wejściowego?
rturnbull

@rturnbull Nie rozumiem, dlaczego nie. Zawijanie każdego wpisu cudzysłowami i naciśnięcie klawisza enter dałoby równoważny wynik (np "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th".:), co zwykle tak czyta ciągi znaków.
Billywob,

1
Tak, to naprawdę zależy od OP! Osobiście podoba mi się twoja odpowiedź, ale martwiłem się, że może być nieważna. Patrząc na odpowiedzi dla innych języków, wydaje się, że cytaty są dość akceptowane. Chociaż mam swoją uwagę, myślę, że można wyłączyć golf 4 bajty zmieniając l=length(i)się l=length(i)/2i aktualizowania późniejszych odniesień do l.
rturnbull

2

Haskell, 85 78 bajtów

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

Przykład użycia: ("mississippi" # "-is -i") "+lz +p"->"mlzslzspppp" .

Jak to działa:

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

Edycja: @BlackCap znalazł 6 bajtów do zapisania, a ja sam kolejny.


6 bajtów: import Data.Lists;a#b=foldl(uncurry replaceklapki)a.zip(g b).g;g=map tail.words
BlackCap

@BlackCap: Fajnie, dziękuję! Nie trzeba wprowadzać flippoprawki. Standardowy prefiks jest o jeden bajt krótszy.
nimi

1

Python 3, 93 bajty

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

Wypróbuj online!

Dane wejściowe to lista z ciągami, ciągi zastępujące są oddzielone spacjami.

Przykładowe dane wejściowe: ['mississippi','-is -i','+iz +p']


Czy możesz dodać link do zestawu testów?
ʰᵈˑ

Link pod warunkiem, a także nieco zmniejszony rozmiar.
Gábor Fekete

1

PowerShell v2 +, 90 bajtów

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

Zajmuje wejście jako trzy argumenty, z -i +ciągi spacjami. Wykonuje -spliton $b( -splitgdy działając w sposób jednoznaczny dzieli się na białe znaki), a następnie wykonuje pętlę |%{...}przez każdą z nich. Każdą iterację usuwamy -, znajdujemy następny [$i++]ciąg zastępujący i usuwamy +z niego, i używamy -creplace(zamiana wielkości liter) do krojenia, kostkowania $ai przechowywania go z powrotem $a. Następnie $apozostaje w potoku, a dane wyjściowe są niejawne.

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 bajtów

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;

proste podejście. Uruchom z php -r '<code> <arguments>.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.