Fractions Unicode


21

Étant donné une fraction au format m/n(où m et n sont des entiers premiers), affichez la fraction Unicode correspondante. Votre programme / fonction ne sera pas censé accepter une entrée qui ne correspond pas à un caractère Unicode. Les tableaux, par exemple [2, 3]par opposition à 2/3, sont acceptés. m / npar opposition à m/nest également très bien. Deux entrées distinctes met nsont également valides.

Les fractions Unicode qui doivent être traitées sont les suivantes:

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

Ainsi, les entrées possibles sont les suivantes:

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

Les points de code Unicode des caractères sont les suivants:

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

Cas de test

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

Faites votre code aussi court que possible; c'est le golf de code.


Pouvez-vous ajouter les points de code unicode pour chaque fraction?
Rod

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

Vous ne serez pas censé autoriser toute entrée ne correspondant pas à un caractère unicode. Est-ce à dire que nous devons détecter les entrées invalides? Ou que ce n'est pas censé se produire?
Arnauld

@Arnauld Le dernier.
user202729

L'entrée peut-elle être un objet qui représente une fraction?
Brad Gilbert b2gills

Réponses:


14

JavaScript (Node.js) , 78 77 octets

1 octet enregistré grâce à @HermanLauenstein

Prend une entrée dans la syntaxe de curry (m)(n).

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

Essayez-le en ligne!


@ user202729 Je suis sûr que j'ai utilisé une formule similaire ailleurs. Je ne me souviens pas pour quel défi, cependant. Maintenant, cela peut valoir la peine d'essayer de générer les caractères avec String.fromCharCode(), mais je m'attends à un nombre d'octets similaire.
Arnauld


@HermanLauenstein Merci! (J'ai manqué celui-là parce que je cherchais initialement le plus petit modulo. J'étais déjà passé à la méthode XOR lorsque j'ai commencé à supprimer les emplacements vides de fin.)
Arnauld

Et si vous postez votre réponse trop tôt, cela
incitera les

12

Perl 6 ,  48  43 octets

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

Essayez-le

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

Essayez-le

Étendu:

{  # 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
      )
}

Notez que la recherche doit être divisée afin qu'elle ne renvoie pas d'autres caractères Unicode qui ont le même unival. (sinon ce serait (1..*))


3
Attendez, Perl 6 a un intégré pour cette chose exacte?
Erik the Outgolfer

2
@EriktheOutgolfer Je ne suis pas sûr que c'est tout à fait comme ça, mais oui, vous pouvez accéder à la valeur numérique du point de code reflétée dans la 9ème colonne à partir de la base de données de caractères Unicode dans le fichier UnicodeData.txt. Par exemple, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSa la propriété de caractère nv=11/12. Il y a environ 1 500 points de code avec des valeurs numériques non vides - un peu plus que ce petit défi demande à résoudre. Ce sont des nombres entiers ou des rationnels.
tchrist

7

JavaScript (ES6), 88 86 84 81 79 octets

Sauvegardé 2 octets grâce à @Arnauld

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

Pas aussi court que l'autre réponse JS, mais c'était amusant de calculer mathématiquement le point de code de chaque fraction.

Extrait de test

Ancienne méthode (82 octets):

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

Sauvegardé 4 octets sur celui-ci grâce à @Arnauld.


1
-2 octets sur les deux versions avec-~'3 1'[n-6]
Arnauld

7

APL (Dyalog) , 88 64 octets

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

Essayez-le en ligne!

-3 merci à dzaima .

Utilisation de l'approche 84 octets d'ETHproductions.

L' f←inclus sur TIO n'est pas compté, car il est mis là juste pour pouvoir tester la fonction.


2

SOGL V0.12 , 51 octets

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

Essayez-le ici!

utilise la cartographie (m + n*5)%33%22

Explication:

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 octets

(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)

Une fonction anonyme qui accepte l'entrée "1/2"et renvoie le caractère correspondant.

Un mappage direct d'un Clojure Ratioà un caractère de fraction. comp, et le fait que les cartes Clojure soient des fonctions vraiment utiles ici. J'avais besoin de passer la chaîne read-stringpour l'évaluer en tant que type de rapport, car cela me permet de supprimer toutes les citations de ballonnement dans la carte. comppermettez-moi de le faire sans point, ce qui était bien. Le code "complet" serait:

(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)))

Après avoir regardé les autres réponses, j'ai réalisé que cette approche était assez naïve. Je cherche des moyens de l'améliorer.



1

Fusain , 77 48 46 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Edit: enregistré 29 31 octets en mappant des caractères ASCII aux caractères multi-octets. Explication:

    “....”                  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 octets

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

2
Cela ne semble pas fonctionner, vous avez besoin à la [n-2][m-1]place.
Erik the Outgolfer

Bon, je suppose que je ne l'ai pas testé en premier ...
Ryan McCampbell

0

Script Vim, 67 octets

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

La fonction fonctionne avec les digraphes de Vim qui sont entrés après leur démarrage. ctrl-k.Apparemment, le ctrl-kcaractère pertinent après le exe'normn'est pas rendu dans le bloc de code ci-dessus.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.