Dentro dos recessos dos caracteres Unicode, existe um bloco Unicode de (atualmente) 63 caracteres chamado "Number Forms", que consiste em caracteres que possuem valores numéricos como o número romano Ⅻ, frações vulgares como ⅑ ou ↉ ou estranhas como ↊ (10) ou ↈ (100000).
Sua tarefa é escrever um programa ou função que, ao receber uma lista de caracteres Unicode atribuídos nesse bloco, classifique a lista pelos valores numéricos de cada caractere.
Uma lista (classificável) de caracteres e valores pode ser encontrada na página da Wikipedia .
Para ser independente, aqui está uma lista dos pontos de código e seus valores:
Hex Char Value
0x00BC: ¼ = 1/4 or 0.25
0x00BD: ½ = 1/2 or 0.5
0x00BE: ¾ = 3/4 or 0.75
0x2150: ⅐ = 1/7 or 0.142857
0x2151: ⅑ = 1/9 or 0.111111
0x2152: ⅒ = 1/10 or 0.1
0x2153: ⅓ = 1/3 or 0.333333
0x2154: ⅔ = 2/3 or 0.666667
0x2155: ⅕ = 1/5 or 0.2
0x2156: ⅖ = 2/5 or 0.4
0x2157: ⅗ = 3/5 or 0.6
0x2158: ⅘ = 4/5 or 0.8
0x2159: ⅙ = 1/6 or 0.166667
0x215A: ⅚ = 5/6 or 0.833333
0x215B: ⅛ = 1/8 or 0.125
0x215C: ⅜ = 3/8 or 0.375
0x215D: ⅝ = 5/8 or 0.625
0x215E: ⅞ = 7/8 or 0.875
0x215F: ⅟ = 1
0x2160: Ⅰ = 1
0x2161: Ⅱ = 2
0x2162: Ⅲ = 3
0x2163: Ⅳ = 4
0x2164: Ⅴ = 5
0x2165: Ⅵ = 6
0x2166: Ⅶ = 7
0x2167: Ⅷ = 8
0x2168: Ⅸ = 9
0x2169: Ⅹ = 10
0x216A: Ⅺ = 11
0x216B: Ⅻ = 12
0x216C: Ⅼ = 50
0x216D: Ⅽ = 100
0x216E: Ⅾ = 500
0x216F: Ⅿ = 1000
0x2170: ⅰ = 1
0x2171: ⅱ = 2
0x2172: ⅲ = 3
0x2173: ⅳ = 4
0x2174: ⅴ = 5
0x2175: ⅵ = 6
0x2176: ⅶ = 7
0x2177: ⅷ = 8
0x2178: ⅸ = 9
0x2179: ⅹ = 10
0x217A: ⅺ = 11
0x217B: ⅻ = 12
0x217C: ⅼ = 50
0x217D: ⅽ = 100
0x217E: ⅾ = 500
0x217F: ⅿ = 1000
0x2180: ↀ = 1000
0x2181: ↁ = 5000
0x2182: ↂ = 10000
0x2183: Ↄ = 100
0x2184: ↄ = 100
0x2185: ↅ = 6
0x2186: ↆ = 50
0x2187: ↇ = 50000
0x2188: ↈ = 100000
0x2189: ↉ = 0
0x218A: ↊ = 10
0x218B: ↋ = 11
Casos de teste:
['½','ↆ','ↂ','⅒','Ⅽ','⅑','ⅷ'] -> ['⅒','⅑','½','ⅷ','ↆ','Ⅽ','ↂ']
['¼','↋','↉','ↅ','⅐','⅟','Ⅻ','ⅺ'] -> ['↉','⅐','¼','⅟','ↅ','↋','ⅺ','Ⅻ']
['¼','½','¾','⅐','⅑','⅒','⅓','⅔','⅕','⅖','⅗','⅘','⅙','⅚','⅛','⅜','⅝','⅞','⅟'] -> ['⅒','⅑','⅛','⅐','⅙','⅕','¼','⅓','⅜','⅖','½','⅗','⅝','⅔','¾','⅘','⅚','⅞','⅟']
'⅞ⅾ↊ↄⅨⅮⅺↁⅸⅰⅩⅱⅶ¾ⅧↅↃ↋ↆ⅔ⅼⅲ⅘⅒ⅽⅦ⅕ⅤⅭⅳↂⅪⅬⅯↇⅠⅷ⅛Ⅵ½ⅵ¼ⅻ⅐Ⅱ⅜⅗⅝⅚Ⅳ⅓ⅴ↉ⅿⅫⅹↀↈ⅙⅑Ⅲ⅖⅟' -> '↉⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↄↃⅮⅾⅯⅿↀↁↂↇↈ'
['Ↄ','ↄ','↊','↋'] -> ['↊','↋','ↄ','Ↄ']
Observe que quatro dos símbolos (os usados no último caso) não são números unicode, embora ainda tenham um valor numérico, portanto, verifique antes de postar um built-in.
Regras:
- Se mais caracteres forem atribuídos a esse bloco no futuro, você não precisará atualizar seu código para suportá-los.
- A ordem dos caracteres com valores idênticos não importa.
- IO é flexível .
- A saída deve ser como os caracteres, não os valores numéricos
- As brechas padrão são proibidas.
- Não estou banindo built-ins que podem buscar o valor numérico de um caractere, mas também incentivo a adicionar uma resposta não incorporada, se possível.
- Isso é código-golfe , então a resposta mais curta em bytes para cada idioma vence! Boa sorte!
Respostas:
Python 3 ,
216213 bytes-3 bytes graças ao TFeld
Experimente online!
Com o built-in que busca o valor numérico, 111 bytes
Experimente online!
fonte
↉
do string (encontrar retornos-1
que é menor)Perl 6 , 57 bytes
Experimente online!
Apenas procura os quatro caracteres excepcionais em um hash ou volta ao
unival
método interno.fonte
05AB1E (legado) ,
192746361 bytes-118 bytes usando apenas caracteres da página de código do 05AB1E, portanto, não precisamos usar a codificação UTF-8.
-11 bytes graças a @Adnan .
-2 bytes graças a @Grimy .
Experimente online ou verifique todos os casos de teste .
Explicação:
Então o que é
•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+
?Com base na ordem dos caracteres módulo 100, obtemos a seguinte lista:
Eles são gerados pelo seguinte programa:
Experimente online.
•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+
é uma variação mais curta dessa lista, pegando o número compactado1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463
, convertendo-o em Base-65 e adicionando 26 a cada um.Experimente online e verifique se as listas são as mesmas .
fonte
"]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-
por•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Retina ,
193 bytes (UTF-8)Experimente online! Explicação: Classifica os caracteres na ordem do ponto de código e mapeia entre os caracteres numéricos e caracteres ASCII para que os caracteres numéricos com o valor mais baixo mapeiem os caracteres ASCII com o ponto de código mais baixo e vice-versa. Em seguida, repita o exercício, para que os caracteres agora sejam classificados na ordem desse mapeamento ASCII, que corresponde à ordem numérica desejada, antes de serem transformados novamente. Editar: salvou 100 bytes! Especificando a ordem dos caracteres ASCII em vez dos caracteres numéricos.
fonte
Geléia , 55 bytes
Um link monádico que aceita uma lista de caracteres que gera uma lista de caracteres.
Experimente online!
Quão?
Muito mais simples do que parece, uma vez que
“$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’
é apenas um grande número na base 250 usando a página de código de Jelly como dígitos, usarei“...’
em seu lugar.a parte, de lado
Um pouco ironicamente, o mais próximo de uma "usar uma abordagem interna" que eu poderia reunir era de 85 bytes , isso usa uma string compactada:
que é dividido em novas linhas e associado a
⁸
s para fornecer o código Python:que é executável no intérprete de Jelly - ele colocará o valor numérico do caractere Unicode no argumento esquerdo nilad,
⁸
para uso posterior.fonte
Japonês , 72 bytes
Experimente ou execute todos os casos de teste
Explicação
Codepoints
Solução original,
908988 bytesExperimente ou execute todos os casos de teste
Explicação
Codepoints
fonte
05AB1E,
565351504948 bytesExperimente online!
No centro desta solução está um código unicode de mapeamento de lista compactado que aponta para uma chave de classificação. Os caracteres que correspondem ao mesmo número são mapeados para a mesma chave, portanto, precisamos apenas de 40 chaves diferentes.
70 é o menor número pelo qual podemos modular todos os pontos de código de entrada e obter resultados distintos. Como a indexação no 05AB1E é completa, não precisamos explicitamente
70%
, apenas verifique se a lista tem o comprimento 70.Observe que há longos trechos de pontos de código consecutivos com chaves consecutivas. Assim, a codificação (chave - ponto de código), em vez de simplesmente (chave), fornece longos trechos de números idênticos, que podem ser codificados em toda a extensão. No entanto, o intervalo de pontos de código é muito grande (que seja 0xBC .. 0xBE), o que seria um problema. Então, em vez de (key - codepoint), codificamos (key - sum_of_digits (codepoint)), que infelizmente limita o comprimento do alongamento a 10, mas se sai muito bem em reduzir o intervalo de valores codificados. (Outras funções são obviamente possíveis, como codepoint% constante, mas a soma dos dígitos fornece os melhores resultados).
Além disso, a rotação da lista em 2 vezes é boa com a codificação de execução, então subtraímos 2 do ponto de código antes da indexação.
fonte
JavaScript (SpiderMonkey) , 117 bytes
Experimente online!
fonte
T-SQL, 207 bytes
O retorno no meio da sequência é apenas para legibilidade. Acho que obtive a contagem de bytes correta (3 dos caracteres numéricos são 1 byte, o restante é 2 bytes), a contagem de caracteres é 148.
Eu pré-classifiquei a sequência em ordem crescente, deixando de fora
↉
(que retorna 0) como sugerido por outras respostas.Qualquer agrupamento binário funcionará, eu usei,
Thai_BIN
pois ele tem o nome mais curto. (Um agrupamento no SQL prescreve como a classificação / comparação de caracteres é feita, preciso de binário para que cada caractere corresponda apenas a si mesmo.)De acordo com nossos padrões de IO , a entrada é obtida através da tabela t existente com o
NCHAR(1)
campo c .Se você definir a própria tabela de entrada usando um agrupamento binário, poderá deixar isso de fora para salvar 16 bytes:
fonte
⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋
se você estiver curioso) combinam entre si.Ruby , 77 bytes
Altera todos os caracteres para letras que representam os valores numéricos e as classificações por isso.
Experimente online!
fonte
Perl 6 ,
1352 bytesExperimente online!
fonte
*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}