Desafio de substituição de cartas

17

A ideia é simples. Você deve criar uma substituição de letra "visualizada", fornecendo três cadeias (a entrada pode ser separada por vírgula, entradas separadas ou como uma matriz). O primeiro segmento é a palavra que você deseja corrigir e o segundo segmento são as letras que você deseja substituir e o terceiro segmento é a substituição das letras no segmento 2.

Por exemplo:

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

Explicação

As substituições devem ser feitas passo a passo com o respectivo par. Aqui está uma ilustração com uma entrada de mississippi -is -i +iz +ppara fornecer a saída mpzspzsppp(veja o exemplo #7acima)

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

Regras

  • As entradas estão sempre nessa ordem <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Cartas para substituir e substituir grupos nunca serão misturadas (ou seja: nunca haverá -a +i -e +o).
  • As letras a serem substituídas sempre são prefixadas -e as letras de substituição são sempre prefixadas +. (O prefixo é obrigatório)
  • Pode haver mais de um conjunto de letras para substituir, portanto, você deve procurar o prefixo.
  • Suponha que a quantidade de grupos de letras a ser substituída e a quantidade de grupos de letras de substituição sejam sempre iguais (ou seja: nunca haverá -a -e +i)
  • As substituições diferenciam maiúsculas de minúsculas (veja o exemplo #1e #2).
  • As substituições são feitas na ordem em que foram fornecidas na entrada.
  • As substituições de letras podem ser substituídas por outras substituições. Veja exemplo #6.
  • O primeiro segmento (palavra inicial) nunca incluirá -ou +caracteres.
  • Isso é código-golfe, então os bytes mais curtos vencem.

Classificação

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números em seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades de sinalizador de intérprete separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:

# [><>](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>

ʰᵈˑ
fonte
11
Dadas as regras 2 e 5, você realmente não precisa procurar o prefixo. Com n entradas, a entrada 0 é a sequência base, as entradas 1 a int (n / 2) são letter to replace(com prefixo -) e a entrada int (n / 2) +1 a n-1 são replacement(com prefixo +)
edc65
@ edc65 100% verdadeiro, embora o desafio tenha sido projetado para ter o prefixo (e eu possa inventar uma explicação estranha de que sou um alienígena que não pode processar substituições de letras sem o prefixo), mas, na realidade, é apenas mais uma barreira para impedir isso. sendo muito trivial - apesar de olhar para as respostas atuais (todas são ótimas por sinal), não era uma barreira complexa. Além disso, o fato divertido foi que a ideia por trás desse desafio surgiu do meu amigo em um bate-papo do Skype. Ele soletrou incorretamente uma palavra ( gello) e depois me enviou as substituições de cartas ( -g +h) porque ele queria ser irritante em vez de enviar hello*.
ʰᵈˑ
11
As entradas estão sempre nessa ordem Por que tão restritivas?
Luis Mendo
@LuisMendo Acho que isso realmente não importa - mas é como meu amigo e eu o formatamos, mas desde que as respostas foram postadas para esse requisito, não posso realmente fazer uma alteração na regra. Não foi questionado na caixa de areia, então não pensei nisso como negativo.
ʰᵈˑ
11
O @udioica está perfeitamente correto e, de fato, suporta a regra "Substituições diferenciam maiúsculas de minúsculas". Execute o trecho na resposta JavaScript para vê-lo implementado. (# 1 w orld` vs # 2 W orld)
edc65 17-17

Respostas:

6

05AB1E , 15 17 bytes

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

Experimente online!

Explicação

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

Ou com um formato de entrada menos estrito

vy`:

Experimente online

Emigna
fonte
6

JavaScript (ES6), 85 83 bytes

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]

Casos de teste

Arnauld
fonte
5

Pyke, 13 11 bytes

z[zdcmt)[.:

Experimente aqui!

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

Ou 2 bytes, se estiver em um formato de entrada diferente:

.:

Experimente aqui!

Azul
fonte
No trabalho, catbus.co.uk está bloqueado. Você pode vincular um conjunto de testes alternativo, por favor?
ʰᵈˑ
2
@ ʰᵈˑ Não acredito que a conformidade com as configurações do firewall de trabalho (arbitrárias) seja razoável.
orlp
11
@orlp - Eu concordo, é uma merda. Mas não defino as configurações do firewall. Eu só queria testá-lo
17/16
2
@hd, você pode baixar o Pyke em github.com/muddyfish/pyke
Blue
4

Perl, 58 bytes

Código de 57 bytes + 1 para -p .

Requer o primeiro item em uma linha e as substituições na próxima. Muito obrigado a @Dada, que criou uma abordagem diferente para ajudar a reduzir em 4 bytes!

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

Uso

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
Dom Hastings
fonte
4 bytes mais, existe perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. Não consigo diminuí-lo, mas talvez você possa :) #
Dada
11
Peguei vocês! 58 bytes: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (pega a corda em uma linha e as "bandeiras" na próxima linha)
Dada
11
Impressionante! Não estou em um computador, mas atualizo isso amanhã! Obrigado!
Dom Hastings
Tem certeza de que remove o q {} em torno de $ 2? Isso não falharia quando há comutadores 3 e 3 +? (Eu não posso testá-lo agora, então talvez você estava certo para removê-lo;))
Dada
@Dada ahhh, eu me pergunto por que você tinha adicionado-lo, eu testei todos os casos no conjunto de testes, mas não acho que cerca de 3 por 3 substituição ...
Dom Hastings
3

GNU sed 86 bytes

Inclui +1 para -r

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

Experimente online!

Exemplo:

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

PHP, 98 97 bytes

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

Este desafio descreve o comportamento exato do str_replace, portanto, para o php, trata-se de fazer as matrizes de substituições. Tentei fazê-lo usando apenas uma "substring", mas essa pode não ser a melhor solução. Use como:

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"

editar: 1 byte salvo graças a Titus

user59178
fonte
Esta é provavelmente a coisa mais curta possível. Mas $v[0]>'+'economiza um byte $v[0]=='-'. Você também pode usar ord($v)&4.
Titus
2

Java 7, 153 133 bytes

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 & código de teste:

Experimente aqui.

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

Resultado:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp
Kevin Cruijssen
fonte
Isso funciona para a entrada new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Basta escrever algo que (espero) corresponda a uma expressão regular errada.
Roman Gräf
@ RomanGräf Sim, funciona e sai Rom No. Rom. Aliás, você pode tentar você mesmo clicando no Try it here.link da publicação e depois bifurcando-o. :)
Kevin Cruijssen
Eu sei, mas atualmente estou no meu celular. :(
Gräf Roman
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;
Jörg Hülsermann
fonte
2

Vim, 25 bytes

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

Assume a entrada neste formato:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Combina -e +em um único registro, com o +transformado em- .
  • :1s<C-R>"-g: Usa o registro como um trecho de código, inserido diretamente no :scomando, com -o separador.
udioica
fonte
2

R, 98 94 bytes

Edit: salvou 4 bytes graças a @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

Casos não testados e de teste

Como scan(lê a entrada de stdin) não funciona corretamente no R-fiddle, mostro o programa envolvendo-o em uma função. Note-se que a função leva um vector tal como uma entrada, e pode ser executado por, por exemplo: f(c("Hello world", "-wo", "-ld", "+Ea", "+th")). O programa gofled acima solicitaria ao usuário a entrada usando stdin, digitando"Hello world" -wo -ld -Ea +th o console renderia o mesmo resultado.

Execute o código no 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
}
Billywob
fonte
Você também pode fornecer um link para a suíte de testes?
ʰᵈˑ
@ ʰᵈˑ adicionou um conjunto de testes R-fiddle. Observe que o conjunto de testes usa uma função em vez de ler a entrada de stdin, conforme explicado na resposta editada.
22716 Billyhob
Esta resposta é válida, pois você deve usar em "torno da string de entrada?
rturnbull
@rturnbull Não vejo por que não. Envolvendo cada entrada com aspas e pressionando enter produziria o resultado equivalente (por exemplo "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th":), que geralmente é como as strings são lidas de qualquer maneira.
Billywob
11
Sim, é realmente até o OP! Pessoalmente, gosto da sua resposta como está, mas estava preocupada que ela pudesse ser inválida. Olhando as respostas para outros idiomas, parece que as aspas são bem aceitas. Enquanto eu ter sua atenção, eu acho que você pode golfe off 4 bytes, alterando l=length(i)a l=length(i)/2e atualizar as referências posteriores l.
Rtbull #
2

Haskell, 85 78 bytes

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

Exemplo de uso: ("mississippi" # "-is -i") "+lz +p"->"mlzslzspppp" .

Como funciona:

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

Edit: @BlackCap encontrado 6 bytes para salvar e eu mesmo outro.

nimi
fonte
6 bytes: import Data.Lists;a#b=foldl(uncurry replaceflip)a.zip(g b).g;g=map tail.words
BlackCap 31/10
@BlackCap: Bom, obrigado! Não há necessidade de fazer flipinfix. O prefixo padrão é um byte mais curto.
N /
1

Python 3, 93 bytes

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

Experimente online!

A entrada é uma lista com cadeias, as cadeias de substituição são separadas por espaço.

Exemplo de entrada: ['mississippi','-is -i','+iz +p']

Gábor Fekete
fonte
Você pode adicionar um link do conjunto de testes, por favor?
ʰᵈˑ
Link fornecido e também reduziu um pouco o tamanho.
Gábor Fekete 17/10
1

PowerShell v2 +, 90 bytes

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

Toma entrada como argumentos três, com a -e +cadeias de espaço separado. Executa um -spliton $b( -splitquando atua de maneira unária divide-se em espaço em branco) e, em seguida, |%{...}percorre cada um deles. A cada iteração que estamos removendo -, localizando a próxima [$i++]cadeia de substituição e removendo +dela, e usando a -creplace(substituição com distinção entre maiúsculas e minúsculas) para cortar e cortar dados $ae armazená-la novamente $a. Em seguida, $aé deixado no pipeline e a saída é implícita.

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

PHP, 106 bytes

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;

abordagem direta. Corra com php -r '<code> <arguments>.

Titus
fonte