Sorta di numeri


21

All'interno dei recessi dei caratteri Unicode, esiste un blocco Unicode di (attualmente) 63 caratteri chiamato "Number Forms", che consiste di caratteri che hanno valori numerici come il numero romano Ⅻ, frazioni volgari come ⅑ o ↉ o strani come ↊ (10) o ↈ (100000).

Il tuo compito è scrivere un programma o una funzione che, quando viene fornito un elenco di caratteri Unicode assegnati all'interno di questo blocco, ordina l'elenco in base ai valori numerici di ciascun carattere.

Un elenco (ordinabile) di caratteri e valori è disponibile sulla pagina di Wikipedia .

Per essere autonomi, ecco un elenco dei punti di codice e dei loro valori:

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

Casi test:

['½','ↆ','ↂ','⅒','Ⅽ','⅑','ⅷ'] -> ['⅒','⅑','½','ⅷ','ↆ','Ⅽ','ↂ']

['¼','↋','↉','ↅ','⅐','⅟','Ⅻ','ⅺ'] -> ['↉','⅐','¼','⅟','ↅ','↋','ⅺ','Ⅻ']

['¼','½','¾','⅐','⅑','⅒','⅓','⅔','⅕','⅖','⅗','⅘','⅙','⅚','⅛','⅜','⅝','⅞','⅟'] -> ['⅒','⅑','⅛','⅐','⅙','⅕','¼','⅓','⅜','⅖','½','⅗','⅝','⅔','¾','⅘','⅚','⅞','⅟']

'⅞ⅾ↊ↄⅨⅮⅺↁⅸⅰⅩⅱⅶ¾ⅧↅↃ↋ↆ⅔ⅼⅲ⅘⅒ⅽⅦ⅕ⅤⅭⅳↂⅪⅬⅯↇⅠⅷ⅛Ⅵ½ⅵ¼ⅻ⅐Ⅱ⅜⅗⅝⅚Ⅳ⅓ⅴ↉ⅿⅫⅹↀↈ⅙⅑Ⅲ⅖⅟' -> '↉⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↄↃⅮⅾⅯⅿↀↁↂↇↈ'

['Ↄ','ↄ','↊','↋'] -> ['↊','↋','ↄ','Ↄ']

Nota che quattro dei simboli (quelli usati nell'ultimo caso) non sono numeri unicode, sebbene abbiano ancora un valore numerico, quindi assicurati di controllare prima di pubblicare solo un built-in.

Regole:

  • Se in futuro verranno assegnati altri caratteri a questo blocco, non sarà necessario aggiornare il codice per supportarli.
  • L'ordine dei caratteri con valori identici non ha importanza.
  • IO è flessibile .
    • L'output deve essere come i caratteri, non i valori numerici
  • Sono vietate le scappatoie standard .
  • Non sto vietando gli incorporamenti che possono recuperare il valore numerico di un personaggio, ma incoraggio anche l'aggiunta di una risposta non incorporata, se possibile.
  • Questo è , quindi vince la risposta più breve in byte per ogni lingua! In bocca al lupo!

9
Monospacing RIP :(
Jo King

Risposte:


6

Python 3 , 216 213 byte

-3 byte grazie a TFeld

lambda l:sorted(l,key='⅒⅑⅐⅙⅕¼⅓⅖½⅗⅔¾⅘⅚⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↃↄ⅛⅜Ⅾⅾ⅝⅞Ⅿⅿↀↁↂↇↈ'.find)

Provalo online!

Con built-in che recupera il valore numerico, 111 byte

lambda l:sorted(l,key=lambda c:[10,11,100,100,0]['↊↋Ↄↄ'.find(c)]or numeric(c))
from unicodedata import*

Provalo online!


4
Puoi salvare 3 byte rimuovendoli dalla stringa (trova i rendimenti -1più piccoli)
TFeld

4

Perl 6 , 57 byte

*.sort: {%(<Ↄ 100 ↄ 100 ↊ 10 ↋ 11>){$_}//.unival}

Provalo online!

Cerca solo i quattro personaggi eccezionali in un hash o torna al univalmetodo integrato .


Non è necessario lo spazio dopo i due punti. Inoltre, il tuo link è ancora in un blocco di codice piuttosto che in qualunque lambda
Jo King

4

05AB1E (legacy) , 192 74 63 61 byte

Σ•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+sÇт%k

-118 byte utilizzando solo i caratteri della tabella codici 05AB1E, quindi non è necessario utilizzare la codifica UTF-8.
-11 byte grazie a @Adnan .
-2 byte grazie a @Grimy .

Provalo online o verifica tutti i casi di test .

Spiegazione:

Σ            # Sort the input by:
 Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
 ,λ₂ϦP(Ì•65в₂+
             #  List of ASCII values modulo-100 of the characters we want to sort
 sÇ          #  Get the ASCII value of the current input-character
   т%        #  Take modulo 100 of this ASCII value
 k           #  And get the index in the list of ASCII values, as sorting order

Quindi cos'è •Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+?

In base all'ordine dei caratteri modulo-100 otteniamo il seguente elenco:

[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]

Questi sono generati dal seguente programma:

"↉⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↃↄⅮⅾⅯⅿↀↁↂↇↈ"Çт%

Provalo online.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+è una variante più breve di questo elenco prendendo il numero compresso 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463 , quindi convertendolo in Base-65 e quindi aggiungendo 26 a ciascuno.

Provalo online e verifica che gli elenchi siano gli stessi .


1
Sì, non tutti questi caratteri hanno la codifica 05AB1E, quindi sarebbero 192 byte.
Okx,

2
Sì, non è possibile rappresentare questo codice come un file a 68 byte che ci costringe a tornare a UTF-8, che è effettivamente 192 byte .
Adnan,

1
@JoKing Quindi, ora sto usando solo personaggi della code page di 05AB1E. ;) Ancora un approccio noioso, ma vedrò se riesco a trovare una sorta di modello aritmetico.
Kevin Cruijssen,

1
Penso che puoi sostituire "]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-con•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan il

1
Hmm, sembra essere un errore di analisi che non registra la parentesi di chiusura. Esaminerò questo.
Adnan,

3

Retina , 1 93 byte (UTF-8)

2{O`.
T`¼-¾⅐-↋\LI ^]Q@TU\\[ZYWSPNK\HFDB?=;975X\VR\OMJG\ECA><:86432\-)#1%0,*&.(!"$/+'`Ro

Provalo online! Spiegazione: ordina i caratteri nell'ordine dei punti di codice, quindi mappa tra i caratteri numerici e i caratteri ASCII in modo che i caratteri numerici con il valore più basso mappino i caratteri ASCII con il punto di codice più basso e viceversa. Quindi ripete l'esercizio, in modo che i personaggi siano ora ordinati in base a questa mappatura ASCII, che corrisponde all'ordine numerico desiderato, prima di essere riconvertiti. Modifica: salvato 100 (!) Byte specificando l'ordine dei caratteri ASCII anziché i caratteri numerici.


3

Gelatina , 55 byte

O%70‘“$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’Œ?¤iµÞ

Un collegamento monadico che accetta un elenco di caratteri che produce un elenco di caratteri.

Provalo online!

Come?

Molto più semplice di quanto sembri, dato che “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’è solo un gran numero nella base 250 che usa la tabella codici di Jelly come cifre, che userò “...’al suo posto.

O%70‘“...’Œ?¤iµÞ - Link: list of characters
               Þ - sort by:
              µ  -   the monadic function (i.e. f(character)):
O                -     get the ordinal value of the character
 %70             -     modulo by 70 (get the remainder after dividing by 70)
                 -       - giving integers in [0,69] excluding [52,58]
    ‘            -     increment (below code pattern can't have anything but '↉' map to 0)
            ¤    -     nilad followed by link(s) as a nilad:
     “...’       -       literal 7826363328008670802853323905140295872014816612737076282224746687856347808481112431487214423845098801
          Œ?     -       get the permutation of natural numbers [1,N] with minimal N such
                 -         that this permutation would reside at the given index in a
                 -         sorted list of all permutations of those same numbers
                 -         -> [46,52,53,54,55,56,57,58,61,60,70,59,68,64,49,62,1,65,50,66,2,63,51,67,69,3,4,5,21,6,22,7,23,8,24,9,25,10,26,42,11,27,12,28,13,29,14,30,47,15,31,48,16,32,17,33,43,18,34,40,41,19,35,20,36,37,38,39,44,45]
             i   -     first index of (the ordinal mod 70 plus 1) in that list

A parte

Un po 'ironicamente il più vicino a un "uso di un approccio integrato" che ho potuto raccogliere era di 85 byte , questo utilizza una stringa compressa:

from unicodedata import*; copy_to( atoms['
'], numeric( atoms['
'].call()))

che è diviso su newline e unito a s per dare il codice Python:

from unicodedata import*; copy_to( atoms['⁸'], numeric( atoms['⁸'].call()))

che è eseguibile nell'interprete di Jelly - inserirà il valore numerico del personaggio Unicode nell'argomento sinistro nilad, per un uso successivo.


3

Japt , 72 byte

ñ@`'%!x("y#) z$&*+,<-=.>/?0@1aq2b3c4d5ev6fw7g8hr9iop:j;klmn¡`u bXcuL

Provalo o esegui tutti i casi di test


Spiegazione

ñ@                 :Sort by passing each X through a function
  `...`            :  A compressed string, which itself contains a bunch of unprintables (See below for codepoints of original string)
       u           :  Uppercase
         b         :  Index of
          Xc       :   Charcode of X
            uL     :   Mod 100 and get character at that codepoint

codepoints

30,29,39,28,37,33,120,31,40,34,121,35,41,32,122,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,97,113,50,98,51,99,52,100,53,101,118,54,102,119,55,103,56,104,114,57,105,111,112,58,106,59,107,108,109,110,115,116

Soluzione originale, 90 89 88 byte

ñ!b`(&" )#$*!%'+,-=.>/?0@1a2br3c4d5e6fw7gx8h9:jpq;k<lmÍ/`®iv u nLõd)dÃi6'¼ iA'½ iE'¾

Provalo o esegui tutti i casi di test


Spiegazione

   `...`                                :A compressed string, which itself contains a bunch of unprintables (See below for codepoints of original string)
        ®                               :Map
         iv                             :  Prepend "v"
            u                           :  Convert to uppercase
               Lõ                       :  Range [1,100]
                 d                      :  Characters at those codepoints
              n   )                     :  Convert from that base to base-10
                   d                    :  Get the character at that codepoint
                    Ã                   :End map
                     i6'¼               :Insert "¼" at (0-based) index 6
                          iA'½          :Insert "½" at index 10
                               iE'¾     :Insert "¾" at index 14
ñ                                       :Sort the input array
 !b                                     :  By finding the index of the current element in the string above

codepoints

31,30,40,29,38,34,32,41,35,36,42,33,37,39,43,44,45,61,46,62,47,63,48,64,49,97,50,98,114,51,99,52,100,53,101,54,102,119,55,103,120,56,104,57,105,115,58,106,112,113,59,107,60,108,109,110,111,116,117

3

05AB1E, 56 53 51 50 49 48 byte

ΣÇ©1ö•Ω‘~Èr–Õî5®Î¼ÓÂ∍_OûR•42в•мjāl†£•₂°*S>ÅΓ®Íè+

Provalo online!

Al centro di questa soluzione c'è un elenco compresso che associa il codice unicode a una chiave di ordinamento. I caratteri che corrispondono allo stesso numero sono associati alla stessa chiave, quindi abbiamo bisogno solo di 40 chiavi diverse.

70 è il numero più piccolo con cui possiamo modulare tutti i punti di codice di input e ottenere risultati distinti. Poiché l'indicizzazione in 05AB1E termina, non è necessario esplicitamente70% , basta assicurarsi che l'elenco abbia una lunghezza 70.

Si noti che esistono lunghi tratti di punti di codice consecutivi con tasti consecutivi. Pertanto, la codifica (chiave - punto di codice) anziché semplicemente (chiave) fornisce lunghi tratti di numeri identici, che possono essere codificati per la lunghezza della corsa. Tuttavia, l'intervallo di punti di codice è molto ampio (maledetto quelli 0xBC .. 0xBE), il che sarebbe un problema. Quindi invece di (key - codepoint), codifichiamo (key - sum_of_digits (codepoint)), che purtroppo limita la lunghezza di stiramento a 10, ma fa abbastanza bene a ridurre l'intervallo di valori codificati. (Naturalmente sono possibili altre funzioni, come la costante% punto di codice, ma la somma delle cifre fornisce i risultati migliori).

Inoltre, risulta che la rotazione della lista di 2 gioca bene con la codifica run-length, quindi sottraggiamo 2 dal punto di codice prima dell'indicizzazione.

•Ω‘~Èr–Õî5®Î¼ÓÂ∍_OûR•42в    # compressed list [25, 34, 27, 36, 30, 38, 29, 35, 41, 0, 28, 16, 19, 31, 7, 4, 11, 17, 22, 13, 16, 17, 20, 8, 19, 4, 18, 21]
•мjāl†£•                    # compressed integer 79980000101007
        ₂°*                 # times 10**26
           S                # split to a list of digits
            >               # add 1 to each
             ÅΓ             # run-length decode, using the first list as elements and the second list as lengths

Σ                           # sort by
 Ç©1ö                       # sum of digits of the codepoint
           +                # plus
     ...  è                 # the element of the run-length decoded list
        ®Í                  # with index (codepoint - 2) % 70


1

T-SQL, 207 byte

SELECT*FROM t ORDER BY
CHARINDEX(c,N'⅒⅑⅛⅐⅙⅕¼⅓⅜⅖½⅗⅝⅔¾⅘⅚⅞⅟ⅠⅰⅡⅱⅢⅲⅣⅳⅤⅴⅥ
              ⅵↅⅦⅶⅧⅷⅨⅸⅩⅹ↊Ⅺⅺ↋ⅫⅻⅬⅼↆⅭⅽↃↄⅮⅾⅯⅿↀↁↂↇↈ'COLLATE Thai_BIN)

Il ritorno nel mezzo della stringa è solo per leggibilità. Penso che il conteggio dei byte sia corretto (3 dei caratteri numerici sono 1 byte, il resto è 2 byte), il conteggio dei caratteri è 148.

Ho preordinato la stringa in ordine crescente, tralasciando (che restituisce 0) come suggerito da altre risposte.

Qualsiasi confronto binario funzionerà, l'ho usato Thai_BINpoiché ha il nome più breve. (Un confronto in SQL prescrive come viene eseguito l'ordinamento / confronto dei caratteri, ho bisogno di un file binario in modo che ogni personaggio corrisponda solo a se stesso.)

Secondo i nostri standard I / O , l'input viene preso tramite la tabella t preesistente con il NCHAR(1)campo c .

Se si definisce la tabella di input stessa utilizzando un confronto binario, è possibile lasciarla fuori per salvare 16 byte:

CREATE TABLE t(c NCHAR(1) COLLATE Thai_BIN)

Quali personaggi si abbinerebbero se non si usassero le regole di confronto binarie?
Neil,

1
@Neil Bene, dipende da quale altra collazione usi, in realtà! :). Quello più ovvio che ho notato (usando il mio server predefinito di SQL_Latin1_General_SP1_CI_AS) è stato che i numeri romani maiuscoli e minuscoli si combaciano. Che .... hmm ... potrebbe effettivamente funzionare per me qui, dal momento che si risolvono allo stesso numero. Ma se il nome della collazione è molto più lungo, ciò contrasta i risparmi. BRB, devo provare ancora ...
BradC,

1
@Neil No, non va bene. Con le regole di confronto non binarie, 10 dei personaggi meno comuni ( ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋se sei curioso) si abbinano tra loro.
BradC,

Ah, è un peccato, ma grazie per avermelo fatto notare!
Neil,

1

Rubino , 77 byte

Cambia tutti i caratteri in lettere che rappresentano i valori e gli ordinamenti numerici.

->a{a.sort_by{|e|e.tr'¼-¾⅐-↋','HLPECBIOGKMQFRDJNSaa-pa-ppqrnnfmstAjk'}}

Provalo online!


1

Perl 6 , 13 52 byte

*.sort:{%(<Ↄ 99  99  10  11>){$_}//.EVAL}

Provalo online!


2
L'uso di eval non è un imbroglio, ma questo semplicemente non risolve la sfida. 52 che funziona davvero:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.