Está de volta à temporada escolar! Então, para um emprego de meio período, você está ajudando na biblioteca da escola. O problema é que o bibliotecário chefe nunca ouviu as palavras "Dewey Decimal", muito menos implementou esse sistema. Em vez disso, o sistema de classificação em uso cresceu "organicamente" à medida que a biblioteca se expandia ...
Em um esforço para manter sua sanidade, você optou por escrever um programa para ajudá-lo a classificar os livros à medida que eles são devolvidos, porque ai de você se você classificar os livros de maneira errada. (O bibliotecário-chefe é MUITO rigoroso.)
Entrada / Saída
- A entrada será uma lista de títulos de livros (hipotéticos), um por linha, de STDIN / idioma equivalente.
- Você pode assumir não mais do que 100 livros introduzidos por vez (você só pode transportar tantos pela biblioteca de uma só vez).
- Os livros podem ter várias palavras em seus títulos, e essas palavras podem ser separadas por espaços ou outra pontuação (por exemplo, dois pontos
:
, um hífen-
etc.). - Para facilitar o cálculo, suponha que todos os títulos sejam UTF-8.
A saída é os mesmos títulos, classificados de acordo com as regras abaixo, novamente um por linha, para STDOUT / idioma equivalente.
As regras de classificação
Os livros são classificados numericamente com base em seu valor médio de caracteres (ou seja, o valor acumulado de caracteres dividido pelo número de caracteres no título do livro), contados pelas seguintes regras:
- Todos os caracteres contam para determinar o número de caracteres em um título.
- Letras minúsculas são contadas por sua posição no alfabeto. (a = 1, b = 2, ... z = 26)
- Se o título contiver letras maiúsculas, elas contarão com 1,5 valor em minúsculas (A = 1,5, B = 3, ... Z = 39). ("Letras maiúsculas são importantes!", Diz o bibliotecário.)
- Cada sinal de pontuação / símbolo nesta lista
!@#$%^&*()-=_+[]\{}|;':",./<>?~
conta -1 do valor acumulado antes da média. ("Os títulos grandiosos não são!") - Se o título contiver um número, escrito em algarismos arábicos , esse número será subtraído do valor médio antes da classificação. Vários dígitos consecutivos são tratados como um número (por exemplo,
42
subtrai 42, não subtrai 4 e depois subtrai 2). Dígitos individuais não contam para o valor cumulativo (ou seja, cada dígito contribui com 0), mas contam para o número de caracteres. Observe que isso pode resultar em um valor negativo e deve ser tratado adequadamente. (Há rumores de que o bibliotecário tem uma queda por um instrutor de matemática há vários anos.) - Se o título contiver duas palavras separadas que começam com um
R
, o livro recebe uma pontuação de "infinito" e é jogado em uma pilha no canto (ou seja, organizado aleatoriamente no final da lista). (O bibliotecário já foi descartado por uma pessoa com essas iniciais, ou pelo menos você já ouviu falar.) - Os espaços não contam para o valor acumulado dos caracteres (ou seja, eles contribuem com 0), mas contribuem para o número de caracteres em um título.
- Os caracteres que não se encaixam nas regras acima (por exemplo, a
ÿ
) não contam para o valor acumulado dos caracteres (ou seja, contribuem com 0), mas contribuem para o número de caracteres em um título. - Por exemplo, um livro hipotético
ÿÿÿÿÿ
teria uma "pontuação" de(0+0+0+0+0) / 5 = 0
, mas um livro hipotéticoÿÿyÿÿ
teria uma "pontuação" de(0+0+25+0+0) / 5 = 5
. - Dois livros que "pontuam" o mesmo podem ser Saída em sua escolha de ordem. (Eles estão na mesma prateleira, de qualquer maneira)
Exemplo de entrada 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Exemplo de saída 1 (com "pontuações" entre parênteses para mostrar o raciocínio - você não precisa imprimi-las)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Exemplo de entrada 2
Matthew
Mark
Luke
John
Revelations
Exemplo de saída 2 (com "pontuações" entre parênteses para mostrar o raciocínio - você não precisa imprimi-las)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Exemplo de entrada 3
42
9 Kings
1:8
7th
Exemplo de saída 3 (com "pontuações" entre parênteses para mostrar o raciocínio - você não precisa imprimi-las)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Outras restrições
- Este é o Code-Golf, porque você precisa manter o programa em segredo dos olhos sempre atentos do bibliotecário e, quanto menor o programa, mais fácil é se esconder.
- Aplicam-se restrições de brecha padrão
- Não deixe que o bibliotecário o pegue relaxando, gastando todo o seu tempo no PPCG.
Respostas:
APL (132)
Como todo mundo está fazendo a mesma coisa, essa também é uma função que pega uma matriz de títulos e a devolve classificada, por exemplo:
Explicação:
⎕ML←3
: definido⎕ML
como3
(para⊂
)⍵[⍋{
...}¨⍵]
: classifica a entrada pelos valores retornados da função interna↑¨⍵⊂⍨⍵≠' '
: obtém o primeiro caractere de cada palavra2='R'+.=
: veja se dois deles são'R'
.:!99
: se sim, retorne 99! (≈ 9,3 × 10 155 ). Isso não é bem infinito, mas serve: um título nunca pode ter uma pontuação superior a 38 vezes (ZZZZ ...); portanto, desde que nenhum título seja maior que 2 × 10 130 yottabytes, é garantido que estes serão no final.⋄
: de outra forma:(
...)÷⍴⍵
: divida a pontuação pelo comprimento de⍵
depois de calculá-la:G←(⊂⎕A),(⎕UCS 96+⍳26)
: armazenar emG
letras maiúsculas e minúsculas(⎕UCS 32+⍳94)~'`',⎕D,∊G
: os caracteres ASCII imprimíveis, exceto letras, dígitos, espaços e'`'
, que são os caracteres para os quais um ponto é subtraído. (Isso é mais curto do que escrevê-los, porqueG
é usado mais tarde.)+/⍵∊
: conte a quantidade desses caracteres em⍵
-
: subtraia isso de:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: a soma de 1,5 × a pontuação das maiúsculas e 1 × a pontuação das letras minúsculas.-⍨
: depois, subtraia o total dos números em⍵
:⍵⊂⍨⍵∊⎕D
: encontre os grupos de dígitos em⍵
'0',
: add'0'
, para impedir que a lista esteja vazia⍎¨
: avalie cada sequência+/
: encontre a somafonte
!99
você poderia usar⌊/⍬
Lua 5.3,
366364 bytesEsse código funciona apenas no Lua 5.3 porque ele precisa lidar com caracteres Unicode. Se você não se importa com Unicode, substitua "utf8" por "string" e ele funcionará bem com Lua 5.2 ou 5.1.
Ele recebe suas entradas dos argumentos da linha de comando, portanto, execute-o na linha de comando ou coloque esse código acima da minha resposta:
fonte
utf8
comstring
a Ideone e ficou sem saída.(arg)
está sentado lá me encarando. Aparentemente, essa pergunta fritou meu cérebro. Tenha um +1.Mathematica,
253216 bytes (214 caracteres)Chame a função como
f[{"42", "9 Kings", "1:8", "7th"}]
; ele retornará uma lista classificada das entradas.Apenas conseguiu! A correspondência de padrões do Mathematica não é tão concisa quando estão envolvidas seqüências de caracteres, e eu acabo sendo morto por esses nomes longos. Os dois bytes extras são para o
Infinity
caractere unicode.(Deixe-me saber se eu entrei em contato com quaisquer brechas padrão.)
Atualizar
Observando um pouco mais a resposta do edc65, parece que o OP aceitará uma função que classifica uma lista de strings. Com isso em mente, podemos usar a forma ao curry de
SortBy
(que o Mathematica chama de "forma do operador"); com um argumento (a função aplicada aos elementos da lista para determinar sua ordem), ele se comporta como uma função que recebe um argumento, retornando a forma classificada da entrada; isto é,SortBy[list, f]
é equivalente a(SortBy[f])[list]
.Ungolfed
fonte
JavaScript (ES6), 210
218 251Como uma função com um argumento de matriz, retornado classificado.
fonte
O.innerHTML
parathis.InnerHTML
no console do Firefox.C #,
352349 bytesDevido à magia do linq:
Poderia ter salvo outros 6 bytes se o backtick fosse incluído na lista de pontuação!
fonte
Go, 755 bytes
A versão formatada:
A implementação de uma interface de classificação personalizada tornou-a mais longa do que o esperado. O programa lê de STDIN até o final da entrada ou uma linha em branco é inserida.
fonte
PHP, 362
367BytesVersão formatada:
Linhas interessantes:
Converte um único caractere UTF-8 em seus valores de bytes e os soma, para obtermos o valor real dos caracteres ASCII e um valor superior a 127 para os caracteres multibyte.
Utiliza baixa precedência do operador
and
eor
atribui o valor do caractere em uma única instrução semif
.fonte
Perl 5 , 190 bytes
Experimente online!
fonte