Una frazione può essere semplificata utilizzando la cancellazione anomala?


11

Annullamento anomalo (da Wolfram Alpha):

La cancellazione anomala è una "cancellazione" delle cifre di a e b nel numeratore e denominatore di una frazione a / b che risulta in una frazione uguale all'originale. Si noti che se ci sono conteggi multipli ma diversi di una o più cifre nel numeratore e nel denominatore, vi è ambiguità su quali cifre annullare, quindi è più semplice escludere tali casi dalla considerazione. collegamento

In termini semplici, supponiamo che tu abbia una frazione a / b. Se è possibile annullare le cifre nella frazione per creare un'altra frazione c / duguale all'originale ( a / b = c / d), è possibile utilizzare la cancellazione anomala per semplificare la frazione.

La tua sfida è quella di creare un programma o una funzione che inserisca una stringa di frazione nel modulo a/be produca o restituisca un valore di verità se la frazione può essere semplificata usando una cancellazione anomala e un valore di falsa in caso contrario. ae bsaranno sempre numeri interi diversi da zero. ae bavrà sempre due o più cifre. Inoltre, tutte le cifre da uno dei due ao bnon verranno cancellate (Non riceverai l'input 12/21), almeno una cifra da ae bverrà cancellata ogni volta (Non otterrai l'input 43/21), e il risultato finale non sarà mai 0per ao b. Il tuo programma deve cancellare tutte le cifre comuni tra ae b(es. In1231/1234, è necessario annullare a 1, a 2e a 3). Se esistono più possibilità di cancellazione, selezionare prima la cifra più a sinistra (515/25 diventa 15/2 e non 51/2).

Esempi:

Input      Output    Why

1019/5095  true      Remove the 0 and the 9 from both sides of the fraction to get 11/55, which is equivalent.
16/64      true      Remove the 6 from both sides, and get 1/4.
14/456     false     Remove the 4s. 14/456 is not equal to 1/56.
1234/4329  false     Remove the 2s, 3s, and 4s. 1234/4329 is not equal to 1/9.
515/25     false     Remove the first 5 from each side. 15/2 is not equal to 515/25.

Questo è , quindi vince il codice più breve in byte!


1
Relaticate: codegolf.stackexchange.com/questions/37794/… Per coincidenza, ho appena scelto l'esatta voce del mondo matematico che stai citando =)
flawr

Avevo l'impressione che 515/25 si annullasse a 103/5?
Pulga,

1
@Pulga I primi 5 nel numeratore si annulleranno con il 5 nel denominatore, lasciando 15/2.
Alex A.

@Pulga 11 e 55 non condividono alcuna cifra, quindi non può essere più semplificato usando questo metodo. Tuttavia, usando la normale semplificazione della frazione, questo sarebbe il caso, ma in questa sfida stiamo solo cancellando le cifre.
GamrCorps il

Qual è la risposta per 43/21?
xnor

Risposte:


3

Pyth, 22 19 byte

Grazie a @isaacg per tre byte!

qFcMsMM,Jcz\/.-M_BJ

Spiegazione:

qFcMsMM,Jcz\/.-M_BJ      Implicit: z=input().
       ,                 two-element list
        Jcz\/              J = split z on ','
                _BJ      Bifurcate reverse: [J,reversed(J)]
             .-M         map multiset difference of elements in both lists
                             this gives the multiset difference both ways
       ,Jcz\/.-M_BJ      On input 1019/5095: [['1019','5095'], ['11','55']]
    sMM                  convert all strings to numbers
  cM                     map by float division
qF                       fold equality

Provalo qui .


1
m.-Fdpuò essere giocato a golf .-M. Allo stesso modo, mcFsMdpuò essere giocato a golf cMsMM.
Isaacg,

@isaacg Interessante; Mi chiedevo perché .-FMnon funzionasse. Quindi Mautomaticamente splats su funzioni non monadiche?
lirtosiast,

2

𝔼𝕊𝕄𝕚𝕟, 17 caratteri / 34 byte

ïČ⍘/⎖0ⓢⓈë(ïę$)≔ëï

Try it here (Firefox only).

Spiegazione

ïČ⍘/⎖0ⓢⓈë(ïę$)≔ëï // implicit: ï = input fraction
ïČ⍘/⎖0              // get the numerator...
      ⓢ            // split it...
        Ⓢ          // and check if any of its items satisfy the condition:
          ë(ïę$)    // When the item is removed from ï,
                ≔ëï // does its fractional value still equal the original fractional value?
                    // implicit output

Sono in giro 𝔼𝕊𝕄𝕚𝕟 da due mesi ormai e mi sembra ancora magico. +1
ETHproductions

2

Rubino, 95 76 byte

->a{x,y=a.split(?/).map &:chars;eval a+".0=="+(x-y).join+?/+(y-x).join+".0"}

Spiegazione

->a{                                                    # start of lambda
      a.split(?/)                                       # splits input fraction into numerator and denominator
                 .map &:chars;                          # converts them both into arrays of digits
  x,y=                                                  # assigns the numerator to x and the denominator to y

  eval                                                  # Evaluate...
       a+".0                                            # Original fraction with a .0 attached -- this forces floating-point division
            =="                                         # Equals...
               +(x-y).join                              # Numerator: Takes the relative complement of y in x (all elements in x that are not in y) and joins the resulting array into a string
                          +?/+(y-x).join                # Denominator: Takes the relative complement of x in y and joins the resulting array
                                        +".0"           # Add a .0 to force floating-point division
}

Grazie infinite a Doorknob per il golf di 19 byte di sconto.



1

MATL , 35 byte

jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=

Esempi

>> matl
 > jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=
 > 
> 1019/5095
1

>> matl
 > jtXUw'\d+'XXZ)2$XKtbm~)Kwtbm~)UwU/=
 >
> 14/456
0

Spiegazione

j              % input string
tXUw           % duplicate, convert to number, swap
'\d+'XX        % apply regexp to split at '/'
Z)             % separate cell array of strings into two strings
2$XK           % copy those two strings to clipboard K
tbm~)          % remove from denominator all chars present in the numerator
Kw             % paste both strings and swap      
tbm~)          % remove from numerator all chars present in the denoninator
UwU/=          % obtain value of "simplified" fraction and compare with original

1

Javascript ES6, 73 byte

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
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.