Palabras de Spoonerise

50

Dadas dos palabras, cucharearlas cambiando sus grupos de consonantes iniciales. Pocos bytes ganan.

plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
few years -> yew fears

Las consonantes que aparecen antes de la primera vocal ( aeiou) se cambian.

Entrada: Dos cadenas en minúsculas que comienzan con diferentes consonantes y cada una contiene una vocal aeiou.

Salida: las dos cadenas de cuchara, en el orden correcto.

Para entrada y / o salida, las dos cadenas también pueden estar en una lista o similar, o como una sola cadena con separador.


Esto es casi un engaño de esta vieja pregunta , pero espero escribir una especificación que sea más clara y estable para que el viejo pueda cerrarse como un engaño .

xnor
fuente
44
Las palabras comienzan con consonantes.
xnor
21
La respuesta debería ser "oozing snotter"imo ~
Patrick Roberts
3
@PatrickRoberts Estoy de acuerdo, pero esto hace que el desafío sea un poco más simple.
xnor
1
No muy sobre el tema, pero un buen ejemplo copo de nieve -> serpiente de flujo
flawr
1
No se permite la participación de las suertes rápidas y los tiros tímidos
Denham Coote

Respuestas:

50

Vim, 18 pulsaciones de teclas

/[aeiou]<CR>dbwvnhp0P

El truco crucial es que pegar algo en el modo Visual en realidad coloca el contenido anterior de la selección visual en el búfer de pegado.

orlp
fuente
... oh, duh, no pensé en eso. Seguía siendo rechazado por vser inclusivo e intentar seleccionar de la vocal de regreso.
Pomo de la puerta
10
Como usuario casual de vim, seguía sorprendiéndome mientras escribía cada comando sucesivo
Aaron
44
<CR> significa retorno de carro (¡antiguo término de máquina de escribir!), También conocido como Enter
Kai Carver el
22

brainfuck, 238 207 bytes

,[[<+<+>>-]++++[<-------->-]-[<<-->>-----]<<+++++[----[----[------[------>>]]]]>[>>]>,]<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]<[<<]-[<+>---]>[>.>]<[<<]<<[<<]>[>>]>[.>>]<.<[<<]>[>.>]>[>>]>[>>]>[.>>]

Requiere ,devolver 0 en EOF, celdas de ajuste de 8 bits y la capacidad de moverse hacia la izquierda desde la celda 0. En mi experiencia, estas son las configuraciones predeterminadas más comunes.

Estoy bastante feliz con este. Mi primer intento fue de 314 bytes y esto es sin duda una mejora. :)

Funciona almacenando cada byte desde la entrada en dos celdas; uno con el valor real del byte y el otro con la salida del siguiente código cuando se proporciona (el valor del byte - 97):

[
    ----
    [
        ----
        [
            ------
            [
                ------>>
            ]
        ]
    ]
]

Si el carácter es una consonante, sale de eso con un valor distinto de cero. Si es una vocal, se convierte en 0. A partir de ahí, solo es cuestión de encontrar dónde comienza la segunda palabra e imprimir todo en orden.

La versión de 238 bytes de este programa encontró el carácter de espacio después de recopilar toda la entrada. Fue un dolor de cabeza porque hacerlo implicaba crear una celda que contenía 0 justo donde estaba tratando de recorrerlo. La forma en que resolví eso tuvo el efecto de restar 30 de cada carácter en la primera palabra y 32 de cada carácter después de ella. Una porción bastante grande del código se dedicó a manejar esas tonterías.

Ahora, 32 se resta de cada carácter en el bucle de entrada, que es más corto y tiene un efecto secundario similar que es más fácil de manejar. Como beneficio adicional, hacerlo de esta manera me permitió crear mi propio personaje espacial de una manera más corta: en lugar de restar 139 de 171 (171 es lo que obtienes cuando pasas un espacio a través del detector de vocales anterior), el bucle que suma 32 cada personaje se sale de su camino para agregar también 32 a la celda 171. Esto cuesta cuatro bytes allí, pero significa que puedo restar 171 más tarde (en lugar de restar 139) para un total neto de 3 bytes guardados.

Con comentarios:

For every input character
,[

  Make a copy
  [<+<+>>-]

  Subtract 32 from one
  ++++[<-------->-]

  Subtract 97 from the other
  -[<<-->>-----]<<+++++

  If nonzero:
  [

    Subtract 4
    ----

    If nonzero:
    [

      Subtract 4
      ----

      If nonzero:
      [

        Subtract 6
        ------

        If nonzero:
        [

          Subtract 6
          ------>>

        ]

      ]

    ]

  ]

>[>>]>,]

Add 32 to every character and the 171 that the space left behind
<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]

Go to the space
<[<<]

Subtract 171 from (32 plus 171)
-[<+>---]

~~~~~~~~~~~~~~~

Ready to print!

~~~~~~~~~~~~~~~

Print letters from the second word until the value to the left is zero
>[>.>]

Go to the beginning of the first word
<[<<]<<[<<]

Look at cells to the left of letters in the first word until reaching a zero
>[>>]

Print the rest of the letters in the first word
>[.>>]

Print a space
<.

Go to the beginning of the first word
<[<<]

Print letters from the first word until the value to the left is zero
>[>.>]

Go to the beginning of the second word
>[>>]

Look at cells to the left of letters in the second word until reaching a zero
>[>>]

Print the rest of the letters in the second word
>[.>>]
metro subterráneo
fuente
Esto cuenta ycomo una vocal, pero la pregunta dice que no lo es. ( nye cat-> ce nyat)
Loovjo
1
@Loovjo eso es realmente extraño, porque el código que verifica las vocales definitivamente se trata ycomo una consonante ... Investigaré por qué está haciendo eso.
undergroundmonorail
17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Me pregunto si vim es realmente competitivo en este desafío. Probablemente no con los idiomas de golf, pero tal vez con Ruby / Python / Perl / etc.

/[aeiou]<cr>  Find the first vowel
"xd0          "Delete" (cut), to register "x, everything from here to BOL
w             Go to next word
n             Find next vowel
db            "Delete back" - delete from here to the beginning of the word
0             Go to BOL
P             Paste what we just "deleted" (cut) behind the cursor
w             Next word
"xP           Paste backwards from register "x
Pomo de la puerta
fuente
11
Hago esto en modo Insertar, ¿verdad?
Alex A.
55
@AlexA. ಠ_ಠ
Pomo
@AlexA. El modo de inserción sería una pulsación de tecla adicional
:)
@AlexA. Modo de inserción? ¿Quiso decir insertar comando?
Blacklight Shining
1
@BlacklightShining Nope. Fue una broma porque si estás en modo de inserción y escribes esas cosas, no ejecutará ningún comando; lo acaba de escribir en un archivo.
Alex A.
13

Python, 68 63 60 bytes

import re
lambda s:re.sub('([^aeiou]+|.+ )'*3,r'\3\2\1',s,1)

Pruébelo en línea en Ideone .

Cómo funciona

La cadena del patrón se repite tres veces ( *3), lo que resulta en el patrón

([^aeiou]+|.+ )([^aeiou]+|.+ )([^aeiou]+|.+ )

Todas las instancias coincidirán con una cadena no vacía de no vocales, o una cadena no vacía seguida de un solo carácter de espacio.

La primera instancia coincidirá con las consonantes al comienzo de la primera palabra. Como +es codicioso, intentará igualar la mayor cantidad posible, es decir, todo hasta la primera vocal.

Debido a esto, la segunda instancia comenzará en una vocal, por lo que coincidirá con el resto de la primera palabra, hasta e incluyendo el espacio que separa las palabras.

De manera similar a la primera instancia, la tercera coincidirá con todas las consonantes al comienzo de la segunda palabra, lo que dará como resultado una coincidencia exitosa para todo el patrón.

La cadena sin formato \3\2\1( revita que Python reemplace, \3etc., con caracteres de control) invierte el orden de las coincidencias de los patrones entre paréntesis, es decir, los reemplaza con las consonantes al comienzo de la segunda palabra, luego todos los caracteres de la primera vocal de la primera palabra hasta el espacio, y finalmente las consonantes al comienzo de la primera palabra.

El argumento final para sub( 1) hace que regrese inmediatamente después del primer reemplazo exitoso, para evitar reemplazos sin sentido en el resto de la segunda palabra. Esto es necesario ya que el patrón puede coincidir con cualquier cadena de tres o más consonantes consecutivas.

Dennis
fuente
1
Felicidades por la recompensa, por llevar la magia de expresiones regulares a Python con una expresión regular muy eficiente. Buena explicación también.
xnor
11

JavaScript (ES6), 54 bytes

s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])

Explicación

s=>
  s.replace(
    r=/\b[^aeiou ]+/g,     // r = regex to match consonants
    (_,i)=>s.match(r)[+!i] // replace consonants with the consonants from the other word
  )

Prueba

var solution = s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])
<input type="text" id="input" value="plaster man" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>

usuario81655
fuente
Ohh, mi mal, entendí mal. Echaré un vistazo a los documentos mdn para matchcuando llegue a casa
Patrick Roberts
El +!itruco es una buena solución. +1
ETHproductions
10

Python 3, 108 101 99 bytes

(Sin uso de expresiones regulares)

Esta función espera entrada a través de 2 argumentos, por ejemplo f('blushing','crow'). Devuelve las nuevas palabras en una tupla.

S=lambda s,p="":s[0]in"aeiou"and(p,s)or S(s[1:],p+s[0])
def f(x,y):a,b=S(x);c,d=S(y);return c+b,a+d

Hay muchas soluciones de expresiones regulares, así que quería escribir algo que no usara la biblioteca de Python.

Cómo funciona

La única parte complicada es la expresión lambda S(la abreviatura significa " S plit antes de la primera vocal"). Se "itera" recursivamente sobre la palabra dada, moviendo un carácter a la vez desde el principio de s(que comienza con la palabra completa) hasta el final de p(que comienza vacío). En la primera vocal encontrada devuelve (p,s), es decir (prefijo, sufijo). ¡Observe que ese es el orden incorrecto en comparación con los parámetros!

Pensé que tenía más sentido que el orden devuelto fuera prefijo, luego sufijo (porque generalmente un prefijo va antes que un sufijo). Este orden puede hacer que el a,b=S(x)código sea un poco más fácil de leer.

Pero no tenía opción de orden en los parámetros de la lambda, por lo que no podía definir pantes s. El primer parámetro, s, tuvo que tomar la palabra completa, porque ptenía un valor por defecto, y los parámetros por defecto ir pasado. Al hacer eso, no necesité llamar a la función Scon una cadena vacía dos veces, y se pudieron guardar algunos bytes. Sin embargo, quizás fue simplemente una mala decisión devolver el prefijo / sufijo en el orden opuesto, ya que se utilizó dentro de la expresión lambda.

En cuanto a la elección de la expresión lambda sobre la función, se necesita más bytes que decir def S(s,p=""):returnque S=lambda s,p="":. Puedo hacer esa elección porque Python tiene evaluación de cortocircuito y el operador ternario. Sin embargo, no puedo explicar adecuadamente cómo usé los cortocircuitos; Es difícil razonar sobre eso.


Esta es mi primera respuesta. Espero haberlo hecho correctamente y que valga la pena publicar una solución que no pueda ganar.

Ediciones: Comentarios de agradecimiento: se redujo el recuento de bytes un poco, dos veces, y se eliminó la información innecesaria. Intentó mejorar la escritura. Ojalá no haya cometido errores.

N Beyrich
fuente
bienvenido a ppcg, excelente primera respuesta :) solo para tu información, la mayoría de los programas en este sitio no tienen una nueva línea final, por lo que no tienes que mencionarla (en los raros casos cuando es necesario, es cuando la gente lo menciona)
undergroundmonorail
3
¡Bienvenido a Programming Puzzles & Code Golf! 1. No tiene que preocuparse por el formato de entrada. El desafío dice explícitamente que puedes tomar una lista. 2. De acuerdo con los valores predeterminados mencionados en la etiqueta wiki , puede enviar programas completos o funciones para codificar desafíos de golf. Para este problema en particular, una función debe ser 7 bytes más corta.
Dennis
44
Con respecto a la última oración, "Espero [...] que sea valioso publicar una solución que no pueda ganar". ¡Sin duda lo hay! Todos estamos aquí para divertirnos, contribuir y aprender unos de otros. Encuentro esta respuesta particularmente inteligente ya que la solución más obvia es usar expresiones regulares. ¡Muy buen trabajo!
Alex A.
Una excelente primera respuesta. Es bastante similar a lo que se me ocurrió para no regex. Tuviste una buena idea sobre el uso de expresiones lógicas de cortocircuito, y resulta que pueden acortar la expresión, aunque tal vez te gustaría pensar sobre cómo hacerlo.
xnor
Realmente me gusta el hecho de que haya usado una solución recursiva. Muy elegantemente implementado!
Ogaday
9

C # 6, 115 bytes

string S(string a)=>System.Text.RegularExpressions.Regex.Replace(a,"([^aeiou]*)(.*) ([^aeiou]*)(.*)","$3$2 $1$4");

Es un dolor que el espacio de nombres para la expresión regular sea tan largo.

Hand-E-Food
fuente
2
Dios mío, eso es detallado.
Conor O'Brien
44
System.Text.RegularExpressions.Regex.Replace44 caracteres! +1 porque debe ser algún tipo de registro.
Level River St el
2
... y ahora tienes 44 problemas. ;)
Mason Wheeler
9

CJam, 27 24 22 bytes

2{l_{"aeiou"&}#/(N\}*o

I / O es una palabra por línea. Pruébalo en línea!

Cómo funciona

2{                 }*   Do the following twice:
  l                       Read a line from STDIN.
   _                      Push a copy.
    {"aeiou"&}#           Find the index of the first character that has a non-
                          empty intersection with the string "aeiou".
               /          Split the string into chunks of that size.
                (         Shift out the first chunk, i.e., all leading consonants.
                 N\       Swap the shifted out chunk with a linefeed.
                     o  Print the topmost stack item.
Dennis
fuente
8

JavaScript ES6, 93 58 52 bytes

¡Guardado 6 bytes gracias a ETHProductions!

x=>x.replace(/([^aeiou]+)(.+ )([^aeiou]+)/,"$3$2$1")

¡Pruébalo! (Solo ES6)

Conor O'Brien
fuente
Estaba a punto de hacer clic en publicar respuesta en mi solución de 58 bytes cuando hiciste esta edición jaja
user81655
@ user81655 Oh, lamento que haya sucedido así.
Conor O'Brien
No necesita el cuarto grupo de captura o el grupo $4;)
ETHproductions
@ETHproductions ¡Oh, sí! ¡Gracias!
Conor O'Brien
7

C, 255 201 199 bytes

No veo muchas respuestas C por aquí, así que disfrútenlo; Además, golf por primera vez, sugerencias y críticas son bienvenidas.

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(v[1])+b+1
main(int q,char**v){char r[64],S(v[1],a),S(v[2],b)c,v[2])c+b,v[1]+a);strcat(r," ")l-a,v[1])l,v[2]+b);puts(r);}

Si no se requiere main (), podemos guardar 24 bytes, llegando a 179 bytes

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(x)+b+1
s(char*x,char*y){char r[64],S(x,a),S(y,b)c,y)c+b, x+a);strcat(r," ")l-a,x)l,y+b);puts(r);}

Sin golf:

void spoonerise(char* w1, char* w2)
{
    char rt[64];

    int p1 = strpbrk(w1, "aeiou")-w1;
    int p2 = strpbrk(w2, "aeiou")-w2;

    strcpy(rt, w2);
    strcpy(rt+p2, w1+p1);

    strcat(rt, " ");

    strcpy(rt+strlen(w1)+p2+1-p1, w1);
    strcpy(rt+strlen(w1)+p2+1, w2+p2);

    puts(rt);
}

EDITAR: Gracias a la sugerencia de feersum, ahorré 54 bytes. = D

Lince Assassino
fuente
Recomiendo investigar strpbrk.
feersum
+1 Esta es una excelente primera respuesta. Bienvenido al sitio.
wizzwizz4
Gracias por la recomendación @feersum. Y gracias por la bienvenida @ wizzwizz4!
Lince Assassino
6

Python 2, 364 352 269 251 bytes

EDITAR: ¡ Muchas gracias a @Cyoce por ayudarme a jugar golf 83 bytes!

¡Por favor, ayúdame a jugar golf! De todos modos, al menos soy el primer respondedor de Python. ¡Y espero poder vencer a Java, si alguna vez hay una respuesta de Java!

i=input()
f=l=''
A='aeiou'
for j in A:
 I=i[0];J=I.find(j)
 if ~J:
  if f:
   if f>I[0][:J]:f=I[:J];break
  else:f=I[:J]
for j in A:
 Y=i[1];J=Y.find(j)
 if ~J:
  if l:
   if l>Y[:J]:l=Y[:J];break
  else:l=Y[:J]
print I.replace(f,l,1),Y.replace(l,f,1)

Pruébalo aquí

TanMath
fuente
55
-1 por no intentar jugar golf más allá de las variables de un solo carácter
Mego
@Mego Prometo que estoy trabajando en eso lo antes posible. Ahora mismo. Pero estoy trabajando en una versión regex.
TanMath
@Mego por favor vea editar.
TanMath
5

Japt, 26 25 bytes

Afortunadamente, agregué una clase de vocal a las funciones de expresión regular de Japt hace unos días. Desafortunadamente, no agregué una clase sin vocales o una forma de evitar las barras invertidas dobles en las cadenas de expresiones regulares.

#¿s4 £Uf"[^\\v]+|.+
?" gX

El ¿debe ser el char en bruto U + 0093. La entrada es una cadena de varias líneas, una palabra / línea. Pruébalo en línea!

EDITAR: ahora he agregado la clase sin vocal \Vy una forma de evitarlo \\(con %), por lo que este código ahora funciona para 21 bytes : ( Pruébelo en línea )

#¿s4 £Uf"%V+|.+
?" gX

Cómo funciona

                     // Implicit: U = input string
#¿s4                 // Convert the char code (147) into a base-4 string "2103".
     £               // Map each char X in this string to:
      Uf"[^\\v]+|.+  //  Match each group in U of non-vowels or non-newlines,
?"                   //  with an optional trailing newline.
   gX                //  Get the item at position X in the resulting array.
                     // Implicit: output last expression

Versión anterior (26 bytes):

UrA="\\b[^\\v ]+"@UfA gÂ!Y

Pruébalo en línea!

Cómo funciona

UrA="\\b[^\\v ]+"@UfA gÂ!Y  // Implicit: U = input string
  A="\\b[^\\v ]+"           // Set variable A to this regex string, which matches
                            // a word boundary followed by one or more non-vowels.
UrA              @          // Take U and replace each match X of A and its index Y with:
                  UfA       //  Take U.match(A).
                      gÂ!Y  //  Get the item at index ~~!Y (converts 0 to 1, anything else to 0).
                            // Implicit: output last expression
ETHproducciones
fuente
¡Desearía que los idiomas principales tuvieran una meta vocal para expresiones regulares!
CJ Dennis
4

Python 3, 100 (o 99) bytes

import re
def f(*g):a,b=[re.split("[aeiou]",r)[0] for r in g];return b+g[0][len(a):],a+g[1][len(b):]

Jugué con algunas versiones, pero parece que no puedo obtenerlo a continuación. Puede bajarlo 99 bytes usando en su def f(g)lugar, por lo que toma una lista de cadenas en lugar de dos cadenas separadas, pero prefiero las dos arg argue.

La alternativa es la misma longitud:

import re
s=re.split
def f(x,y):v="[aeiou]";a,b=s(v,x)[0],s(v,y)[0];return b+x[len(a):],a+y[len(b):]

Intenté reemplazar, como los usos de @TanMath, pero no pude hacerlo más corto. Además, TanMath puede acortar su respuesta en un byte al usarla en "[aeiou]"lugar de hacerlo "[aeiou]+"porque solo necesitamos hacer coincidir las instancias individuales. Finalmente, la implementación de input()parece haber cambiado entre py2 y py3: evalúa automáticamente stdin como una cadena.

Ogaday
fuente
1
Presumiblemente te refieres s=re.splita la alternativa?
xnor
¡Si! Seguro. Esta es mi primera vez jugando al golf, por lo que agradecemos cualquier comentario y consejo.
Ogaday
1
1. La cuestión permite explícitamente a tomar las dos cadenas como una lista, por lo que parece que no hay una buena razón para la *en *g. 2. La segunda versión puede ser reducida a golf lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Dennis
Gracias @Dennis, eso sí funciona, buena refactorización. Es interesante que se necesiten los corchetes, y usted no necesita pasar s como argumento a la segunda lambda, ¿verdad? Esa solución me da 98 bytes, con una declaración de importación líder y f=.
Ogaday
1
No, ses un argumento predeterminado, por lo que no tiene que especificarlo. Una lambda sin nombre es una presentación aceptable; f=no es requerido.
Dennis
4

sed, 38 caracteres

s/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/

Usando la expresión regular extendida de la solución Retina .

Lo anterior tiene 37 caracteres y requiere el -rcambio (+1 carácter).

Ejemplo:

$ cat input | tee /dev/tty | sed -r 's/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/'
plaster man
blushing crow
litigating more
strong wrangler
def ghi
master plan
crushing blow
mitigating lore
wrong strangler
ghef di
Zsolt
fuente
¡Bienvenido a Programming Puzzles & Code Golf!
Dennis
3

C # 6, 165 bytes

string S(string a,string b){int i=V(a),j=V(b);return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);}int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

Expandido:

string S(string a,string b){
    int i=V(a),
        j=V(b);
    return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);
}
int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());
Hand-E-Food
fuente
Esto es bastante antiguo, pero "aeiou".ToCharArray()puede ser 'a','e','i','o','u'de -2 bytes
Encarnación de la ignorancia
No, @EmbodimentofIgnorance, IndexOfAnyno se necesitan parámetros, por lo que tendría que ser asínew[]{'a','e','i','o','u'}
Hand-E-Food
Ah, mi error, pensé que IndexOfAnyes un método de params. De todos modos, gran respuesta
Encarnación de la ignorancia
3

𝔼𝕊𝕄𝕚𝕟, 24 caracteres / 42 bytes

ïē/⟮(⁅ᶌ]+)⟯(.+ )Ⅰ/,`⑶⑵⑴`

Try it here (Firefox only).

Si necesita ayuda para comprender esto, esto se traduce en ES6 como

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')
Mama Fun Roll
fuente
¿En qué idioma es esto? Incluso estoy obteniendo caracteres de caja para eso.
Jesse Williams el
@JesseWilliams Se llama ESMin .
ETHproductions
Sería bueno si el interperador tuviera algo como el Japt, donde te muestra el js en que se convierte el
Usuario genérico
JS compilado se registra en la consola de JS cuando se ejecuta el código.
Mama Fun Roll
3

PowerShell, 52 bytes

"$args "-replace('(.*?)([aeiou]\S+) '*2),'$3$2 $1$4'

e.g. 
PS C:\scripts\> .\Spoonerise.ps1 'blushing crow'
crushing blow

Es una regex reemplazada con cuatro grupos de captura; con:

  • Multiplicación de cadenas para expandir:
    • ('(.*?)([aeiou]\S+) '*2) a '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • La "$args "fuerzas de la matriz args en una cadena, y añade un espacio al final por lo que el espacio al final de la expresión regular no romperlo.
TessellatingHeckler
fuente
3

JavaScript (ES6), 120 107 102 101 99 92 bytes

  • Gracias downgoat!

Esto tiene en cuenta si los parámetros eran un objeto como este, y hacia atrás:
var a = {x: "man", y:"plaster"]}

a.b=(e=>e.slice(e.search`[aeiou]`));with(a){c=b(x),d=b(y),x=x.replace(c,d);y=y.replace(d,c)}
Pluma
fuente
.match(/[aeiou]/).indexpuede llegar a ser:.search`[aeiou]`
Downgoat
3

Python, 129 108 105 109 bytes

Este programa incluye una lista de palabras como esta ["master","plan"]

EDITAR : Gracias @Volatility

EDITAR: ahora usando re.split

import re
a=re.split
c='[aeiou]+'
i,j=input()
f=a(c,i)[0]
l=a(c,j)[0]
print i.replace(f,l,1),j.replace(l,f,1)

Esta respuesta usa expresiones regulares como la mayoría de ellas.

Pruébalo aquí

TanMath
fuente
Tenga en cuenta que str.replacereemplaza todas las instancias de una subcadena, por lo que debe limitarlo a un reemplazo al tener .replace(f,l,1). Sin embargo, puede guardar un montón al usar i,j=input()y volver a vincular re.findally '[^aeiou]+'a variables de un solo carácter.
Volatilidad
Esto no funciona como es; incluso dos palabras de una letra te darán tres caracteres, y estás tratando de descomprimir input()en dos variables. ¿Quiso decir i,j=input().split()(y raw_input()en Python 2)?
Blacklight Shining
1
@BlacklightShining la palabra debe tener al menos una vocal y una consonante. La entrada toma una lista de las cadenas, por lo que i es la primera palabra y j es la segunda.
TanMath
@TanMath, por lo que sé, está permitido de manera predeterminada, pero probablemente debería decir en la respuesta en alguna parte que es obligatorio
undergroundmonorail
Esto reemplaza demasiado. "sass","bit" -> "babb", "sit".
xnor
3

Java 8, 343 bytes

Aquí tienes tu primera respuesta Java. No es tan experimentado con el golf, por lo que se agradece cualquier sugerencia.

java.util.function.Function;public class C{public static void main(String[] a){Function<String, Integer>f=s->{for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;return 0;};int i1=f.apply(a[0]),i2=f.apply(a[1]);System.out.println(a[1].substring(0,i2)+a[0].substring(i1)+" "+a[0].substring(0,i1)+a[1].substring(i2));}}

Sin golf:

public class SpooneriseWords {
    public static void main(String[] args)
    {       
        Function<String, Integer> f = s -> {
            for(int i = 0; i < s.length(); ++i)
                if("aeiou".contains(s.substring(i, i + 1))) 
                    return i;
            return 0;
        };

        int i1 = f.apply(args[0]);
        int i2 = f.apply(args[1]);
        System.out.println(args[1].substring(0, i2) + args[0].substring(i1));
        System.out.println(args[0].substring(0, i1) + args[1].substring(i2));
    }
}
Denker
fuente
¿Qué es java.util.function.Function? Dudo mucho que deba estar allí, a menos que importse refiera, pero descarte la importación porque solo se refiere a ella una vez. Cambiar public class C{public static void Main(String[] a)ainterface C{void Main(String[]a)
gato
Function<String, Integer>no necesita espacios en blanco
gato
cambiar el bucle de for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;afor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat
i1es un nombre de dominio terrible, demasiado largo.
gato
Es decir, el cambio Function<String, Integer>de java.util.function.Function<String,Integer>y soltar la importación
gato
3

Octava, 96 bytes

Gracias a las asignaciones en línea de Octave y la funcionalidad de 'indexar en cualquier lugar', todo esto es solo la definición de una única función anónima. Básicamente, reconstruimos la cuerda cuchara mientras almacenamos los puntos de corte en ay b. Estoy especialmente contento con la ffunción en línea , que encuentra el punto de corte, y me impidió tener que usar todo el proceso find(ismember(a,b),1)dos veces. Además, no regex :) .

@(p,q)[q(1:(a=(f=@(m)find(ismember(m,'aeoui'),1))(q))-1),p(b=f(q):end),32,p(1:b-1),q(a:end)];
Sanchises
fuente
2

TeaScript , 27 bytes

xg/(\w+)(.+ )(\w+)/,"$3$2$1

\wes en realidad [^aeiou].

Downgoat
fuente
Espera, ¿cambiaste la \wmeta regex predeterminada a [^aeiou]? ¿Por qué?
ETHproductions
@ETHproductions cuando estaba creando las clases de char personalizadas. Olvidé que \wJavaScript ya lo usaba. Lo volveré a cambiar pronto
Downgoat
2

elixir ,143 117 bytes

s=fn w->String.split_at(w,elem(hd(Regex.run(~r/[aeiou]/,w,return: :index)),0))end
{v,w}=s.(a)
{x,y}=s.(b)
[x<>w,v<>y]

Divida las dos cadenas (a, b) en la primera vocal y construya nuevas cadenas para regresar.

EDITAR: Obtuve unos pocos bytes usando la coincidencia de patrones en lugar de elemllamadas torpes para obtener los valores de las tuplas.

srecnig
fuente
2

Java, 147 bytes

Supongo que solo una función también está bien.

String s(String[]i){String r="[aeiou]",f=i[0].split(r)[0],s=i[1].split(r)[0];return s+i[0].substring(f.length())+" "+f+i[1].substring(s.length());}

split(regex)lamentablemente consume el delimitador, lo que significa que tengo que usar substringpara obtener los sufijos.

ECS
fuente
2

Pyth, 30 28 bytes

Toma entrada y da salida como una lista de las dos palabras.

ACm,Kh:d"[aeiou]"3.-dKQ+V_GH

Pruébalo en línea.

Luke
fuente
Creo que lo estás buscando ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. Aasigna una lista de dos elementos a G y H, y se Ctranspone. Puede haber algo aún mejor.
lirtosiast
2

Python (sin expresiones regulares), 85 bytes

t=lambda s:s[1]in'aeiou'or-~t(s[1:])
lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])

Ejecución de muestra:

>>> t=lambda s:s[1]in'aeiou'or-~t(s[1:])
>>> lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])
<function <lambda> at 0x7f495e534398>
>>> _('plaster', 'man')
('master', 'plan')

tes una función recursiva que calcula el índice de la vocal más temprana después del primer carácter en su argumento s. Si el segundo carácter s[1]es una vocal, se evalúa como True, que tiene intvalor 1. De lo contrario, realiza una llamada recursiva con el primer carácter eliminado y agrega 1 al índice resultante usando -~(complemento de dos del complemento de uno). Finalmente, los resultados de tse usan como índices para el corte de cuerdas para calcular el cuchara.

Anders Kaseorg
fuente
1

GNU Awk 4.0, 48 caracteres

split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]

Ejecución de muestra:

bash-4.3$ for s in 'plaster man' 'blushing crow' 'litigating more' 'strong wrangler' 'def ghi'; do
>     echo -n "$s -> "
>     awk 'split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]' <<< "$s"
> done
plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
hombre trabajando
fuente
1

PowerShell, 61 bytes

"$args"-replace'([^aeiou]+)(.*)\s([^aeiou]+)(.*)','$3$2 $1$4'

Utiliza expresiones regulares para intercambiar los primeros caracteres no vocales de cada palabra

Mathias R. Jessen
fuente