Ułamki Unicode

21

Biorąc pod uwagę ułamek w formacie m/n(gdzie m i n są liczbami całkowitymi coprime), wypisz odpowiednią ułamek Unicode. Twój program / funkcja nie będzie przyjmować żadnych danych wejściowych, które nie odpowiadają znakom Unicode. Tablice, np [2, 3]. W przeciwieństwie do 2/3, są akceptowane. m / nw przeciwieństwie do m/njest również w porządku. Dwa oddzielne wejścia mi nsą również ważne.

Frakcje Unicode, które należy obsłużyć, są następujące:

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

Zatem możliwe dane wejściowe są następujące:

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

Punkty kodowe znaków w Unicode są następujące:

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

Przypadki testowe

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

Ustaw swój kod tak krótko, jak to możliwe; to jest kod golfowy.

0WJYxW9FMN
źródło
Czy możesz dodać punkty kodu Unicode dla każdej frakcji?
Rod
4
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
Leaky Nun
Nie będziesz oczekiwać, że zezwolisz na jakiekolwiek dane wejściowe, które nie odpowiadają znakowi Unicode. Czy to oznacza, że ​​musimy wykryć nieprawidłowe dane wejściowe? Czy to nie powinno się zdarzyć?
Arnauld
@Arnauld Ten ostatni.
user202729,
Czy dane wejściowe mogą być obiektem reprezentującym ułamek?
Brad Gilbert b2gills

Odpowiedzi:

14

JavaScript (Node.js) , 78 77 bajtów

Zaoszczędzono 1 bajt dzięki @HermanLauenstein

Pobiera dane wejściowe w składni curry (m)(n).

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

Wypróbuj online!

Arnauld
źródło
@ user202729 Jestem pewien, że użyłem podobnej formuły gdzie indziej. Nie pamiętam jednak, dla którego wyzwania. Teraz warto spróbować wygenerować znaki String.fromCharCode(), ale spodziewałbym się podobnej liczby bajtów.
Arnauld,
-1 bajt
Herman L
@HermanLauenstein Thanks! (Tęskniłem za tym, ponieważ początkowo szukałem najmniejszego modulo. Już przełączyłem się na metodę XOR, kiedy zacząłem usuwać końcowe puste miejsca.)
Arnauld,
A jeśli opublikujesz swoją odpowiedź zbyt wcześnie, spowoduje to, że ludzie będą w większości korzystać z twojego podejścia ...
user202729
12

Perl 6 ,  48  43 bajtów

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

Spróbuj

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

Spróbuj

Rozszerzony:

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

Zauważ, że wyszukiwanie musi zostać podzielone, aby nie zwracało innych znaków Unicode, które mają ten sam unival. (inaczej byłoby (1..*))

Brad Gilbert b2gills
źródło
3
Zaraz, Perl 6 ma wbudowaną funkcję tego właśnie?
Erik the Outgolfer,
2
@EriktheOutgolfer Nie jestem pewien, czy tak można na to patrzeć, ale tak, można uzyskać dostęp do wartości liczbowej punktu kodowego odzwierciedlonej w 9 kolumnie z bazy znaków znaków Unicode w pliku UnicodeData.txt. Na przykład U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSma właściwość znaku nv=11/12. Istnieje około 1500 punktów kodowych z niepustymi wartościami liczbowymi - raczej więcej niż to małe wyzwanie, o które trzeba rozwiązać. Są to liczby całkowite lub racjonalne.
tchrist
7

JavaScript (ES6), 88 86 84 81 79 bajtów

Zaoszczędzono 2 bajty dzięki @Arnauld

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

Nie do końca tak krótki, jak druga odpowiedź JS, ale fajnie było obliczać matematycznie punkt kodowy każdej frakcji.

Testowy fragment kodu

Stara metoda (82 bajty):

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

Zaoszczędzono 4 bajty na tym dzięki @Arnauld.

ETHprodukcje
źródło
1
-2 bajty w obu wersjach z-~'3 1'[n-6]
Arnauld
7

APL (Dyalog) , 88 64 bajtów

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

Wypróbuj online!

-3 dzięki dzaima .

Korzystanie z 84-bajtowego podejścia ETHproductions.

f←Zawarte na TIO nie liczy, ponieważ to właśnie tam umieszczone, aby móc przetestować tę funkcję.

Erik the Outgolfer
źródło
2

SOGL V0.12 , 51 bajtów

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

Wypróbuj tutaj!

używa mapowania (m + n*5)%33%22

Wyjaśnienie:

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
źródło
2

Clojure, 127 bajtów

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

Anonimowa funkcja, która przyjmuje dane wejściowe jako "1/2" i zwraca odpowiedni znak.

Proste mapowanie z postaci Clojure Rationa postać ułamkową. comp, a fakt, że mapy Clojure są funkcjami, naprawdę tu pomógł. Musiałem przekazać ciąg znaków, read-stringaby ocenić go jako typ współczynnika, ponieważ pozwala mi to odrzucić wszystkie wzdęte cytaty na mapie. comppozwól mi zrobić to bez punktów, co było miłe. „Pełny” kod to:

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

Po przeanalizowaniu innych odpowiedzi zdałem sobie sprawę, że takie podejście jest dość naiwne. Szukam sposobów na ulepszenie.

Carcigenicate
źródło
1

Szybki , 106 82 bajtów

Port odpowiedzi @Arnaulds JavaScript

Oszczędność 24 bajtów dzięki @ Mr.Xcoder

{Array("¾⅗  ⅜    ⅞⅘½⅓¼⅕⅙⅐⅛⅑⅒⅚⅔⅝⅖")[($0*9+$1)%31]}

Wypróbuj online!

Herman L.
źródło
Użyj zamknięć dla 82 bajtów (nie musisz uwzględniać var f=w liczbie bajtów)
Pan Xcoder
1

Węgiel drzewny , 77 48 46 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 29 31 bajtów poprzez mapowanie z znaków ASCII na znaki wielobajtowe. Wyjaśnienie:

    “....”                  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
Neil
źródło
0

Python 3 , 87 bajtów

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

Wypróbuj online!

lub

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

Wypróbuj online!

ovs
źródło
0

Python 3, 97 bajtów

lambda m,n:'½ ⅓⅔ ¼_¾ ⅕⅖⅗⅘ ⅙___⅚ ⅐ ⅛_⅜_⅝_⅞ ⅑ ⅒'.split()[n-2][m-1]
Ryan McCampbell
źródło
2
To nie wydaje się działać, [n-2][m-1]zamiast tego potrzebujesz .
Erik the Outgolfer,
Racja, chyba nie przetestowałem tego najpierw ...
Ryan McCampbell
0

Vim Script, 67 bajtów

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

Ta funkcja działa z Vimem digrafach które zostały wprowadzone po ich rozpoczęciem iwth ctrl-k.Najwyraźniej odpowiedni ctrl-kznak po exe'normnie jest renderowany w bloku kodu powyżej.

René Nyffenegger
źródło