Фракції Unicode


21

З огляду на дріб у форматі m/n(де m і n - цілі числа копрімерів), виведіть відповідну фракцію Unicode. Не очікується, що ваша програма / функція буде приймати будь-які дані, які не відповідають символу Unicode. Масиви, наприклад [2, 3], на відміну від 2/3, приймаються. m / nна противагу - m/nце також добре. Два окремі входи mі nтакож дійсні.

Фракції Unicode, якими потрібно обробити, є такі:

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

Таким чином, можливі входи такі:

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

Кодові точки символів Unicode такі:

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

Випробування

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

Зробіть свій код якомога коротшим; це код гольфу.


Чи можете ви додати кодові точки Unicode для кожного дробу?
Прут

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

Від вас не очікується дозволити будь-який ввід, який не відповідає символу unicode. Чи означає це, що ми повинні виявляти недійсні дані? Або що це не повинно статися?
Арнольд

@Arnauld Останнє.
користувач202729

Чи може вхід бути об’єктом, який представляє дріб?
Бред Гілберт b2gills

Відповіді:


14

JavaScript (Node.js) , 78 77 байт

Збережено 1 байт завдяки @HermanLauenstein

Здійснює введення в синтаксис currying (m)(n).

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

Спробуйте в Інтернеті!


@ user202729 Я впевнений, що я використовував подібну формулу в інших місцях. Я не пам’ятаю, для якого виклику. Тепер, можливо, варто спробувати згенерувати символи String.fromCharCode(), але я б очікував, що подібне число байтів.
Арнольд


@HermanLauenstein Дякую! (Я пропустив цю, тому що спочатку просто шукав найменший модуль. Я вже перейшов на метод XOR, коли почав видаляти кінцеві порожні прорізи.)
Арнольд

І якщо ви опублікуєте свою відповідь занадто рано, це змусить людей переважно використовувати ваш підхід ...
user202729

12

Perl 6 ,  48  43 байт

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

Спробуй це

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

Спробуй це

Розширено:

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

Зауважте, що пошук має бути розділений, щоб він не повертав інші символи Unicode, які мають той самий універсал. (інакше було б (1..*))


3
Зачекайте, Perl 6 має вбудовану саме цю річ?
Ерік Аутгольфер

2
@EriktheOutgolfer Я не впевнений, що це так, як на це дивитися, але так, ви можете отримати числове значення кодової точки, відображене в 9-му стовпці, з бази даних символів Unicode у файлі UnicodeData.txt. Наприклад, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSмає властивість символів nv=11/12. Існує близько 1500 кодових точок з не порожніми числовими значеннями, а не більше, ніж це невелике завдання вимагає вирішити. Це цілі числа чи раціональні засоби.
tchrist

7

JavaScript (ES6), 88 86 84 81 79 байт

Збережено 2 байти завдяки @Arnauld

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

Не настільки короткий, як інші відповіді JS, але було цікаво математично обчислити кодову точку кожного дробу.

Фрагмент тесту

Старий метод (82 байти):

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

Збережено 4 байти на цьому завдяки @Arnauld.


1
-2 байти в обох версіях з-~'3 1'[n-6]
Арнольд

7

APL (Діалог) , 88 64 байт

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

Спробуйте в Інтернеті!

-3 завдяки dzaima .

Використовуючи 84-байтний підхід ETHproductions.

f←Включений TIO не враховується, так як він поклав туди тільки , щоб бути в змозі перевірити цю функцію.


2

SOGL V0.12 , 51 байт

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

Спробуйте тут!

використовує відображення (m + n*5)%33%22

Пояснення:

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 байт

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

Анонімна функція, яка приймає введення як "1/2" і повертає відповідний символ.

Пряме відображення від Clojure Ratioдо символу дробу. compі той факт, що карти Clojure - це справді допомогло тут. Мені потрібно було передати рядковий вхід, read-stringщоб оцінити його як тип співвідношення, оскільки це дозволяє мені відкинути всі котирування на карті. compдозвольте мені зробити це без бала, що було приємно. "Повний" код буде:

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

Переглянувши інші відповіді, я зрозумів, що такий підхід досить наївний. Я шукаю шляхи її вдосконалення.



1

Вугілля деревне , 77 48 46 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Редагувати: Збережено 29 31 байт шляхом зіставлення з ASCII символів на багатобайтові символи. Пояснення:

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

Vim Script, 67 байт

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

Функція роботи з Vim в Орграф , які введені після початку їх iwth По- ctrl-k.видимому, відповідний ctrl-kхарактер після того , як exe'normне відображається в блоці коду вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.