Unicode-Brüche


21

Bei einem Bruch im Format m/n(wobei m und n Ganzzahlen sind) wird der entsprechende Unicode-Bruch ausgegeben. Von Ihrem Programm / Ihrer Funktion wird keine Eingabe erwartet, die keinem Unicode-Zeichen entspricht. Arrays, zB [2, 3]im Gegensatz zu 2/3, werden akzeptiert. m / nim gegensatz zu m/nist auch in ordnung. Zwei separate Eingänge mund nsind ebenfalls gültig.

Folgende Unicode-Brüche müssen behandelt werden:

½, ⅓, ⅔, ¼, ¾, ⅕, ⅖, ⅗, ⅘, ⅙, ⅚, ⅐, ⅛, ⅜, ⅝, ⅞, ⅑, ⅒

Somit sind die möglichen Eingaben wie folgt:

1/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, 1/6, 5/6, 1/7, 1/8, 3/8, 5/8, 7/8, 1/9, 1/10

Die Unicode-Codepunkte der Zeichen lauten wie folgt:

188 ¼
189 ½
190 ¾
8528 ⅐
8529 ⅑
8530 ⅒
8531 ⅓
8532 ⅔
8533 ⅕
8534 ⅖
8535 ⅗
8536 ⅘
8537 ⅙
8538 ⅚
8539 ⅛
8540 ⅜
8541 ⅝
8542 ⅞

Testfälle

1/2 -> ½
1/3 -> ⅓
2/3 -> ⅔
1/4 -> ¼
3/4 -> ¾
3/8 -> ⅜
1/10 -> ⅒

Machen Sie Ihren Code so kurz wie möglich. Das ist Code Golf.


Können Sie die Unicode-Codepunkte für jeden Bruch hinzufügen?
Rod

4
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
Undichte Nonne

Es wird nicht erwartet, dass Sie Eingaben zulassen, die keinem Unicode-Zeichen entsprechen. Bedeutet das, dass wir ungültige Eingaben erkennen müssen? Oder dass das nicht passieren soll?
Arnauld

@ Arnauld Letzterer.
user202729

Kann die Eingabe ein Objekt sein, das einen Bruch darstellt?
Brad Gilbert b2gills

Antworten:


14

JavaScript (Node.js) , 78.77 Byte

1 Byte dank @HermanLauenstein gespeichert

Übernimmt Eingaben in der Currying-Syntax (m)(n).

m=>n=>'¾⅗  ⅜    ⅞⅘½⅓¼⅕⅙⅐⅛⅑⅒⅚⅔⅝⅖'[(m*9+n)%31]

Probieren Sie es online!


@ user202729 Ich bin mir sicher, dass ich anderswo eine ähnliche Formel verwendet habe. Ich erinnere mich jedoch nicht, für welche Herausforderung. Nun könnte es sich lohnen, die Zeichen mit zu generieren String.fromCharCode(), aber ich würde eine ähnliche Anzahl von Bytes erwarten.
Arnauld


@HermanLauenstein Danke! (Das habe ich verpasst, weil ich anfangs nur nach dem kleinsten Modulo gesucht habe. Ich hatte bereits auf die XOR-Methode umgestellt, als ich anfing, leere Slots zu entfernen.)
Arnauld

Und wenn Sie Ihre Antwort zu früh veröffentlichen, werden die Leute meistens Ihren Ansatz verwenden ...
user202729

12

Perl 6 ,  48  43 Bytes

{chr first *.unival==$^m/$^n,(|^191,|(8528..*))}

Versuch es

{chr first *.unival==$_,(|^191,|(8528..*))}

Versuch es

Erweitert:

{  # bare block lambda with implicit parameter 「$_」
  chr

    first               # find the first value

      *.unival ==       # which has a unicode value that matches
          $_,           # the input fraction (as a Rational)

      (
        |^191,     # ¼(189) ½(188) ¾(190)
        |(8528..*) # all of the rest
      )
}

Beachten Sie, dass die Suche aufgeteilt werden muss, damit keine anderen Unicode-Zeichen mit derselben Univalität zurückgegeben werden. (sonst wäre es (1..*))


3
Warten, Perl 6 hat eine eingebaute in für diese genaue Sache?
Erik der Outgolfer

2
@EriktheOutgolfer Ich bin mir nicht sicher, ob das so ist, aber ja, Sie können auf den numerischen Wert des Codepunkts in der neunten Spalte aus der Unicode-Zeichendatenbank in der Datei zugreifen UnicodeData.txt. Zum Beispiel hat U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSdie Zeicheneigenschaft nv=11/12. Es gibt ungefähr 1500 Codepunkte mit nicht leeren numerischen Werten - mehr als diese kleine Herausforderung, nach der man suchen muss. Dies sind ganze Zahlen oder Rationen.
Tchrist

7

JavaScript (ES6), 88 86 84 81 79 Byte

2 Bytes dank @Arnauld eingespart

m=>n=>String.fromCharCode((4%n?8528:188)|"  130470912"[n]*1.3+~-m/-~"3 1"[n-6])

Nicht ganz so kurz wie die andere Antwort von JS, aber es hat Spaß gemacht, den Codepunkt jedes Bruchs mathematisch zu berechnen.

Testschnipsel

Alte Methode (82 Bytes):

m=>n=>String.fromCharCode((4%n?8539:189)-("0x"+"  08162b0a9"[n])+~-m/-~"3 1"[n-6])

Dank @Arnauld wurden hier 4 Bytes gespeichert.


1
-2 Bytes auf beiden Versionen mit-~'3 1'[n-6]
Arnauld

7

APL (Dyalog) , 88 64 Bytes

{⎕UCS(⌊(⍺-1)÷(1+⍵≡8)⌈4×⍵≡6)-(291194049⊤⍨1012)[⍵]-1898539××⍵|4}

Probieren Sie es online!

-3 danke an dzaima .

Mit dem 84-Byte-Ansatz von ETHproductions.

Der f←auf TIO enthaltene Wert wird nicht gezählt, da er dort abgelegt wird, um die Funktion testen zu können.


2

SOGL V0.12 , 51 Bytes

5*+'æ%'⁵%"∫}ΣS“LI─{"#!“+ζ}¹"¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼”W

Probieren Sie es hier aus!

verwendet das Mapping (m + n*5)%33%22

Erläuterung:

5*                        multiply the 1st input by 5
  +                       add to the 2nd input
   'æ%                    modulo 33
      '⁵%                 module 22

"∫}ΣS“                    push 2153527158
      LI─                 base 11 decode that - [10 0 5 6 7 8 9 1 2]
         {     }          for each of that
          "#!“+             add 8528
               ζ            and convert to a character
                "...”     push "¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼", replacing ŗ with each character of the above array
                     W    and get the (m + n*5)%33%22th item from that

2

Clojure, 127 Bytes

(comp{2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐ 3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}read-string)

Eine anonyme Funktion, die Eingaben als annimmt "1/2"und das entsprechende Zeichen zurückgibt.

Eine direkte Zuordnung von einem Clojure Ratiozu einem Bruchzeichen. compUnd die Tatsache, dass Clojure-Karten Funktionen sind, hat hier wirklich geholfen. Ich musste die Zeichenfolgeneingabe durchgeben read-string, um sie als Verhältnistyp auszuwerten, da ich so alle aufgeblähten Anführungszeichen in der Karte verwerfen konnte. complass mich das sinnlos machen, was schön war. Der "vollständige" Code wäre:

(defn to-unicode-fraction [frac]
  (get {2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐,
        3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}
       (read-string frac)))

Nachdem ich die anderen Antworten durchgesehen hatte, stellte ich fest, dass dieser Ansatz ziemlich naiv ist. Ich suche nach Verbesserungsmöglichkeiten.



1

Kohle , 77 48 46 Bytes

F§§⪪“YW³⦄Eν~vγ@⊖Xμ~?Iw⸿M➙b℅¦⦃”,NN℅⁺℅ι×⁹⁰∨№βι⁹⁴

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 29 bis 31 Byte durch Zuordnung von ASCII-Zeichen zu Multibyte-Zeichen gespeichert. Erläuterung:

    “....”                  Compressed string `R,EFcGbIMDO,H J,K  Pd,L,N Q,`
   ⪪      ,                 Split on commas
           N                First input
  §                         Circularly index
            N               Second input
 §                          Circularly index
F                           "Loop over" character (loop variable `i`)
                     №βι    Count of `i`s in lowercase letters
                    ∨   ⁹⁴  Replace zero result with 94
                 ×⁹⁰        Multiply by 90
               ℅ι           Take ordinal of `i`
              ⁺             Sum
             ℅              Convert back to character
                            Implicitly print


0

Python 3, 97 Bytes

lambda m,n:'½ ⅓⅔ ¼_¾ ⅕⅖⅗⅘ ⅙___⅚ ⅐ ⅛_⅜_⅝_⅞ ⅑ ⅒'.split()[n-2][m-1]

2
Dies scheint nicht zu funktionieren, Sie müssen [n-2][m-1]stattdessen.
Erik der Outgolfer

Richtig, ich glaube, ich habe es nicht zuerst getestet ...
Ryan McCampbell

0

Vim Script, 67 Bytes

fu!F(m,n)
if a:n==10|norm a⅒ 
else|exe'norm a'.a:m.a:n
endif
endfu

Die Funktion funktioniert mit Vim- Digraphen, die nach dem Starten eingegeben werden. ctrl-k.Offensichtlich wird das relevante ctrl-kZeichen nach dem exe'normim obigen Codeblock nicht gerendert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.