En la obra absurda Rosencrantz y Guildenstern están muertos , los dos personajes principales Rosencrantz y Guildenstern (¿o son ellos?) Siempre están mezclando cuál de ellos es quién o, a veces, cuál de sus propias partes del cuerpo es cuál, debido a la falta percibida de identidad individual ¿No sería absurdo si incluso barajaran sus nombres?
Su tarea es escribir una función que tome una cadena de una longitud par (y por diseño, un múltiplo de 4) que tenga más de 7 caracteres, dividirla y barajarla.
La división será la siguiente : la cadena tendrá formato "abscd"
, y s actuará como un carácter separador. La primera sección y el separador abs
serán la primera mitad de la cadena, mientras que la segunda mitad serácd
La longitud de a
será(string length / 4) - 1
La longitud de b
será(string length / 4)
La longitud de s
será1
La longitud de c
será(string length / 4) + 1
La longitud de d
será(string length / 4) - 1
Esto puede ser realmente confuso, así que déjame mostrarte algunos ejemplos
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
Finalmente:
Luego barajas las partes, generando adscb
ex. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Rulez:
- Las lagunas estándar están prohibidas
- Respuestas aceptables: una función que toma la entrada a través de una cadena de entrada y devuelve una cadena de salida
- Si la cadena de entrada no coincide con los requisitos proporcionados anteriormente, su código DEBE dar error (no importa qué tipo de
Exception
oError
) - Esto es
code-golf
, ¡entonces la respuesta más corta (válida) (en cada idioma) gana! - Puntos de bonificación para una línea :-) (No realmente, solo puntos geniales)
Respuestas:
K (oK) ,
353433 bytesPruébalo en línea!
Sin validación de entrada (para la recompensa de ngn),
252423 bytesPruébalo en línea!
Aprendí rápidamente un poco de K y, al mirar la lista de verbos, pensé que un enfoque alternativo ( no usar cortar) podría funcionar aquí. Y funcionó perfectamente.
Cómo funciona
fuente
Perl 6 ,
6058 bytes-2 bytes gracias a Jo King
Pruébalo en línea!
Lanza "La longitud de la sublista de rotación está fuera de rango" en caso de error.
Explicación
fuente
J ,
3635 bytesPruébalo en línea!
-1 byte por
{.
+ longitudes negativas y;.2
que corta en unos como marcadores "finales" en su lugar.Respuesta original, 36 bytes
Pruébalo en línea!
ngn mencionó "cortar" en un comentario a una respuesta anterior de K , y me hizo probar J, que tiene el mismo "corte" (no tengo idea de cómo funciona K).
Cómo funciona
Tenga en cuenta que esta función maneja automáticamente las entradas no válidas:
{.
arrojadomain error
ya que su argumento de longitud tiene que ser enteros.5 A.
lanzaindex error
.length error
se arroja.fuente
Python 3 ,
10310210197888684 bytesPruébalo en línea!
Realmente no es una línea, pero
;
es un byte menos por línea que el salto de línea y la sangría.Lanza
ZeroDivisionError
si la longitud de la cadena de entrada es menor que 8 o no es un múltiplo entero de 4.También funciona en Python 2.
-4 bytes gracias a Jo King
-9 bytes gracias a los ovs
-2 bytes gracias a Jonathan Frech
-2 bytes gracias a Bubbler
fuente
//=
par más externo que se volvió redundante. ¡Gracias un montón!-l+1
<->1-l
?Perl 6 , 78 bytes
Pruébalo en línea!
Bloque de código anónimo que toma una cadena y devuelve la cadena modificada si es válida; de lo contrario, devuelve un error de división por cero. Sé que puedo modificar una matriz directamente, por lo que podría intercambiar las dos secciones de la cadena, pero no puedo entenderlo.
fuente
K (NGN / K) ,
1201131039995 bytesEs de esperar que se pueda jugar más, incluyó una función adicional para probar si la longitud de la cadena es divisible por cuatro, genera un error con referencia a la variable no declarada si la entrada no es válida
EDITAR: Condición perdida en longitud mayor que 7, incluida
EDITAR: combinado en una función, elimina las declaraciones de variables redundantes
Pruébalo en línea!
fuente
indices_string
)? hazme un ping en el huerto si debo explicarloRetina 0.8.2 , 58 o 73 o 83 o 93 bytes
Pruébalo en línea! Explicación:
Capturar
a
en$1
, y que sea lo más corto posible*?
.$#2
,$#3
y$#4
terminan como la longitud dea
.Capturar
b
adentro$4
. Las(?<-2>.)+
capturas hasta la longitud dea
, mientras que el otro.
agrega 1 a su longitud según sea necesario.Capturar
s
yc
en$6
. Su longitud combinada es tres más que la longitud dea
.Captura
d
adentro$7
. Su longitud no es más que la longitud dea
.Hicimos lo
a
más corto posible, pero aún queremos llegar al final de la entrada.Intercambio
b
yd
.La etapa anterior no valida su entrada. Como Retina no tiene errores de tiempo de ejecución, hay varias opciones para la validación de entrada:
No genera nada si la longitud es inferior a 8 o no es múltiplo de 4. (+15 bytes)
Salidas
Error
si la longitud es menor que 8 o no es múltiplo de 4. (+25 bytes)Se bloquea si la longitud es inferior a 8 o no es múltiplo de 4. (+35 bytes)
fuente
C (gcc) con
-Dx=memcpy
y-DL=(l-1)
,154158160 bytesDevuelve NULL si la longitud de la cadena de entrada no es divisible por 4 o más corta que 8 caracteres.
Gracias a Rogem y Jonathan Frech por las sugerencias.
EDITAR: El preprocesador movido define la línea de comando e hizo que la cadena se asigne dinámicamente para ajustarse estrictamente al rompecabezas.
Pruébalo en línea!
fuente
t[80]
? No parece haber un límite superior con respecto a la longitud de entrada.malloc()
en su lugar.NULL
para resultados no válidos, utiliza valores de retorno dememcpy()
, una macro similar a una función para omitir los tipos y matrices de longitud variable C99 para omitirmalloc()
.//
o el-w
?-w
es solo una conveniencia para suprimir advertencias (por lo que los errores son más fáciles de encontrar). Por lo general, agrego argumentos de línea de comando después//
de que TIO cuente sus bytes por mí, y luego deduzco 1 del total para tener en cuenta el carácter adicional necesario para hacer eso.Jalea , 28 bytes
(Si se permite un programa completo, podemos eliminar el final
F
)Si la longitud es menor que 8 o no es divisible por cuatro a
ValueError
se eleva durante la división entera deinf
(un flotante) por4
- la división produceNaN
(también un flotante) que luego no puede ser lanzado a unint
.Pruébalo en línea!
¿Cómo?
fuente
Jalea , 25 bytes
Pruébalo en línea!
Se
Ẏ
puede eliminar para convertir esto en un programa completo.fuente
Ruby , 64 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
9789 bytesGuardado 8 bytes gracias a @ l4m2
Pruébalo en línea!
fuente
JavaScript (Node.js) , 80 bytes
Pruébalo en línea!
JavaScript (Node.js) , 84 bytes
Pruébalo en línea!
JavaScript (Node.js) , 87 bytes
Pruébalo en línea!
Más corto que RegExp
fuente
Java 8, 135 bytes
Lanza
ArithmeticException
(se divide por cero) si la cadena de entrada no coincide con los requisitos. Pruébelo en línea aquí .Sin golf:
fuente
l/=l>7&l%4<1?4:0;
lugar del=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 bytes
Devoluciones por modificación. Compilar con:
Archivo fuente:
Pruébalo en línea!
Degolf
fuente