Pecahan Unicode


21

Diberikan fraksi dalam format m/n(di mana m dan n adalah bilangan bulat coprime), menghasilkan fraksi Unicode yang sesuai. Program / fungsi Anda tidak akan menerima input apa pun yang tidak sesuai dengan karakter Unicode. Array, misalnya [2, 3]sebagai lawan 2/3, diterima. m / nsebagai lawan m/njuga baik-baik saja. Dua input terpisah mdan njuga valid.

Fraksi Unicode yang harus ditangani adalah sebagai berikut:

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

Dengan demikian, input yang mungkin adalah sebagai berikut:

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

Codepoint Unicode karakter adalah sebagai berikut:

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

Uji Kasus

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

Buat kode Anda sesingkat mungkin; ini kode golf.


Bisakah Anda menambahkan poin kode unicode untuk setiap fraksi?
Rod

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

Anda tidak akan diharapkan untuk mengizinkan input apa pun yang tidak sesuai dengan karakter unicode. Apakah itu berarti kita harus mendeteksi input yang tidak valid? Atau bahwa ini tidak seharusnya terjadi?
Arnauld

@Arnauld Yang terakhir.
user202729

Bisakah input menjadi objek yang mewakili sebagian kecil?
Brad Gilbert b2gills

Jawaban:


14

JavaScript (Node.js) , 78 77 byte

Disimpan 1 byte berkat @HermanLauenstein

Mengambil input dalam sintaks currying (m)(n).

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

Cobalah online!


@ user202729 Saya yakin saya menggunakan rumus serupa di tempat lain. Saya tidak ingat untuk tantangan yang mana. Sekarang, mungkin ada baiknya mencoba membuat karakter dengan String.fromCharCode(), tapi saya harapkan jumlah byte yang sama.
Arnauld


@HermanLauenstein Terima kasih! (Saya melewatkan yang itu karena saya awalnya hanya mencari modulo terkecil. Saya sudah beralih ke metode XOR ketika saya mulai menghapus slot kosong yang tertinggal.)
Arnauld

Dan jika Anda memposting jawaban Anda terlalu cepat, itu akan membuat kebanyakan orang menggunakan pendekatan Anda ...
user202729

12

Perl 6 ,  48  43 byte

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

Cobalah

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

Cobalah

Diperluas:

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

Perhatikan bahwa pencarian harus dipisah sehingga tidak mengembalikan karakter Unicode lain yang memiliki unival yang sama. (kalau tidak akan (1..*))


3
Tunggu, Perl 6 memiliki built-in untuk hal ini?
Erik the Outgolfer

2
@EriktheOutgolfer Saya tidak yakin itu cara melihatnya, tapi ya, Anda dapat mengakses nilai numerik titik kode yang tercermin di kolom ke-9 dari Unicode Character Database dalam file UnicodeData.txt. Misalnya, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSmemiliki properti karakter nv=11/12. Ada beberapa 1500 poin kode dengan nilai numerik yang tidak kosong — lebih dari tantangan kecil ini yang harus dipecahkan. Ini adalah bilangan bulat atau rasional.
tchrist

7

JavaScript (ES6), 88 86 84 81 79 byte

Disimpan 2 byte berkat @Arnauld

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

Tidak sesingkat jawaban JS yang lain, tetapi menyenangkan menghitung titik kode dari setiap fraksi secara matematis.

Cuplikan tes

Metode lama (82 byte):

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

Disimpan 4 byte yang satu ini berkat @Arnauld.


1
-2 byte pada kedua versi dengan-~'3 1'[n-6]
Arnauld

7

APL (Dyalog) , 88 64 byte

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

Cobalah online!

-3 Terima kasih kepada dzaima .

Menggunakan pendekatan 84-byte ETHproduk.

The f←disertakan pada TIO tidak dihitung, karena itu diletakkan di sana hanya untuk dapat menguji fungsi.


2

SOGL V0.12 , 51 byte

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

Coba Di Sini!

menggunakan pemetaan (m + n*5)%33%22

Penjelasan:

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 byte

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

Fungsi anonim yang mengambil input sebagai "1/2", dan mengembalikan karakter yang sesuai.

Pemetaan langsung dari Clojure Ratioke karakter pecahan. comp, dan fakta bahwa peta Clojure adalah fungsi yang sangat membantu di sini. Saya perlu meneruskan input string read-stringuntuk mengevaluasinya sebagai jenis rasio, karena itu memungkinkan saya untuk membuang semua kutipan kembung di peta. compbiarkan saya melakukan itu bebas poin, yang bagus. Kode "penuh" adalah:

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

Setelah mencari jawaban lain, saya menyadari bahwa pendekatan ini cukup naif. Saya mencari cara untuk memperbaikinya.



1

Arang , 77 48 46 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 29 31 byte dengan memetakan dari karakter ASCII ke karakter multi-byte. Penjelasan:

    “....”                  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 , 87 byte

lambda n:'⅛⅑⅜¾⅗⅔⅚⅖⅝⅘⅞⅒½⅓¼⅕⅙⅐'[int(n[::2])%50%36%31%18]

Cobalah online!

atau

lambda n:'⅝⅔⅜⅖__⅞¾⅗⅘_⅒½⅓¼⅕⅙⅐⅛⅑⅚'[int(n[::2])%36%27%22]

Cobalah online!



0

Vim Script, 67 byte

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

Fungsi ini bekerja dengan digraf Vim yang dimasukkan setelah memulai dengan ctrl-k.Rupanya, ctrl-kkarakter yang relevan setelah exe'normtidak diberikan dalam blok kode di atas.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.