Decodificador canino Acme del profesor Schwartzman 2000

31

Introducción

Nosotros, especialmente los geeks entre nosotros, que tienden a ser fanáticos, todos recordamos esta vieja caricatura de Far Side :

¡Oye!  ¡Oye!  ¡Oye!

Claramente, el profesor Schwartzman podría haber repasado sus habilidades de programación un poquito más antes de poner en práctica su invento. Pero, ¿puedes replicarlo tú mismo ... usando la menor cantidad de bytes posible?

Especificaciones de entrada

Debe crear una secuencia de comandos que traduzca los sonidos de los perros en "Hey" adecuadamente entonados. Esto es puro golf de código; gana el menor número de bytes.

Su entrada consistirá en alguna combinación de los siguientes tokens:

  • Bark, Baark, Baaark, Baaaark, ... (es decir, B*rk con al menos 1 areemplazando el asterisco)
  • Woof, Wooof, Woooof, ... ( W*fcon al menos 2 o s reemplazando el asterisco)
  • Grr` Grrr` Grrrr, ..., ( Gseguido de al menos 2 r s)
  • Cualquier número de caracteres .(punto), !(signo de exclamación) y / o ?(signo de interrogación), que pueden aparecer en cualquier parte de la entrada

Tenga en cuenta, nuevamente, que los tokens Woofbasados ​​y Grrbasados ​​siempre requieren al menos dos o sy rs respectivamente; Wofy noGr son tokens válidos.

No hay límite en cuanto a la duración de un token (por ejemplo, cuántos as repetidos puede haber en un Barktoken); Sin embargo, su decodificador sólo tiene que funcionar correctamente para tokens de entrada con un máximo de 10 en total as, oS, o rS para pasar este desafío.

Especificaciones de salida

Fiel al diseño de Schwartzman, su programa decodificador canino debe procesarlo en texto de salida de la siguiente manera:

  • Bark, WoofY Grrconvertido Hey;
  • Baark, WooofY Grrrconvertido Heyy;
  • Baaark, WoooofY Grrrrconvertido Heyyy; etc.
  • Para todos los Barktokens basados, el número de ys en el Heytoken basado en la salida debe ser igual al número de as;
  • Para todos los Wooftokens basados ​​en, el número de ys en el Heytoken basado en la salida debe ser uno menos que el número de os;
  • Para todos los Grrtokens basados ​​en, el número de ys en el Heytoken basado en la salida debe ser uno menos que el número de rs;
  • Todo puntuacion ( ., !y ?) se deja sin cambios.

¡Recuerde soltar uno yde la salida solo para Woofsy Grrs! La entrada Baaaaaaaark?, con 8 as, se convertirá Heyyyyyyyy?, con un conjunto coincidente de 8 ys. Sin embargo, se Woooooooof?vuelve único Heyyyyyyy?, con 7 ys.

Nuevamente, si puede hacer que su programa funcione para tokens de entrada de tamaño ilimitado, eso es genial, pero para los propósitos de este desafío, su programa solo se verificará para asegurarse de que funcione correctamente para tokens de entrada que no tengan más de 10 letras repetidas .

Todo Bark-, Woof-, y Grrlos tokens basados en su entrada se supone que comenzar con letras mayúsculas. Por lo tanto, no hay ninguna necesidad de inflexión mango Bark grrren Hey heyyo algo similar.

Ejemplo de entradas y salidas

    • Entrada: Bark. Bark! Bark!!
    • Salida: Hey. Hey! Hey!!
    • Entrada: Baaaaaark?(seis as)
    • Salida: Heyyyyyy?(seis ys)
    • Entrada: Grrrrrrrr...(ocho rs)
    • Salida: Heyyyyyyy...( siete y s)
    • Entrada: ?...!
    • Salida: ?...!
    • Entrada: Wooof Woof? Grrrr. Baaaark Grr!
    • Salida: Heyy Hey? Heyyy. Heyyyy Hey!
A. Mirabeau
fuente
10
Hola y bienvenidos al sitio! Para que lo sepas, es habitual en este sitio esperar un tiempo antes de aceptar la respuesta más corta. Le animo a que no acepte la respuesta que ha aceptado, y espere hasta que la actividad sobre esta pregunta disminuya antes de aceptar la respuesta más breve. Esto también alentará más respuestas.
DJMcMayhem
Relacionado.
Martin Ender
Gracias por los consejos sobre el proceso de aceptación. En realidad estaba planeando revisar la lista de respuestas cada pocas horas y, si noté que había aparecido una mejor respuesta, acéptela. Lo siento por cualquiera a quien le haya negado la reputación aquí.
A. Mirabeau
55
@ A.Mirabeau Eso es honorable y cómo funcionaría idealmente, pero algunas personas no están tan atentas, por lo que la mayoría de los encuestados podrían suponer que el ganador ya ha sido elegido. Si bien no hay nada de malo en elegir un ganador de inmediato si planea actualizarlo, es probable que obtenga menos respuestas debido a eso junto con algunas quejas, por lo que generalmente es mejor esperar al menos una semana.
Martin Ender

Respuestas:

16

Retina , 24 18 17 16 bytes

1 byte guardado en base a una idea en la respuesta de MT0.

\wf?k?
y
\byy
He

Pruébalo en línea!

Explicación

\wf?k?
y

Esto simplemente convierte todas las letras en y, pero si van seguidas de una fo kla reemplazamos inmediatamente también. Al eliminar fy k"normalizar" la longitud de las palabras para que ahora tengan dos ys más de lo que necesitan.

\byy
He

Esto convierte los dos primeros yde cada palabra en He, completando la transformación.

Martin Ender
fuente
La respuesta más eficiente hasta ahora, bien hecha. Todavía no lo voy a aceptar, pero puedo decirte que mereces CAT FUD.
A. Mirabeau
10

Perl, 51 41 39 bytes

s/(G.|[BW]..)(\w+)/He."y"x length$2/ge

Uso

perl -pE 's/(G.|[BW]..)(\w+)/He."y"x length$2/ge'

Entrada

Bark. Bark! Bark!!
Baaaaaark?
Grrrrrrrr...
?...!
Wooof Woof? Grrrr. Baaaark Grr!

Salida

Hey. Hey! Hey!!
Heyyyyyy?
Heyyyyyyy...
?...!
Heyy Hey? Heyyy. Heyyyy Hey!

Cómo funciona

Sustitución simple de expresiones regulares utilizando la impresión automática -pagregando 1 byte al conteo /geejecuta la sustitución de cada patrón y ejecuta el reemplazo como código.


Una versión anterior usaba una detección de tres vías, pero Martin Ender notó que no era lo suficientemente agresivo, lo que me ahorró 10 bytes.

msh210 me informó que no necesita comillas alrededor de la cadena He, ahorrando dos bytes.

tubo
fuente
2
El mejor hasta ahora, felicidades.
A. Mirabeau
1
@ A.Mirabeau Gracias, es un gran cumplido considerando que me acabo de registrar aquí hace unos minutos.
tubería
Tener tres soluciones es motivador considerando que me acabo de registrar aquí hace unas horas.
A. Mirabeau
1
No necesitas las comillas He.
msh210
@ msh210 ¡Interesante, no sabía que se le permitía omitirlos allí!
tubería
5

Python, 106 bytes

f=lambda s,a="B,He,Gr,He,Wo,He,a,y,r,y,o,y,f,,yk,".split(","):s if a==[]else f(s.replace(a[0],a[1]),a[2:])

Manifestación

https://repl.it/C6Rr

Chuck Morris
fuente
Aunque no es la respuesta aceptada, esta merece una mención honorífica por ser la solución más eficiente en bytes que cambia solo las tres palabras clave necesarias en el idioma del perro.
A. Mirabeau
4

JavaScript (ES6) - 57 55 52 51 Bytes

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He')

Prueba:

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He');

[
  'Bark. Bark! Bark!!',
  'Baaaaaark?',
  'Grrrrrrrr...',
  '?...!',
  'Wooof Woof? Grrrr. Baaaark Grr!'
].forEach( s=>{console.log( f(s) );} );

Gracias a @MartinEnder por los bytes 56 y 51 y la inspiración para algunas de las otras virutas.

MT0
fuente
4

Vimscript, 51 39 37 33 32 29 28 bytes,

%s/\hk\?f\?/y/g|%s/\<yy/He/g

Regex créditos por afeitar 9 bytes más: MT0, Martin Ender, msh210

asciicast Manifestación

Explicación:

                               1. Normalize words to same length & replace letters with ys 

%s                             Regex search and replace 
  /                            Regex search begin
   \hk\?f\?                    Find any letter (\h) optionally followed by k or f
           /                   Regex search end and replace start
            y                  Replace with y
             /                 Replace end
              g                Replace globally

               |               New command

                               2. Overwrite first two y of every word with He

                %s             Regex search and replace
                  /            Regex search begin
                   \<yy        Find yy at a word's beginning
                        /      Regex search end and replace start
                         He    replace with He
                           /   Replace end
                            g  Replace globally
grabadora de estrellas
fuente
1
No conozco Vimscript, pero ¿puedes usarlo en \<yylugar de \<\hy?
msh210
@ msh210 sí, es posible y actualicé la solución, gracias
starcorder
2

Javascript, 72 66 64 Bytes

f=
t=>t.replace(/k|f/g,'').replace(/\w/g,'y').replace(/\byy/g,'He')

Editar: separado f=y función + recuento de bytes reducido

grabadora de estrellas
fuente
1
No necesita el f=(como valor predeterminado de PPCG), por lo que funciona 64 bytes.
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Genial, no sabía esto
grabadora de estrellas el
1

Pyke, 35 bytes

.cFDlR\G.^+3-\y*"He"R+)Rdc~lL-],AsJ

Pruébalo aquí!

Genera oye, genera puntuación, se junta, se une

Azul
fuente
1

Python 3, 140 135 134 bytes

from re import*
f=lambda s:''.join('He'+'y'*len(x)+y for x,y in[(a+b+c,d)for a,b,c,d in findall('(?:Wo(o+)f|Gr(r+)|B(a+)rk)(\W+)',s)])

Usar expresiones regulares para encontrar ocurrencias de caracteres reemplazables.

Editar: Golfed 1 byte de espacios en blanco y 4 bytes al obtener los valores del resultado findall.

Edit2: Golfed 1 byte ("a" de Bark no se contó correctamente)

Gábor Fekete
fuente