Escribe un programa para jugar el juego de nombres .
Entrada
Su programa debe aceptar un solo nombre como entrada del usuario de alguna manera (por ejemplo, leer desde una entrada estándar o como un argumento de línea de comandos). Puede suponer que el nombre es una sola palabra que consiste en una letra mayúscula seguida de una o más letras minúsculas.
Salida
Su programa debe imprimir la rima para el nombre de pila, como se explica en la canción, completando la siguiente plantilla:
(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!
Aquí, (X)
es el nombre original, y (Y)
es el nombre en minúsculas con cualquier consonante inicial eliminada.
Hay una excepción, sin embargo. Si el nombre original comenzó con m
, f
o b
, debe escribirse sin esta letra en la línea correspondiente. Por ejemplo, si el nombre era Bob
, la línea "b" debería terminar con bo-ob
. Tenga en cuenta que en este caso, cualquier otra consonante se mantiene, por lo que Fred
no es fo-red
así fo-ed
.
Ejemplos
Shirley
Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!
Arnold
Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!
Beto:
Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!
Fred
Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!
Puntuación
El código más corto gana.
Y
se maneja como una voz, asíYves
es comoIves
oArnold
.Y
como una vocal solo si es seguida por una consonante. Eso debería cubrir esos casos al menos.Respuestas:
vi,
118115El código incluye 5 caracteres de control, que he puesto entre paréntesis. Cada uno solo cuenta como un solo personaje para el recuento de caracteres.
EDITAR: Mover la primera unión (J) a la posterior y cambiar el pegar antes (P) a pegar después (p) me salvó 1 personaje. Además, no capturar la o- en la expresión regular me ahorró 2 caracteres más.
fuente
SNOBOL4,
437430 bytesSin golf (además, agregué un mensaje; el de arriba solo espera a que se escriba un nombre):
Este es el primer programa SNOBOL que he escrito.
SNOBOL es un lenguaje orientado a líneas, como FORTRAN, COBOL o BASIC. Cada línea consta de una etiqueta opcional que comienza en la columna 1, el código de la línea que puede implicar asignaciones y coincidencia de patrones, y una rama opcional. Sí, las líneas terminan con GOTO (opcionales). Vienen en dos formas:
Ramas para etiquetar
TARGET
, mientrasSe bifurca
SUCCESS
si la coincidencia de patrón tuvo éxito oFAILURE
no. También puede simplemente ramificarse en el éxito y pasar a la siguiente línea en caso de falla, o viceversa.Las líneas de continuación comienzan con a
+
o.
. Los comentarios comienzan con a*
.¿Como funciona?
Leer en un nombre, convertirlo a minúsculas. Configure los nombres B, F y M, suponiendo que comience con una vocal. Luego verifique si comienza con un intervalo de consonantes. Si no, ¡estamos listos para partir! Si es así, elimine las consonantes iniciales y configure los nombres B, F y M, suponiendo que no comience con ninguna de esas letras. Finalmente, verifique si comienza con cada una de esas letras, arreglando los nombres según sea necesario. ¡Entonces estamos listos para jugar el juego de los nombres!
Ejecución de muestra:
Ejecuté esto en el emulador de mainframe Hercules S / 370 que ejecuta la versión 6.0a del Sistema de terminales de Michigan utilizando SNOBOL4 versión 3.10 del 1 de abril de 1973 creado para MTS el 1 de mayo de 1975, pero probablemente haya formas más fáciles de ejecutar SNOBOL4 en un sistema moderno :)
Editar: se eliminó una rama de éxito redundante que era equivalente a una falla (no me di cuenta de que podía poner solo una rama de falla por sí misma) que elimina una etiqueta de rama innecesaria, y convirtió un goto incondicional en una rama de falla en la línea anterior, para un ahorro de 7 bytes.
Ahora que TIO tiene soporte SNOBOL4, ¡puede probarlo en línea! Nota: Muestra el tamaño como 429 en lugar de 430 porque cuando lo pegué allí, se eliminó el avance de línea final. Traté de cambiar la línea de continuación (la que comienza con
+
) a una sola línea, que no era legal en la versión de mainframe porque la línea era demasiado larga, y funcionó y la redujo a 427. Obviamente CSNOBOL4 permite líneas más largas. Sin embargo, voy a dejar mi puntaje en 430, porque esa es la cantidad de bytes que tenía el script en mi máquina, y además, SNOBOL es bastante poco competitivo.fuente
N = TRIM(INPUT)
pueden serN =TRIM(INPUT)
.J , 149 caracteres
fuente
Javascript, 115 bytes
Explicación:
esta función devuelve el nombre sin las consonantes iniciales
Entonces el resto es una función que devuelve la cadena cadena completa.
Editar: de 119 a 115 bytes gracias a @Martin Ender
fuente
/[aeiou]\w*/i
.JavaScript, <s>119</s> 115 bytes
en el encabezado, para dar a las personas una pista de que originalmente había una versión más larga si están interesados.Clojure , 292 caracteres después de minimizar
Aquí hay un primer intento, casi positivo, puedo reducirlo aún más:
Estoy aprendiendo clojure y pensé que sería divertido intentarlo. Aquí está mi razonamiento:
fuente
Scala 281
Reemplacé (X) e (Y) en el patrón con
#
y012
.S
es solo un nuevo nombre paraString
ya(b,c,d)
es una definición abreviada deb.replaceAll(c,d)
Invocación de prueba:
Y sin golfos:
fuente
Python 3,
148145142 bytesSí, sé que es un poco tarde, pero ...
Utiliza las nuevas cadenas f para formatear la cadena resultante.
No creo que TIO admita f-strings todavía, desafortunadamente.
Versión antigua
Guardado 3 bytes gracias a @officialaimm
fuente
Sed, 162 bytes
No sabía muy bien antes de hacer esto. Lo sé mucho mejor ahora. El primer sed en la tubería duplica el nombre tres veces para que se convierta en "Bob \ nBob \ nBob \ nBob" en lugar de simplemente "Bob". El siguiente sed hace el trabajo pesado.
Espera entrada en stdin como
echo Name |sed ...
Sin golf:
Un par de notas Los primeros cuatro partidos, 1s, 2s, 3s, 4s, transforman la salida en algo que no es del todo correcto. Bob se ha convertido en bo-bbob, Fred se ha convertido en fo-ffred, y Mike se ha convertido en mo-mmike. Kay se convertiría en mo-mkay, mkay?
Luego, debemos reemplazar bo-bbob con bo-ob o bo-bkay con bo-bay. Para hacer eso, podemos usar una función en la que hacemos una s /// sustitución, y luego bifurcar si tuvo éxito, saltando sobre la segunda que ahora queremos omitir. Pero si falla, queremos pasar por la rama y hacer la próxima sustitución.
El comando t [etiqueta] hace eso, bifurcando solo si una s /// anterior coincide. Pero al comienzo del script ya hice un s /// para cada línea (los números iniciales en 1s, 2s, etc. son direcciones; significan que el comando solo se ejecuta si la dirección coincide). Entonces, no importa en qué línea estemos, 1, 2, 3 o 4, al menos un s /// ha coincidido. (Traté de hacerlo al revés, masajeando los nombres y luego agregando "Banana-etc." Después, pero me quedé atrapado de esa manera, y tratar de hacerlo todo de una vez causaría cierta repetición). Afortunadamente, la bandera puede se borrará tomando una rama, así que hacemos eso con "tx;: x". tx se ramifica a la etiqueta x, y: x es la etiqueta x.
¡Uf! Eso despeja el paladar para las dos sustituciones finales. Probamos uno y, si tiene éxito, nos ramificamos sobre el otro; de lo contrario, hacemos el segundo. De cualquier manera, terminamos en la etiqueta: z y el búfer de patrón contiene una línea de letras que se imprime en stdout.
Gracias por engañarme para que pase suficiente tiempo con la página de manual de sed y el manual de Texinfo para finalmente entender cómo hacer más que sed s / foo / bar /
fuente
|
y todo. ¿Tal vez debería llamar a esto bash / sed, o contarlo de manera diferente? No lo sé. Estoy contento con él tal cual, pero avíseme si debería ser diferente para los estándares de PPCG.Python, 161
Acabo de
darme cuenta de que mi código falla ... - No elimina los constonantes iniciales.
- No gestiona el negocio 'bo-ob'.
Es lo más lejos que tengo, tal vez alguien pueda terminarlo.
fuente
Groovy, 146
fuente
R, 189 caracteres
Pero con solo un personaje más, puede ingresar muchos nombres de una vez:
fuente
Pyth , SBCS de 111 bytes
Banco de pruebas
El código utiliza caracteres no imprimibles y, como tal, no se muestra correctamente en Stack Exchange. El enlace proporcionado contiene estos caracteres y es la versión correcta del programa.
fuente
Pitón
fuente