Frazioni Unicode


21

Data una frazione nel formato m/n(dove m e n sono interi coprimi), genera la frazione Unicode corrispondente. Non è previsto che il programma / funzione accetti alcun input che non corrisponde a un carattere Unicode. Le matrici, ad [2, 3]esempio al contrario 2/3, sono accettate. m / nal contrario m/nva anche bene. Due ingressi separati me nsono anche validi.

Le frazioni Unicode che devono essere gestite sono le seguenti:

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

Pertanto, i possibili input sono i seguenti:

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

I punti di codice Unicode dei caratteri sono i seguenti:

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

Casi test

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

Rendi il tuo codice il più breve possibile; questo è il codice golf.


Puoi aggiungere i punti di codice unicode per ogni frazione?
Rod,

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

Non ci si dovrà aspettare alcun input che non corrisponda a un carattere Unicode. Ciò significa che dobbiamo rilevare input non validi? O che ciò non dovrebbe accadere?
Arnauld,

@Arnauld Quest'ultimo.
user202729

L'input può essere un oggetto che rappresenta una frazione?
Brad Gilbert b2gills

Risposte:


14

JavaScript (Node.js) , 78 77 byte

Salvato 1 byte grazie a @HermanLauenstein

Accetta input nella sintassi del curry (m)(n).

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

Provalo online!


@ user202729 Sono sicuro di aver usato una formula simile altrove. Non ricordo per quale sfida, però. Ora, potrebbe valere la pena provare a generare i caratteri con String.fromCharCode(), ma mi aspetto un conteggio di byte simile.
Arnauld,


@HermanLauenstein Grazie! (Mi mancava quello perché inizialmente stavo solo cercando il modulo più piccolo. Ero già passato al metodo XOR quando ho iniziato a rimuovere gli slot vuoti finali.)
Arnauld

E se pubblichi la tua risposta troppo presto, le persone utilizzeranno principalmente il tuo approccio ...
user202729

12

Perl 6 ,  48  43 byte

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

Provalo

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

Provalo

Allargato:

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

Si noti che la ricerca deve essere suddivisa in modo che non restituisca altri caratteri Unicode che hanno lo stesso univalente. (altrimenti sarebbe (1..*))


3
Aspetta, Perl 6 ha un built-in per questa cosa esatta?
Erik the Outgolfer,

2
@EriktheOutgolfer Non sono sicuro che sia abbastanza come guardarlo, ma sì, puoi accedere al valore numerico del punto di codice riflesso nella nona colonna dal database dei caratteri Unicode nel file UnicodeData.txt. Ad esempio, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHSha la proprietà character nv=11/12. Esistono circa 1500 punti di codice con valori numerici non vuoti, piuttosto che questa piccola sfida richiede di risolverli. Questi sono numeri interi o razionali.
tchrist,

7

JavaScript (ES6), 88 86 84 81 79 79 byte

Salvato 2 byte grazie a @Arnauld

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

Non abbastanza breve come l'altro JS risponde, ma è stato divertente calcolare matematicamente il punto di codice di ogni frazione.

Test snippet

Vecchio metodo (82 byte):

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

Ho salvato 4 byte su questo grazie a @Arnauld.


1
-2 byte su entrambe le versioni con-~'3 1'[n-6]
Arnauld il

7

APL (Dyalog) , 88 64 byte

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

Provalo online!

-3 grazie a dzaima .

Utilizzando l'approccio a 84 byte di ETHproductions.

L' f←incluso su TIO non viene conteggiato, poiché viene messo lì solo per essere in grado di testare la funzione.


2

SOGL V0.12 , 51 byte

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

Provalo qui!

usa la mappatura (m + n*5)%33%22

Spiegazione:

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)

Una funzione anonima che accetta input come "1/2"e restituisce il carattere corrispondente.

Una mappatura diritta da un Clojure Ratioa un personaggio di frazione. compe il fatto che le mappe Clojure siano funzioni davvero utili qui. Avevo bisogno di passare l'input della stringa read-stringper valutarlo come un tipo di rapporto, poiché ciò mi consente di scartare tutte le virgolette nella mappa. complasciami fare questo senza punto, il che è stato bello. Il codice "completo" sarebbe:

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

Dopo aver esaminato le altre risposte, mi sono reso conto che questo approccio è abbastanza ingenuo. Sto cercando modi per migliorarlo.



1

Carbone , 77 48 46 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: salvato 29 31 byte mappando da caratteri ASCII a caratteri multibyte. Spiegazione:

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

Provalo online!

o

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

Provalo 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

La funzione funziona con i digraph di Vim che vengono inseriti dopo averli avviati con ctrl-k.Apparentemente, il ctrl-kcarattere rilevante dopo il exe'normnon viene visualizzato nel blocco di codice sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.