¡Es la temporada de regreso a la escuela! Entonces, para un trabajo de medio tiempo, estás ayudando en la biblioteca de la escuela. El problema es que el bibliotecario jefe nunca ha escuchado las palabras "Dewey Decimal", y mucho menos implementó ese sistema. En cambio, el sistema de clasificación en uso ha crecido "orgánicamente" a medida que la biblioteca se ha expandido ...
En un esfuerzo por mantener la cordura, ha elegido escribir un programa para ayudarlo a clasificar los libros a medida que se devuelven, porque ¡ay de usted si clasifica los libros mal! (El bibliotecario jefe es MUY estricto).
De entrada y salida
- La entrada será una lista de títulos de libros (hipotéticos), uno por línea, de STDIN / idioma equivalente.
- Puede suponer no más de 100 libros ingresados a la vez (solo puede llevar tantos por la biblioteca a la vez).
- Los libros pueden tener varias palabras en sus títulos, y estas palabras pueden estar separadas por espacios u otros signos de puntuación (por ejemplo, dos puntos
:
, un guión).-
, etc.). - Para facilitar el cálculo, suponga que todos los títulos son UTF-8.
La salida es los mismos títulos, ordenados de acuerdo con las siguientes reglas, nuevamente una por línea, a STDOUT / idioma equivalente.
Las reglas de clasificación
Los libros se ordenan numéricamente según su valor de carácter promedio (es decir, el valor de carácter acumulativo divide el número de caracteres en el título del libro), contados por las siguientes reglas:
- Todos los caracteres cuentan para determinar el número de caracteres en un título.
- Las letras minúsculas se cuentan por su posición en el alfabeto. (a = 1, b = 2, ... z = 26)
- Si el título contiene letras mayúsculas, esas cuentan para 1.5 su valor en minúsculas (A = 1.5, B = 3, ... Z = 39). ("¡Las letras mayúsculas son importantes!", Dice el bibliotecario).
- Cada signo de puntuación / símbolo en esta lista
!@#$%^&*()-=_+[]\{}|;':",./<>?~
cuenta -1 desde el valor acumulado antes del promedio. ("¡Los títulos grandiosos no lo son!") - Si el título contiene un número, escrito en números arábigos , ese número se resta del valor promedio antes de ordenar. Múltiples dígitos consecutivos se tratan como un número (por ejemplo,
42
restarían 42, no restarían 4 y luego restarían 2). Los dígitos individuales no cuentan para el valor acumulado (es decir, cada dígito contribuye con 0), pero sí cuentan para el número de caracteres. Tenga en cuenta que esto puede resultar en un valor negativo y debe tratarse adecuadamente. (Se rumorea que el bibliotecario ha estado enamorado de un instructor de matemáticas durante varios años, ahora). - Si el título contiene dos palabras separadas que comienzan con un
R
, el libro obtiene una puntuación de "infinito" y se arroja a una pila en la esquina (es decir, ordenado al azar al final de la lista). (El bibliotecario fue abandonado una vez por una persona con esas iniciales, o eso has escuchado). - Los espacios no cuentan para el valor de carácter acumulativo (es decir, contribuyen con 0), pero contribuyen con el número de caracteres en un título.
- Caracteres que no se ajustan a las reglas anteriores (por ejemplo, un
ÿ
) no cuentan para el valor de carácter acumulativo (es decir, contribuyen con 0), pero sí contribuyen al número de caracteres en un título. - Por ejemplo, un libro hipotético
ÿÿÿÿÿ
tendría una "puntuación" de(0+0+0+0+0) / 5 = 0
, pero un libro hipotéticoÿÿyÿÿ
tendría una "puntuación" de(0+0+25+0+0) / 5 = 5
. - Dos libros que "puntúan" de la misma manera pueden aparecer en su orden de elección. (Están en el mismo estante, de todos modos)
Entrada de ejemplo 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Ejemplo de salida 1 (con "puntajes" entre paréntesis para mostrar el razonamiento; no es necesario imprimirlos)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Ejemplo de entrada 2
Matthew
Mark
Luke
John
Revelations
Ejemplo de salida 2 (con "puntajes" entre paréntesis para mostrar el razonamiento; no es necesario imprimirlos)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Entrada de ejemplo 3
42
9 Kings
1:8
7th
Ejemplo de salida 3 (con "puntajes" entre paréntesis para mostrar el razonamiento; no es necesario imprimirlos)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Otras restricciones
- Este es Code-Golf, porque necesita mantener el programa en secreto de los ojos siempre observadores del bibliotecario, y cuanto más pequeño sea el programa, más fácil será ocultarlo.
- Se aplican restricciones de escapatoria estándar
- No dejes que el bibliotecario te pille holgazaneando gastando todo tu tiempo en PPCG.
Respuestas:
APL (132)
Como todos los demás están haciendo lo mismo, esta también es una función que toma una serie de títulos y los devuelve ordenados, por ejemplo:
Explicación:
⎕ML←3
: establecido⎕ML
en3
(para⊂
)⍵[⍋{
...}¨⍵]
: ordena la entrada por los valores devueltos por la función interna↑¨⍵⊂⍨⍵≠' '
: obtener el primer carácter de cada palabra2='R'+.=
: ver si dos de estos son'R'
.:!99
: si es así, devuelve 99! (≈ 9.3 × 10 155 ). Esto no es del todo infinito, pero lo hará: un título nunca puede tener una puntuación de más de 38 veces su longitud (ZZZZ ...), por lo que siempre que ningún título sea mayor que aproximadamente 2 × 10 130 yottabytes, está garantizado que estos estarán al final.⋄
: de lo contrario:(
...)÷⍴⍵
: divide la puntuación por la longitud de⍵
después de calcularla:G←(⊂⎕A),(⎕UCS 96+⍳26)
: almacenar enG
mayúsculas y minúsculas(⎕UCS 32+⍳94)~'`',⎕D,∊G
: los caracteres ASCII imprimibles, excepto letras, dígitos, espacios y'`'
, que son los caracteres para los que se resta un punto. (Esto es más corto que escribirlos todos, porqueG
se usa más adelante).+/⍵∊
: cuenta la cantidad de estos caracteres en⍵
-
: restar esto de:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: la suma de 1.5 × las puntuaciones para las mayúsculas, y 1 × las puntuaciones para las letras minúsculas.-⍨
: luego, reste el total de los números en⍵
:⍵⊂⍨⍵∊⎕D
: encontrar los grupos de dígitos en⍵
'0',
: agregar'0'
, para evitar que la lista esté vacía⍎¨
: evalúa cada cadena+/
: Encuentra la sumafuente
!99
puedas usar⌊/⍬
Lua 5.3,
366364BytesEste código solo funciona en Lua 5.3 porque necesita tratar con caracteres Unicode. Si no le importa Unicode, reemplace "utf8" con "string" y funcionará bien con Lua 5.2 o 5.1.
Toma sus entradas de los argumentos de la línea de comandos, así que ejecútelo desde la línea de comandos o coloque este código sobre mi respuesta:
fuente
utf8
constring
el Ideone y no tengo salida.(arg)
está sentado allí mirándome a la cara. Esta pregunta aparentemente me ha frito el cerebro. Tener un +1.Mathematica,
253216 bytes (214 caracteres)Llame a la función como
f[{"42", "9 Kings", "1:8", "7th"}]
; devolverá una lista ordenada de las entradas.¡Apenas lo logré! La coincidencia de patrones de Mathematica no es tan concisa cuando hay cadenas involucradas, y esos largos nombres me matan. Los dos bytes adicionales son para el
Infinity
carácter unicode.(Avíseme si he caído en conflicto con las lagunas estándar).
Actualizar
Mirando un poco más de cerca la respuesta de edc65, parece que el OP aceptará una función que clasifica una lista de cadenas. Con eso en mente, podemos usar la forma curry de
SortBy
(que Mathematica llama la "forma del operador"); con un argumento (la función aplicada a los elementos de la lista para determinar su orden) se comporta como una función que toma un argumento y devuelve la forma ordenada de la entrada; es decir,SortBy[list, f]
es equivalente a(SortBy[f])[list]
.Sin golf
fuente
JavaScript (ES6),
210218251Como una función con un argumento de matriz, devuelto ordenado.
fuente
O.innerHTML
athis.InnerHTML
la consola de Firefox.C #,
352349 bytesDebido a la magia de linq:
¡Podría haber guardado otros 6 bytes si el backtick se incluyera en la lista de puntuación!
fuente
Ir, 755 bytes
La versión formateada:
La implementación de una interfaz de clasificación personalizada lo hizo más largo de lo esperado. El programa lee desde STDIN hasta que se ingresa el final de una línea en blanco.
fuente
PHP, 362
367BytesVersión formateada:
Lineas interesantes:
Convierte un solo carácter UTF-8 a sus valores de byte y los suma, de modo que obtengamos el valor real para los caracteres ASCII y un valor superior a 127 para los caracteres multibyte.
Hace uso de la baja precedencia del operador
and
yor
para asignar el valor de carácter en una sola declaración sinif
.fuente
Perl 5 , 190 bytes
Pruébalo en línea!
fuente