Mini golf de lunes: una serie de desafíos de código corto de golf , publicados (¡con suerte!) Todos los lunes.
Historia real 1 : El otro día, estaba jugando en mi tableta cuando tuve la idea de visitar la página que normalmente uso en mi PC para probar JavaScript. Después de cargar la página, ingresé a este sencillo programa:
alert("Hello!")
Luego procedí a presionar el botón Ejecutar, y me sorprendió cuando me dijo que el código que había ingresado no era válido. Eché un segundo vistazo al cuadro de texto y vi esto:
alllelelerlerlertlert("Heeelelellellelloello!")
Que ??? Eso no es lo que entré! Entonces, ¿qué pasó aquí? Para resolverlo, ingresé dos líneas simples:
abcdefg
0123456
Esto resultó como:
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
0112123123412345123456
Por ahora, todavía no tenía idea de lo que sucedió con las letras, pero los números parecían más simples, así que lo miré más de cerca. Al final resultó que, la página web simplemente estaba ingresando el primer carácter, luego repitiendo todo el resto en la cadena cada vez que se presionaba uno nuevo:
0112123123412345123456
0
1
12
123
1234
12345
123456
¿Pero qué pasa con las secciones de letras? Después de reflexionar por un minuto, me di cuenta de que es lo mismo, pero en lugar de repetir cada subsección una vez, la repite dos veces :
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefg
a
bb
bcbc
bcdbcd
bcdebcde
bcdefbcdef
bcdefgbcdefg
Una combinación de los dos funciona con una combinación de estas técnicas:
abc123z
abbbcbcbc1bc12bc123bc123zbc123z
a
bb
bcbc
bc1
bc12
bc123
bc123zbc123z
Cualquiera que sea la falla, esto parece restablecerse en la puntuación y los espacios, por lo que se abc def
convierte abbbcbc deeefef
.
En este punto, estaba tan absorto en resolverlo y convertirlo en un desafío interesante que olvidé por qué había estado allí en primer lugar. (Sin embargo, descubrí cómo escribir normalmente: presionando la barra espaciadora después de cada personaje. Bastante tedioso, pero tienes que hacer lo que tienes que hacer).
Desafío
El objetivo del desafío es escribir un programa o función que tome el texto a procesar, realice los cambios enumerados anteriormente y genere / devuelva el resultado.
Detalles
- La entrada solo contendrá ASCII imprimible, y no habrá pestañas ni líneas nuevas.
Casos de prueba
Entradas: (una por línea)
Mess up text
This is some longer text.
CAPS LOCK && "Punc-tua"+'tion'
under_score_style
CaPs wItHIn loWERs
1337 numb3r5
abcdefghij 0123456789
Code-golf is the best!
Salidas:
Meeesesessess upp teeexexextext
Thhhihihishis iss sooomomomeome looononongongongeongeongeronger teeexexextext.
CAAAPAPAPSAPS LOOOCOCOCKOCK && "Puuunununcunc-tuuuaua"+'tiiioioionion'
unnndndndendendernder_scccococorcorcorecore_stttytytyltyltyletyle
CaaaPaPaPsaPs wIIItItItHItHItHIItHIItHInItHIn loooWoWoWEoWEoWERoWERoWERsoWERs
1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
abbbcbcbcdbcdbcdebcdebcdefbcdefbcdefgbcdefgbcdefghbcdefghbcdefghibcdefghibcdefghijbcdefghij 0112123123412345123456123456712345678123456789
Cooodododeode-gooolololfolf iss thhhehe beeesesestest!
Puntuación
Esto es código de golf , por lo más corto código válido en bytes victorias. Tiebreaker va a la presentación que alcanzó su conteo final de bytes primero. El ganador será elegido el próximo lunes 2 de noviembre. ¡Buena suerte!
Editar: ¡ Y el ganador es ... @ MartinBüttner usando Retina para una increíble solución de 43 bytes !
1 Sí, esta historia es completamente cierta, y si necesita más aclaraciones, vea la nota al pie 1.
' '.join(x[0]+''.join(2*x[1:i]for i in range(1,len(x)+1)) for x in raw_input().split())
Respuestas:
Retina , 43 bytes
Ejecute el código desde un solo archivo con la
-s
bandera. Dado que esta es solo una sustitución de expresiones regulares, puede probarla aquí (haga clic en la pestaña Contexto para ver los resultados).Explicación
Esto coincide con cualquier dígito y letra que no sea el primero en una ejecución. Si bien
.
puede coincidir con cualquier carácter sin salto de línea, los aspectos retrospectivos aseguran las otras condiciones:Esto coincide hacia atrás desde la posición después de
.
. Primero hace coincidir uno o más caracteres alfanuméricos y los captura en grupo1
con([^_\W]+)
. Esto asegura inmediatamente que.
corresponde a un carácter alfanumérico en sí. Luego, el adicional[^_\W]
se asegura de que haya un carácter alfanumérico más en la ejecución actual, que no incluimos la coincidencia. Ahora grupo1
es con lo que queremos reemplazar la coincidencia si es un dígito; si es una letra, queremos reemplazarlo con el doble de esta cadena. Ahí es donde entra en juego la segunda mirada atrás:Este es opcional, por lo que si falla no afectará en absoluto la coincidencia. Primero se asegura que el
.
era no un dígito a través de(?<=\D)
- por lo que esta búsqueda hacia atrás sólo es relevante cuando estamos letras coincidentes. En ese caso, hacemos coincidir el grupo\1
una vez más (esto siempre coincide, porque hemos capturado al grupo desde la misma posición), pero lo capturamos en el grupo2
.Por lo tanto, simplemente reemplazamos la expresión regular con el contenido de ambos grupos (
$1$2
). Si la coincidencia era un dígito,$2
todavía estará vacía y reescribiremos el prefijo solo una vez. Si fue una carta,$2
es lo mismo$1
y la escribimos dos veces.fuente
JavaScript (ES6) 82
Usando la optimización regexp sugerida por Mwr247
Pruebe a ejecutar el fragmento a continuación en cualquier navegador reciente
fuente
JavaScript (ES6),
928887No tengo idea de cómo jugar golf ...
Gracias Mwir247 por la expresión regular de golf y las producciones ETH por un byte de golf en función reducida .
fuente
/[^_\W]+/g
(ahorra 3 caracteres).reduce
función:(a,e)=>a+=(y+=e,++e?y:y+y)
(1 byte más corto)Haskell,
215200 bytesEs un desastre.
Diviértete leyendo todas las peculiaridades extrañas, nunca pensé que usaría
id
tanto.Lástima que el material que ya lo hace la mitad del trabajo que aquí tiene que ser importado (
isDigit
,isAlpha
,inits
).fuente
lang-hs
nolang-haskell
. Al especificarlolang-haskell
, probablemente termine usando un marcador predeterminado.Gema, 57 caracteres
Ejecución de muestra:
fuente
Haskell,
183181bytesUso:
No sé si es esencialmente diferente con la respuesta de Leif Willerts. Pero aquí está el algoritmo.
De alguna manera mantengo soportes reductores.
fuente
T-SQL, 357 bytes
Ej:
exec x(@s='1337 numb3r5')
devoluciones1333337 nuuumumumbumbumb3umb3rumb3rumb3r5
fuente
Python 2, 131 bytes
Recorre los caracteres y guarda / repite si es necesario.
fuente
Pip, 41 bytes
Toma el texto como un argumento de línea de comandos. Utilizamos un reemplazo de expresiones regulares para reemplazar todas las ejecuciones alfanuméricas (
[^_\W]+
) con una función de devolución de llamada. Esta función asigna otra función a cada carácter de la palabra, generando series de caracteres progresivamente más grandes (con la variable global haciendo uny
seguimiento del índice) y repitiéndolas X2 si el carácter no es un número. (La lógica que utiliza+
para convertir a un número y luegoQ
para verificar si es igual a la cadena del carácter original). Sin embargo, este proceso omite el primer carácter, por lo que tenemos que agregarlo después (a@0.
).fuente
Python 3 , 86 bytes
Pruébalo en línea!
fuente