Mientras escribía mi ensayo para Shakespeare, me di cuenta de que necesitaba acortar mis referencias de citas a longitudes más manejables. Anteriormente había estado escribiendo esto:
(Act 1, Scene 2, Lines 345-346)
Pero ahora me han dicho que los escriba así:
(I.ii.345-6)
Claramente, necesito un código de golf para jugar un poco mis referencias de citas de Shakespeare.
La tarea
Escriba un programa o función que, dada una entrada de cadena que sigue a la Plantilla 1 o 2, imprima o devuelva una cadena que siga a la Plantilla 3 o 4, respectivamente. Solo tiene que admitir los actos 1 a 5 y las escenas 1 a 9.
Plantillas
Plantilla 1
(Act x, Scene y, Lines a-b)
Puede suponer que x
nunca excede 5, y
nunca excede 9, a
y b
siempre son enteros positivos que no exceden el valor entero positivo máximo de su idioma, y a
siempre es exclusivamente menor que b
.
Plantilla 2
(Act x, Scene y, Line a)
Las mismas condiciones que la Plantilla 1, excluyendo información sobre b
.
Plantilla 3
(x.y.a-b)
Donde x
es un número romano en mayúscula, y
es un número romano en minúscula a
y b
son números, y b
se acorta a solo los dígitos menores que el primer dígito diferente de igual importancia a
.
Plantilla 4
(x.y.a)
Las mismas condiciones que la Plantilla 3, excluyendo información sobre b
.
Casos de prueba
Deje f(s)
ser la función definida en la Tarea. ""
denota un valor de cadena.
>>> f("(Act 1, Scene 2, Lines 345-346)")
"(I.ii.345-6)"
>>> f("(Act 3, Scene 4, Lines 34-349)")
"(III.iv.34-349)"
>>> f("(Act 5, Scene 9, Lines 123-234)")
"(V.ix.123-234)"
>>> f("(Act 3, Scene 4, Line 72)")
"(III.iv.72)"
>>> f("(Act 2, Scene 3, Lines 123-133)")
"(II.iii.123-33)"
>>> f("(Act 4, Scene 8, Lines 124-133)")
"(IV.viii.124-33)"
Para los propósitos de este desafío, se deben admitir las siguientes traducciones de números arábigos a romanos:
1 i I
2 ii II
3 iii III
4 iv IV
5 v V
6 vi (you do not have to support past 5)
7 vii
8 viii
9 ix
(Act 1, Scene 2, Lines 345-3499)
Respuestas:
El lenguaje de programación de Shakespeare (no competidor)
Realmente me gustó esta pregunta, y como había algún interés en una respuesta en lenguaje Shakespeare, aquí hay una.
(Tiene más de 6000 bytes de longitud). Hay algunos trucos allí, pero no he intentado jugar mucho al golf porque: (1) ya contribuí mi parte del golf en otra respuesta y (2) cambié todos los caracteres a "Página "y" Puck ", o todas las frases para" big big big big big cat ", parecen estropear la diversión. En cambio, para la parte que trata con números romanos, he usado caracteres que son romanos, etc. Reutilicé caracteres e instrucciones para guardar algo de mecanografía. :-)
El programa debería ser en su mayoría directo, pero una arruga que vale la pena mencionar es que cuando escribí esto asumí que leer un número entero funcionaría de la siguiente manera
scanf
: (1) consumir solo tantos caracteres de la entrada como corresponda a un número entero, y (2) en caso de que de falla, deje la variable sin cambios. (Usé esta segunda propiedad para distinguir entre la Plantilla 1 y 2 en el Acto II, leyendo hasta "Línea" e intentando leer un número entero.) Desafortunadamente, resulta que (lo que considero) es un error en la implementación original de el lenguaje en el que leer un número entero consume todo hasta el final de la línea y arroja un error si falla, por lo que necesita un parchelibspl.c
para que seint_input
comporte másscanf
.Y con eso, funciona:
Pseudocódigo de nivel ligeramente superior en el que trabajé, para ayudar a cualquiera que intente comprender:
Relacionar lo anterior con el código final se deja como ejercicio. :-) Tenga en cuenta que ShakespearePL tiene aritmética y pilas y gotos pero no punteros (solo etiquetas), por lo que implementar "subrutinas" como la conversión a Roman es un poco ... interesante.
fuente
LaTeX,
513364259226215178159 BytesLos buenos ensayos siempre deben escribirse en LaTeX.
Esto utiliza el paquete xstring ya que no hay una gran cantidad de manejo de cadenas incorporado. En el lado positivo, el límite superior para el
\Roman
formato incorporado es mayor de lo que necesitaremos (incluso para los sonetos)2^31-1
. He incluido\documentclass{ecv}
en el recuento, pero ninguno del código de prueba:(Si estuvieras lo suficientemente loco como para usar esto, tendrías que eliminar los nombres de macro al menos. Sobrescribir macros de un solo carácter es una mala práctica)
Ungolfed y comentó:
Tenga en cuenta que en esta versión los comentarios son obligatorios; de lo contrario, la nueva línea se interpreta como un espacio en blanco y se expande a un espacio.
fuente
~
como nombre de macro en lugar de\s
. Pero en realidad no es necesario\s
(\stripcomma
en la versión no dirigida): puede\def\t#1 #2, #3 #4, #5 #6
hacerlo y TeX se encargará de quitar las comas. (Para que puedas usar el~
truco\t
, ahorrando 1 byte.)~
es un poco desagradable, pero me gusta aquí. Significaba que tenía que cambiar la clase de documento (a uno de los otros.cls
archivos de 3 letras que había instalado)\@roman
y\@Roman
no necesita llaves alrededor del argumento.xstring
ideas principales fueron suyas :-) ¡Fue divertido jugar golf juntos!JavaScript (ES6),
210183178177171 bytesAhorró 27 bytes desenrollando parámetros de reposo (gracias a ETHproductions )
Ahorró 5 bytes al no coincidir con el par de apertura y al ajustar la generación de números romanos
Se guardó 1 byte ajustando la expresión ternaria final
Se guardaron 6 bytes combinando dos grupos coincidentes
Casos de prueba:
fuente
Act
y cada uno\D*
con.*
?Gelatina ,
87 8685 bytesPruébalo en línea! o ver un conjunto de pruebas
¿Cómo?
fuente
œr
,Ṗ,Ç
,Ṗ€V
,ṪÇ$
,W
como el último eslabón en un enlace de ayuda, posiblemente, otros también, buen esfuerzo! Esta no es su presentación habitual de Jelly de los 80, merece un reconocimiento especial entre las personas Jelly.R ,
94126112166 bytesY ahora es más extenso que antes :(, volviendo a intentar jugar más golf. Regex para reducir la referencia de la página
robadadescaradamente prestada de @FryAmTheEggman.Ahora realmente necesito hacer algo de trabajo para recuperar los bytes, pero ahora funciona para el segundo caso.
Pruébalo en línea! - Tenga en cuenta que
el
no funciona en TIO y ha sido reemplazado porunlist
fuente
retina ,
8988 bytesPruébalo en línea!
Guardado 3 bytes gracias a Neil.
Elimina los caracteres innecesarios antes de reemplazar los dos primeros números con bloques de
i
caracteres. Luego hace coincidir fragmentos de estosi
s para formar los números romanos apropiados. Luego capitalizamos el primer número romano. Finalmente, hacemos coincidir tantos números como podamos antes del guión y después del guión, de modo que el número de dígitos en el número sea el mismo. Luego eliminamos ese prefijo del segundo número.fuente
iiiii
conv
,iiii
coniv
yviv
conix
parece ahorrar un par de bytes.345-356
, esperaba345-56
.\b
al final del último reemplazo para evitar tener que repetirlo)
en la sustitución?\d
pero parece funcionar ya que no hay otro límite de palabras. ¡Gracias!PHP> = 7.1, 195 bytes
Casos de prueba
Expandido
fuente
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];
Guarda dos bytes.if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";
debería guardar 46.(you do not have to support past 5)
ahorra 15 bytes.".$r[$s].$b"
guarda otros 5 bytes; y[[$a,$s,$b,$e]]=$m;
otro Desafortunadamente, las asignaciones de matrices no funcionan por referencia (todavía).if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}
ahorra 10 bytes y podría funcionar.&&$e-$b
es innecesario para los casos de prueba; entonces ahorra 17 bytes, no 10. Por cierto. todavía no necesita roman 6 a 9.;)for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;
confor(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
.Perl 5, 185 + 1 = 186 bytes
Penalización de 1 byte para la
-n
bandera requerida .Puede fallar en algunos casos de prueba donde la escena tiene más de 10 ^ 11 líneas, pero AFAIK no las escenas de Shakespeare son tan largas;)
En forma legible:
fuente
Rubí , 204 + 1 = 205 bytes
Usa la
-p
bandera.Pruébalo en línea!
fuente
Python 2.7 298 bytes
fuente
Perl, 99 bytes
Corre con
perl -pe
. 98 bytes (fuente) + 1 byte (p
bandera) = 99.fuente
Python 2 ,
301259252221 bytesUn enorme -31 bytes gracias a Chas Brown.
Entonces, esto es ... extremadamente largo ... Creo que puedo jugar al golf, pero he estado destrozando mi cerebro por un tiempo.
Pruébalo en línea!
Descompostura
fuente
b,c,d,e,f=s.groups()
lugar dea,b,c,d,e,f=[s.group(n) for n in range(6)]
[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')
lugar de[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.[0]+'i ii iii iv v vi vii viii ix'.split()
lugar de[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.0
interior de las comillas. Un último pequeño ajuste que se puede ver: que esté utilizando:s,r=XXX,YYY;b,c,d,e,f=s.groups();
se puede ahorrar otros 4 bytes por vez diciendo lo que es equivalente:b,c,d,e,f=XXX.groups();r=YYY;
. ¡Entonces terminas con 81 bytes menos que mi envío! :)Q / KDB +,
200187 bytesSolución:
Ejemplos:
Explicación: (un poco sin golf)
Notas:
Técnicamente puede ser 2 bytes más corto (no es necesario
f:
) pero facilita mostrar ejemplos de esta manera.Ediciones:
string
con$:
,count
con#:
,til
con(!)
yfirst
con(*:)
, emite los índices de R a cadenas para que no tengamos que convertir el acto / escena en intfuente