Desafío de reemplazo de cartas

17

La idea es simple. Debe crear un reemplazo de letra "visualizado", proporcionando 3 cadenas (la entrada puede estar separada por comas, entradas separadas o como una matriz). El primer segmento es la palabra que desea corregir, y el segundo segmento son las letras que desea reemplazar, y el tercer segmento es el reemplazo de las letras en el segmento 2.

Por ejemplo:

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

Explicación

Los reemplazos deben hacerse paso a paso con sus respectivos pares. Aquí hay una ilustración con una entrada de mississippi -is -i +iz +ppara dar la salida mpzspzsppp(ver ejemplo #7arriba)

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

Reglas

  • Las entradas siempre están en este orden <starting_string> <list_of_letters_to_replace> <replacement_letters>.
  • Las letras para reemplazar y los grupos de reemplazo nunca se mezclarán (es decir, nunca lo habrá -a +i -e +o).
  • Las letras para reemplazar siempre tienen el prefijo -y las letras de reemplazo siempre tienen el prefijo +. (El prefijo es obligatorio)
  • Puede haber más de un conjunto de letras para reemplazar, por lo que deberá mirar el prefijo.
  • Suponga que la cantidad de grupos de letras para reemplazar y la cantidad de grupos de letras de reemplazo siempre son iguales (es decir, nunca habrá -a -e +i)
  • Los reemplazos distinguen entre mayúsculas y minúsculas (ver ejemplo #1y #2).
  • Los reemplazos se realizan en el orden en que fueron dados en la entrada.
  • Los reemplazos de letras se pueden reemplazar con otros reemplazos. Ver ejemplo #6.
  • El primer segmento (palabra inicial) nunca incluirá -o +caracteres.
  • Este es el código de golf, por lo que ganan los bytes más cortos.

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

ʰᵈˑ
fuente
1
Dadas las reglas 2 y 5, realmente no necesita mirar el prefijo. Con n entradas, la entrada 0 es la cadena base, las entradas 1 a int (n / 2) son letter to replace(con prefijo -) y la entrada int (n / 2) +1 a n-1 son replacement(con prefijo +)
edc65
@ edc65 100% cierto, aunque el desafío fue diseñado para tener el prefijo (y podría inventar una explicación extraña de que soy un extraterrestre que no puede procesar reemplazos de letras sin su prefijo) pero en realidad, es solo otra barrera para detener esto siendo demasiado trivial, aunque mirar las respuestas actuales (todas son geniales por cierto) no fue una barrera compleja. También es un hecho divertido, la idea detrás de este desafío surgió de mi amigo en un chat de Skype. Deletreaba mal una palabra ( gello) y luego me enviaba los reemplazos de letras ( -g +h) porque quería ser molesto en lugar de enviar hello*.
ʰᵈˑ
1
Las entradas siempre están en este orden ¿Por qué tan restrictivo?
Luis Mendo
@LuisMendo Supongo que realmente no importa, pero es la forma en que mi amigo y yo lo formateamos, pero dado que se han publicado respuestas a este requisito, realmente no puedo hacer un cambio de regla. No fue cuestionado en el sandbox, por lo que no lo consideré como algo negativo.
ʰᵈˑ
1
@udioica tiene toda la razón y, de hecho, admite la regla "Los reemplazos distinguen entre mayúsculas y minúsculas". Ejecute el fragmento en la respuesta de JavaScript para verlo implementado. (# 1 w orld` vs # 2 W orld)
edc65

Respuestas:

6

05AB1E , 15 17 bytes

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

Pruébalo en línea!

Explicación

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

O con un formato de entrada menos estricto

vy`:

Pruébalo en línea

Emigna
fuente
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 prueba

Arnauld
fuente
5

Pyke, 13 11 bytes

z[zdcmt)[.:

Pruébalo aquí!

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

O 2 bytes si está en un formato de entrada diferente:

.:

Pruébalo aquí!

Azul
fuente
En el trabajo catbus.co.uk está bloqueado. ¿Puede vincular una suite de prueba alternativa por favor?
ʰᵈˑ
2
@ ʰᵈˑ No creo que sea razonable cumplir con la configuración de su firewall de trabajo (arbitrario).
orlp
1
@orlp: estoy de acuerdo, es una mierda. Pero no configuro la configuración del firewall. Solo quería probarlo
ʰᵈˑ
2
@hd puedes descargar Pyke en github.com/muddyfish/pyke
Azul
4

Perl, 58 bytes

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

Requiere el primer artículo en una línea, luego los reemplazos en la siguiente. ¡ Muchas gracias a @Dada que ideó un enfoque diferente para ayudar a reducir en 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
fuente
4 bytes más, hay perl -pE 's/(.*?) -(\S*)(.*?)\+(\S*)/"(\$1=~s%$2%$4%gr).\"$3\""/ee&&redo'. No puedo lograr que sea más corto, pero tal vez puedas :)
Dada
1
Gotcha! 58 Bytes: perl -pE '$a=<>;1while$a=~s%-(\S*)(.*?)\+(\S*)%"s/$1/$3/g;q{$2}"%ee'. (toma la cuerda en una línea y las "banderas" en la línea siguiente)
Dada
1
¡Increíble! No estoy en una computadora, ¡pero lo actualizaré mañana! ¡Gracias!
Dom Hastings
¿Estás seguro de eliminar la q {} que rodea a $ 2? ¿No fallaría esto cuando hay 3 y 3 + interruptores? (No puedo probarlo ahora, así que tal vez tenías razón, así que quítalo;))
Dada
@Dada ahhh, me preguntaba por qué lo habías agregado, probé todos los casos en la suite de prueba, pero no pensé en un reemplazo 3 por 3 ...
Dom Hastings
3

GNU sed 86 Bytes

Incluye +1 para -r

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

Pruébalo en línea!

Ejemplo:

$ echo 'Hello world -wo -ld +Ea +th'|sed -rf replace.sed
Hello Earth
Riley
fuente
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 desafío describe el comportamiento exacto de str_replace, por lo que para php se trata de hacer matrices de reemplazos. Traté de hacerlo usando solo una "subcadena", pero esa podría no ser la mejor solución. Usar 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 guardado gracias a Titus

usuario59178
fuente
Esto es probablemente lo más corto posible. Pero $v[0]>'+'ahorra un byte $v[0]=='-'. También podría usar ord($v)&4en su lugar.
Titus
2

Java 7, 153133 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 y código de prueba:

Pruébalo aquí

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

Salida:

Hello Earth
Hello Worth
Hey
Green
mlzslzspppp
Fiitbill
mpzspzspppp
Kevin Cruijssen
fuente
¿Funciona esto para la entrada new String[]{'Rom Ro. Rom", "-Ro." , "+No."}? Simplemente escribo algo que (con suerte) coincide con una expresión regular incorrecta.
Roman Gräf
@ RomanGräf Sí, trabajos y resultados Rom No. Rom. Por cierto, puedes probarlo tú mismo haciendo clic en el Try it here.enlace de la publicación y luego bifurcarlo. :)
Kevin Cruijssen
Lo sé pero actualmente estoy en mi móvil. :(
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;
Jörg Hülsermann
fuente
2

Vim, 25 bytes

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

Asume entrada en este formato:

mississippi
-is -i
+lz +p
  • +dE+r-PdiW: Combina -y+ en registro único, con el +convertido en a -.
  • :1s<C-R>"-g: Utiliza el registro como un fragmento de código, insertado directamente en el :scomando, con -el separador.
udioica
fuente
2

R, 98 94 bytes

Editar: guardado 4 bytes gracias 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

Sin golf y casos de prueba

Debido a que scan(lee la entrada de stdin) no funciona correctamente en R-fiddle, muestro el programa envolviéndolo en una función. Obsérvese que la función toma un vector como una entrada y se puede ejecutar por ejemplo: f(c("Hello world", "-wo", "-ld", "+Ea", "+th")). El programa gofled anterior solicitaría al usuario que ingrese usando stdin, por lo que escribir "Hello world" -wo -ld -Ea +then la consola produciría el mismo resultado.

Ejecute el código en 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
fuente
¿Puede proporcionar un enlace de suite de prueba también, por favor?
ʰᵈˑ
@ ʰᵈˑ agregó un conjunto de pruebas R-fiddle. Tenga en cuenta que el conjunto de pruebas utiliza una función en lugar de leer la entrada de stdin como se explica en la respuesta editada.
Billywob
¿Es válida esta respuesta, ya que tiene que usar "alrededor de la cadena de entrada?
rturnbull
@rturnbull No veo por qué no. Ajustar cada entrada con comillas y presionar enter arrojaría el resultado equivalente (por ejemplo:), "Hello world" => enter => "-wo" => enter => "-ld" => enter => "+Ea" => enter =>"+th"que generalmente es cómo se leen las cadenas de todos modos.
Billywob
1
Sí, ¡realmente depende del OP! Personalmente, me gusta su respuesta tal como está, pero me preocupaba que pudiera ser inválida. Mirando las respuestas para otros idiomas, parece que las citas son bastante aceptadas. Mientras que tengo su atención, creo que se puede jugar golf de 4 bytes cambiando l=length(i)a l=length(i)/2y la actualización de las referencias posteriores a l.
rturnbull
2

Haskell, 85 78 bytes

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

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

Cómo 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

Editar: @BlackCap encontró 6 bytes para guardar y yo mismo otro.

nimi
fuente
6 bytes: import Data.Lists;a#b=foldl(uncurry replacevoltear)a.zip(g b).g;g=map tail.words
BlackCap
@BlackCap: Bien, gracias! No es necesario hacer flipinfijo. El prefijo estándar es un byte más corto.
nimi
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

Pruébalo en línea!

La entrada es una lista con cadenas, las cadenas de reemplazo están separadas por espacios.

Entrada de ejemplo: ['mississippi','-is -i','+iz +p']

Gábor Fekete
fuente
¿Puede agregar un enlace de suite de prueba, por favor?
ʰᵈˑ
Enlace proporcionado y también reducido un poco el tamaño.
Gábor Fekete
1

PowerShell v2 +, 90 bytes

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

Toma de entrada como tres argumentos, con el -y +cadenas espacio separados. Realiza un -splitencendido $b(el -splitcuando actúa de manera unaria se divide en espacios en blanco), luego recorre |%{...}cada uno de ellos. Cada iteración estamos eliminando -, encontrando la siguiente [$i++]cadena de reemplazo y quitándola +, y usando el -creplace(reemplazo sensible a mayúsculas y minúsculas) para cortar y cortar en dados $ay almacenarlo nuevamente $a. Luego, $ase deja en la tubería y la salida es 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
fuente
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;

Enfoque directo. Corre con php -r '<code> <arguments>.

Tito
fuente