Art der Zahlen

21

Innerhalb der Aussparungen von Unicode-Zeichen gibt es einen Unicode-Block mit (derzeit) 63 Zeichen mit dem Namen "Zahlenformen", der aus Zeichen besteht, die numerische Werte wie die römische Ziffer Ⅻ, vulgäre Brüche wie ⅑ oder ↉ oder seltsame wie haben ↊ (10) oder ↈ (100000).

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei Angabe einer Liste zugewiesener Unicode-Zeichen in diesem Block die Liste nach den numerischen Werten der einzelnen Zeichen sortiert.

Eine (sortierbare) Liste von Zeichen und Werten finden Sie auf der Wikipedia-Seite .

Um in sich abgeschlossen zu sein, finden Sie hier eine Liste der Codepunkte und ihrer Werte:

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

Testfälle:

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

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

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

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

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

Beachten Sie, dass vier der Symbole (die im letzten Fall verwendeten) keine Unicode-Zahlen sind, obwohl sie immer noch einen numerischen Wert haben. Überprüfen Sie dies also, bevor Sie nur ein eingebautes Symbol veröffentlichen.

Regeln:

  • Wenn diesem Block in Zukunft weitere Zeichen zugewiesen werden, müssen Sie Ihren Code nicht mehr aktualisieren, um sie zu unterstützen.
  • Die Reihenfolge der Zeichen mit identischen Werten spielt keine Rolle.
  • IO ist flexibel .
    • Die Ausgabe muss jedoch als Zeichen erfolgen, nicht als Zahlenwert
  • Standardlücken sind verboten.
  • Ich verbiete keine eingebauten Funktionen, mit denen der numerische Wert eines Zeichens abgerufen werden kann, empfehle jedoch, wenn möglich auch eine nicht eingebaute Antwort hinzuzufügen.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes für jede Sprache! Viel Glück!
Scherzen
quelle
9
RIP Monospacing :(
Jo King

Antworten:

6

Python 3 , 216 213 Bytes

-3 Bytes dank TFeld

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

Probieren Sie es online!

Mit eingebautem, der den numerischen Wert abruft, 111 Bytes

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

Probieren Sie es online!

Stange
quelle
4
Sie können 3 Bytes einsparen, indem Sie sie aus der Zeichenfolge entfernen (Rückgabe suchen, -1die am kleinsten ist)
TFeld
4

Perl 6 , 57 Bytes

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

Probieren Sie es online!

Schlägt einfach die vier außergewöhnlichen Zeichen in einem Hash nach oder greift auf die integrierte univalMethode zurück.

Sean
quelle
Sie brauchen kein Leerzeichen nach dem Doppelpunkt. Außerdem befindet sich Ihr Link immer noch in einem Codeblock und nicht in einem Whatever Lambda
Jo King,
4

05AB1E (Legacy) , 192 74 63 61 Bytes

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

-118 Byte, wobei nur die Zeichen der Codepage von 05AB1E verwendet werden, sodass keine UTF-8-Codierung erforderlich ist.
-11 Bytes dank @Adnan .
-2 Bytes dank @Grimy .

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

Σ            # 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

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

Basierend auf der Reihenfolge der Zeichen modulo-100 erhalten wir die folgende Liste:

[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]

Diese werden vom folgenden Programm generiert:

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

Probieren Sie es online aus.

•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ\n,λ₂ϦP(Ì•65в₂+ist eine kürzere Variante dieser Liste, bei der die komprimierte Zahl 1485725021600091112740267145165274006958935956446028449609419704394607952161907963838640094709317691369972842282463 in Base-65 konvertiert und dann zu jeder 26 addiert wird.

Probieren Sie es online aus und stellen Sie sicher, dass die Listen identisch sind .

Kevin Cruijssen
quelle
1
Ja, nicht alle diese Zeichen sind in der Codierung von 05AB1E enthalten, das wären also 192 Byte.
Okx
2
Ja, es ist nicht möglich, diesen Code als 68-Byte-Datei darzustellen, wodurch wir gezwungen sind, auf UTF-8 zurückzugreifen, was in der Tat 192 Byte entspricht .
Adnan
1
@JoKing Jetzt verwende ich nur noch Zeichen aus der Codepage von 05AB1E. ;) Immer noch ein langweiliger Ansatz, aber ich werde sehen, ob ich eine Art Rechenmuster finden kann.
Kevin Cruijssen
1
Ich denke, Sie können "]&%/$-)`'0*a+1(b,.234D5E6F7G8H9IY:J;K<L=M^>N_?O@PZAQWXBRCSTUV[\"Ç8-mit•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
Adnan
1
Hmm, das scheint ein Parsing-Fehler zu sein, der die schließende Klammer nicht registriert. Ich werde das untersuchen.
Adnan
3

Retina , 1 93 Byte (UTF-8)

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

Probieren Sie es online! Erläuterung: Sortiert die Zeichen in der Codepunktreihenfolge und ordnet sie dann zwischen den numerischen Zeichen und den ASCII-Zeichen zu, sodass die numerischen Zeichen mit dem niedrigsten Wert die ASCII-Zeichen mit dem niedrigsten Codepunkt zuordnen und umgekehrt. Wiederholen Sie dann die Übung, sodass die Zeichen nun in der Reihenfolge dieser ASCII-Zuordnung sortiert werden, die der gewünschten numerischen Reihenfolge entspricht, bevor sie zurücktransformiert werden. Bearbeiten: Speichert 100 (!) Bytes, indem die Reihenfolge der ASCII-Zeichen anstelle der numerischen Zeichen angegeben wird.

Neil
quelle
3

Jelly , 55 Bytes

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

Ein monadischer Link, der eine Liste von Zeichen akzeptiert, die eine Liste von Zeichen ergibt.

Probieren Sie es online!

Wie?

Viel einfacher als es aussieht, da “$Żz*ṀḢD⁹VṢaʠƝ lẹkƝʋ9⁽ƭXmż4#⁺3ç%|ọṢLxƈ⁽}ÞƇ2’nur eine große Zahl in der Basis 250 ist, die Jellys Codepage als die Ziffern verwendet, die ich “...’an ihrer Stelle verwenden werde.

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

Beiseite

Etwas ironischerweise war das, was ich einem "Verwenden eines eingebauten Ansatzes" am nächsten bringen konnte, 85 Bytes , dies verwendet eine komprimierte Zeichenfolge:

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

Das wird in Zeilenumbrüche aufgeteilt und mit s verbunden, um den Python-Code zu erhalten:

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

Dies ist in Jellys Interpreter ausführbar. Der numerische Wert des Unicode-Zeichens wird zur späteren Verwendung im linken Argument nilad abgelegt .

Jonathan Allan
quelle
3

Japt , 72 Bytes

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

Probieren Sie es aus oder führen Sie alle Testfälle aus


Erläuterung

ñ@                 :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

Ursprüngliche Lösung, 90 89 88 Bytes

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

Probieren Sie es aus oder führen Sie alle Testfälle aus


Erläuterung

   `...`                                :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
Zottelig
quelle
3

05AB1E, 56 53 51 50 49 48 Bytes

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

Probieren Sie es online!

Kern dieser Lösung ist eine komprimierte Liste, die Unicode-Codepunkte auf einen Sortierschlüssel abbildet. Zeichen, die der gleichen Nummer entsprechen, werden dem gleichen Schlüssel zugeordnet, sodass wir nur 40 verschiedene Schlüssel benötigen.

70 ist die kleinste Zahl, mit der wir alle Eingabecodepunkte modulieren und eindeutige Ergebnisse erzielen können. Da die Indizierung in 05AB1E einen Umbruch darstellt, müssen wir nicht explizit 70%sicherstellen, dass die Liste die Länge 70 hat.

Beachten Sie, dass es lange Strecken aufeinanderfolgender Codepunkte mit aufeinanderfolgenden Schlüsseln gibt. Die Codierung (Schlüssel - Codepunkt) anstelle der einfachen Codierung (Schlüssel) ergibt also lange Strecken mit identischen Zahlen, die lauflängencodiert werden können. Der Bereich der Codepunkte ist jedoch sehr groß (verdammt die 0xBC .. 0xBE), was ein Problem darstellen würde. Anstelle von (key - codepoint) wird also (key - sum_of_digits (codepoint)) codiert, wodurch die Dehnungslänge leider auf 10 begrenzt wird, der Bereich der codierten Werte jedoch recht gut reduziert wird. (Andere Funktionen sind natürlich möglich, wie Codepunkt% Konstante, aber die Summe der Ziffern liefert die besten Ergebnisse).

Außerdem hat sich herausgestellt, dass die Liste bei der Lauflängencodierung gut um 2 gedreht werden kann. Daher subtrahieren wir vor der Indizierung 2 vom Codepunkt.

•Ω‘~È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
Grimmig
quelle
1

T-SQL, 207 Bytes

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

Die Rückgabe in der Mitte der Zeichenfolge dient nur der Lesbarkeit. Ich glaube, ich habe die Anzahl der Bytes richtig (3 der numerischen Zeichen sind 1 Byte, der Rest sind 2 Byte), die Anzahl der Zeichen ist 148.

Ich habe die Zeichenfolge in aufsteigender Reihenfolge vorsortiert und dabei den Wert 0 ausgelassen, wie in anderen Antworten vorgeschlagen.

Jede binäre Kollatierung funktioniert, ich habe sie verwendet, Thai_BINda sie den kürzesten Namen hat. (Eine Sortierung in SQL schreibt vor, wie das Sortieren / Vergleichen von Zeichen erfolgt. Ich benötige Binärdateien, damit jedes Zeichen nur mit sich selbst übereinstimmt.)

Gemäß unseren IO-Standards erfolgt die Eingabe über die bereits vorhandene Tabelle t mit NCHAR(1)Feld c .

Wenn Sie die Eingabetabelle selbst mit einer binären Kollatierung definieren, können Sie dies weglassen, um 16 Bytes zu sparen:

CREATE TABLE t(c NCHAR(1) COLLATE Thai_BIN)
BradC
quelle
Welche Zeichen stimmen überein, wenn Sie keine binäre Sortierung verwenden?
Neil
1
@Neil Nun, hängt davon ab, welche andere Kollatierung Sie tatsächlich verwenden! :). Das offensichtlichste Problem, das mir aufgefallen ist (unter Verwendung des Standardservers von SQL_Latin1_General_SP1_CI_AS), ist, dass die römischen Ziffern in Groß- und Kleinbuchstaben übereinstimmen. Welches .... hmm ... könnte hier tatsächlich für mich funktionieren , da sie sich auf die gleiche Nummer auflösen. Wenn der Kollatierungsname jedoch viel länger ist, wirkt dies den Einsparungen entgegen. BRB,
ich
1
@ Neil Nein, nicht gut. Bei nicht-binären Kollatierungen ⅐⅑⅒Ↄↄↅↆↇↈ↉↊↋stimmen 10 der weniger verbreiteten Zeichen ( wenn Sie neugierig sind) miteinander überein.
BradC
Ah, das ist eine Schande, aber danke, dass du mich informiert hast!
Neil
1

Ruby , 77 Bytes

Ändert alle Zeichen in Buchstaben, die die numerischen Werte darstellen, und sortiert sie danach.

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

Probieren Sie es online!

Wert Tinte
quelle
1

Perl 6 , 13 52 Bytes

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

Probieren Sie es online!

bb94
quelle
2
Das Verwenden von eval ist kein Betrug, aber dies löst die Herausforderung einfach nicht. 52 das funktioniert tatsächlich:*.sort:{%(<Ↄ 99 ↄ 99 ↊ 10 ↋ 11>){$_}//.EVAL}
Grimmy