Фракции Юникод

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 -> ⅒

Сделайте ваш код как можно короче; это код гольф.

0WJYxW9FMN
источник
Можете ли вы добавить кодовые точки Unicode для каждой фракции?
Род
4
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
Утренняя монахиня
От вас не ожидают разрешения ввода, который не соответствует символу Unicode. Значит ли это, что мы должны обнаружить неверные данные? Или это не должно происходить?
Арно
@Arnauld Последний.
user202729
Может ли входное значение быть объектом, представляющим дробь?
Брэд Гилберт b2gills

Ответы:

14

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

Сохранено 1 байт благодаря @HermanLauenstein

Принимает ввод в синтаксис карри (m)(n).

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

Попробуйте онлайн!

Arnauld
источник
@ user202729 Я уверен, что я использовал аналогичную формулу в другом месте. Я не помню, для какой задачи, хотя. Теперь, возможно, стоит попытаться сгенерировать символы с помощью String.fromCharCode(), но я бы ожидал такого же количества байтов.
Арно
-1 байт
Герман Л
@HermanLauenstein Спасибо! (Я пропустил этот, потому что изначально я искал наименьшее по модулю. Я уже переключился на метод XOR, когда начал удалять концевые пустые слоты.)
Арно
И если вы опубликуете свой ответ слишком рано, это заставит людей чаще всего использовать ваш подход ...
user202729
12

Perl 6 ,  48  43 байта

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

Попытайся

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

Попытайся

Expanded:

{  # 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..*))

Брэд Гилберт b2gills
источник
3
Подожди, в Perl 6 есть встроенная функция для этой вещи?
Эрик Outgolfer
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.

ETHproductions
источник
1
-2 байта в обеих версиях с-~'3 1'[n-6]
Арно
7

APL (Dyalog) , 88 64 байта

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

Попробуйте онлайн!

-3 благодаря дзайме .

Использование 84-байтового подхода ETHproductions.

f←Включен TIO не учитывается, так как он положил туда только , чтобы быть в состоянии проверить эту функцию.

Эрик Outgolfer
источник
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
dzaima
источник
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)))

Посмотрев остальные ответы, я понял, что такой подход довольно наивен. Я ищу способы улучшить это.

Carcigenicate
источник
1

Древесный уголь , 77 48 46 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 29 29 байтов сохранены путем сопоставления символов 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

Python 3, 97 байт

lambda m,n:'½ ⅓⅔ ¼_¾ ⅕⅖⅗⅘ ⅙___⅚ ⅐ ⅛_⅜_⅝_⅞ ⅑ ⅒'.split()[n-2][m-1]
Райан МакКэмпбелл
источник
2
Это не похоже на работу, вам нужно [n-2][m-1]вместо этого.
Эрик Outgolfer
Правильно, я думаю, что я не проверял это первым ...
Райан
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не отображается в блоке кода выше.

Рене Ниффенеггер
источник