Kann ein Bruch durch anomale Stornierung vereinfacht werden?

11

Anomale Stornierung (von Wolfram Alpha):

Anomale Löschung ist eine "Löschung" der Ziffern von a und b im Zähler und Nenner eines Bruchteils a / b, was zu einem Bruch führt, der dem Original entspricht. Beachten Sie, dass bei mehreren, aber unterschiedlichen Zählungen einer oder mehrerer Ziffern im Zähler und Nenner Unklarheiten darüber bestehen, welche Ziffern abgebrochen werden sollen. Daher ist es am einfachsten, solche Fälle von der Prüfung auszuschließen. Verknüpfung

Nehmen wir in einfachen Worten an, Sie haben einen Bruchteil a / b. Wenn Sie die Ziffern in der Fraktion löschen können, um eine andere Fraktion zu erstellen, c / ddie der ursprünglichen ( a / b = c / d) entspricht, kann eine anomale Stornierung verwendet werden, um die Fraktion zu vereinfachen.

Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu a/berstellen , die eine Bruchzeichenfolge in das Formular eingibt und einen Wahrheitswert ausgibt oder zurückgibt, wenn der Bruch durch anomale Löschung vereinfacht werden kann, und ansonsten einen Falschwert. aund bwerden immer positive ganze Zahlen ungleich Null sein. aund bwird immer zwei oder mehr Ziffern haben. Außerdem werden alle Ziffern von entweder gelöscht aoder bnicht gelöscht (Sie erhalten keine Eingabe 12/21), mindestens eine Ziffer von aund bwerden jedes Mal gelöscht (Sie erhalten 43/21keine Eingabe ), und das Endergebnis wird niemals 0für beide sein aoder b. Ihr Programm muss alle gängigen Ziffern zwischen aund b(dh in1231/1234müssen Sie a 1, a 2und a 3) aufheben . Wenn es mehrere Stornierungsmöglichkeiten gibt, wählen Sie zuerst die am weitesten links stehende Ziffer (515/25 wird 15/2, nicht 51/2).

Beispiele:

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.

Dies ist , also gewinnt der kürzeste Code in Bytes!

GamrCorps
quelle
1
Relaticate: codegolf.stackexchange.com/questions/37794/… Zufälligerweise habe ich gerade den genauen Mathworld-Eintrag, den Sie zitieren,
durchsucht
Ich hatte den Eindruck, 515/25 storniert auf 103/5?
Pulga
1
@Pulga Die erste 5 im Zähler wird mit der 5 im Nenner gelöscht, sodass 15/2 übrig bleibt.
Alex A.
@Pulga 11 und 55 teilen keine Ziffern, daher kann es mit dieser Methode nicht weiter vereinfacht werden. Bei Verwendung der Vereinfachung normaler Brüche wäre dies jedoch der Fall, aber bei dieser Herausforderung werden nur Ziffern gelöscht.
GamrCorps
Was ist die Antwort für 43/21?
xnor

Antworten:

3

Pyth, 22 19 Bytes

Danke an @isaacg für drei Bytes!

qFcMsMM,Jcz\/.-M_BJ

Erläuterung:

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

Probieren Sie es hier aus .

lirtosiast
quelle
1
m.-Fdkann zu Golf gespielt werden .-M. Ebenso mcFsMdkann Golf gespielt werden cMsMM.
isaacg
@isaacg Interessant; Ich habe mich gefragt, warum .-FMes nicht funktioniert hat. MSpritzt also automatisch auf nicht-monadische Funktionen?
Lirtosiast
2

𝔼𝕊𝕄𝕚𝕟 17 Zeichen / 34 Bytes

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

Try it here (Firefox only).

Erläuterung

ïČ⍘/⎖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
Mama Fun Roll
quelle
Ich bin jetzt seit zwei Monaten in der Nähe und es sieht für mich immer noch magisch aus. +1
ETHproductions
2

Ruby, 95 76 Bytes

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

Erläuterung

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

Ein großes Dankeschön an Doorknob für das Golfen mit 19 Bytes.

ein Spaghetto
quelle
2

TeaScript, 22 Bytes

xs`/`[0]M#E(xg(l))⌐E(x

Jetzt, da alle Fehler in TeaScript 3 behoben sind, funktioniert dies einwandfrei

Probieren Sie es online aus

Testsuite

Downgoat
quelle
Ich verstehe E is not defined.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ huh, komisch, es hat von Github aus funktioniert ... Aktualisierung ...
Downgoat
Großartig, es funktioniert jetzt gut!
Mama Fun Roll
1

MATL , 35 Bytes

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

Beispiele

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

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

Erläuterung

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
Luis Mendo
quelle
1

Javascript ES6, 73 Bytes

a=>[...a.split`/`[0]].some(x=>(e=eval)(a.replace(e(`/${x}/g`),``))==e(a))
Mama Fun Roll
quelle