Mischfraktionsgleichheit


15

In der Grundschule lernen die Kinder die richtigen Brüche, bei denen der Zähler kleiner als der Nenner ist und der Wert des Bruchs daher kleiner als eins ist. Später werden sie über Brüche unterrichtet, bei denen der Wert des Bruchs größer als eins ist, und über zwei verschiedene Möglichkeiten, diese Brüche auszudrücken: gemischte Brüche und unpassende Brüche.

Bestimmen Sie bei einem gemischten Bruch, ob er dem falschen Bruch entspricht, bei dem der ganzzahlige Wert und der Zähler miteinander verkettet sind. Bei der Eingabe 1 3/4ist der falsche Bruch beispielsweise 13/4.

Testfälle

1 3/4        -> falsey
1 3/10       -> truthy
6 6/7        -> falsey
55 55/100    -> truthy
4 9/100      -> falsey
40 9/100     -> falsey
7 49/1000    -> falsey
9 1/2        -> falsey
999 999/1000 -> truthy
1 21/200     -> falsey
1 21/101     -> falsey

Bei der Eingabe können Sie den ganzzahligen Teil und den Bruchteil als separate Eingaben verwenden, den Bruch jedoch nicht als Eingabe in zwei Teilen und nicht als Dezimalwert. Sie können den ganzzahligen Teil löschen (nicht als Eingabe verwenden), wenn Sie ihn nicht benötigen.


Soll oder kann der Bruch vereinfacht werden? Wie der vierte Testfall wäre falsch, wie 54/100vereinfacht zu27/50
Jo King

1
Sollte es sich bei der Ausgabe um zwei unterschiedliche, konsistente Werte oder um inkonsistente Wahrheitswerte handeln?
Luis Mendo

1
Übrigens, das Fixieren des 4. Testfalls auf 55 würde das Problem nicht ändern, wenn es 55/100auch vereinfacht werden könnte 11/20, sodass sich dort die gleiche Frage stellt, die @JoKing aufgeworfen hat.
Sundar - Reinstate Monica

3
"Sie dürfen den Bruch nicht als Eingabe in zwei Teile nehmen" - äh, warum? Das ist genau das, was der /tut: /
Jonathan Allan

11
Dies scheint gleichbedeutend zu sein mit "Bestimmen Sie bei einer Eingabe, die keine Rolle spielt, und zwei Zahlen als durch einen Schrägstrich getrennte Zeichenfolge, ob die zweite Zahl 10 der Potenz der Länge der ersten Zahl entspricht".
XNOR

Antworten:


8

MATL , 7 Bytes

UsGXzU=

Die Eingabe ist eine Zeichenfolge. Die Ausgabe ist 1für die Wahrheit, 0für die Falschheit.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

U     % Implicit input. Convert to number(s): gives a vector of two numbers
s     % Sum of that vector
G     % Push input again
Xz    % Remove spaces
U     % Convert to number
=     % Equal? Implicit display

8

Perl 6 , 16, 12 Bytes

{1+$_==1~$_}

Probieren Sie es online!

Übernimmt die Eingabe als Zeichenfolge, die den Bruch darstellt. Es stellte sich heraus, dass die dynamische Typisierung von Perl 6 Zeichenfolgen in rationale Brüche umwandeln kann, wer wusste das schon? "1/10"Wenn die Zeichenfolge zu einer Zahl gezwungen wird, wird sie zurückgegeben0.1

Der anonyme Codeblock prüft einfach, ob der Bruch plus eins mit dem Bruch verkettet ist. Dank der Python-Antwort von xnor, die mir gezeigt hat, dass der ganzzahlige Teil keine Rolle spielt.

Alte Lösung, 27 26 Bytes

{.nude[0]==.Int~[%] .nude}

Probieren Sie es online!

Nimmt Eingaben als rationalen gemischten Bruch und gibt true oder false zurück. Gibt für den vierten Testfall false zurück, da dies vereinfacht werden kann.

Erläuterung:

.nudegibt eine Liste von zurück [numerator, denominator].

{                        } # Anonymous code block
 .nude[0]    # Check if the numerator of the mixed fraction
         ==  # Is equal to
           .Int  # The integer part of the fraction
               ~ # Concatenated to
                [%] .nude  # The numerator modulo the denominator
                           # And return implicitly

7
Ich nehme an , das .nudeist nach nu merator + de nominator benannt, aber es hat wahrscheinlich jemand große Freude gemacht, es so nennen zu können.
Urous

1
Ich wollte mit etwas '1 3/10' {S/\s//==.words.sum}
anfangen

6

Retina 0.8.2 , 17 16 Bytes

(.)+/1(?<-1>0)*$

Probieren Sie es online! Benötigt nur den Bruchteil, sodass die verknüpfte Testsuite die Ganzzahl aus den Testfällen entfernt. Erläuterung: Die falsche Verkettung ist nur dann gleich der gemischten Zahl, wenn der Nenner eine Potenz von 10 ist und der Zähler für jede Null im Nenner eine Ziffer hat. Die Bilanzgruppen von .NET werden verwendet, um zu überprüfen, ob genügend Ziffern vorhanden sind. Bearbeiten: 1 Byte dank @sundar gespeichert.


Funktioniert nicht für 1 11/10. Es scheint ein Problem mit Ihrer Implementierung zu sein, nicht die Methode
H.PWiz

1
Beachten Sie Folgendes: "Sie können den ganzzahligen Teil löschen (nicht als Eingabe verwenden), wenn Sie ihn nicht benötigen." - Wenn Sie die Eingabe so ändern, dass sie nur den Bruchteil enthält, ist das führende Leerzeichen möglicherweise nicht erforderlich.
Sundar - Reinstate Monica

1
@ H.PWiz Ich glaube nicht, dass wir uns mit Eingaben befassen müssen, bei denen der Zähler größer als der Nenner ist (da dies gemischte Brüche sein sollen, bei denen nur der nichtintegrale Dezimalteil als Bruch ausgedrückt wird). Aber ich werde das OP bitten, das zu bestätigen.
Sundar - Reinstate Monica

@ Sundar Ich müsste es ^stattdessen ändern , damit es nicht hilft.
Neil

Das /macht es eindeutig, womit Sie übereinstimmen, so dass ich nicht glaube, dass Sie den Anker dort brauchen (nach den üblichen Regeln für die Regex-Übereinstimmung, keine Retina-Expertise hier). Scheint trotzdem zu funktionieren: Online ausprobieren! .
Sundar - Reinstate Monica

6

Schale , 8 Bytes

§·=r¤+r+

Probieren Sie es online!

Erläuterung

§(·=r)(¤+r)(+)  -- example arguments: "1" "3/10"
§               -- fork both arguments
      (¤ r)     -- | read both: 1 3/10
      ( + )     -- | and add them: 13/10
           (+)  -- | concatenate: "13/10"
                -- and do
 (· r)          -- | read the second argument: 13/10
 ( = )          -- | and compare: 13/10 == 13/10
                -- : 1


5

R , 78 65 Bytes

function(n,e=function(a)eval(parse(t=sub(" ",a,n))))e("")==e("+")

Probieren Sie es online!

-13 Bytes dank Giuseppe und JayCe!


1
Ist einfach subin Ordnung hier. Sie können auch t=anstelle vontext=
Giuseppe

1
Was kann ich sagen? Brillant! es vereinfacht sich schön auf 65 Bytes
JayCe

Ich bin froh zu sehen, dass ich auf der richtigen Seite war! Vielen Dank!
Robert S.

Sie können versuchen, die Python 3-Antwort von xnor für wahrscheinlich 20 Bytes zu
portieren



4

Python 3 , 26 Bytes

lambda k:eval(k+'+1==1'+k)

Probieren Sie es online!

Zum Beispiel Eingabe 3/4gibt 3/4+1==13/4. Anstatt den gesamten Teil der Fraktion zu nehmen, haben wir ihn nur so eingestellt, dass er 1die Gleichheit der gemischten Fraktionen testet. Testfälle von Chas Brown.


4

Brachylog , 15 Bytes

ḍ{lᵛ&ht¬ị&t↔ị1}

Probieren Sie es online!

Nimmt den Bruchteil als Zeichenfolgeeingabe.

Verwendet indirekt die gleiche Idee wie meine Julia-Antwort - "der Nenner ist 10 ^ {Länge des Zählers}" kann gesagt werden als "der Nenner ist eine Zehnerpotenz, und die Länge des Nenners ist gleich der Länge des Zählers + die Länge von "/" (dh 1).

ḍ                   % split the input in half
 {            }     % and verify that
  lᵛ                % each half has the same length (i.e. the string had even length)
    &ht¬ị           % and the last character of the first half is 
                    %  not a number (it should be "/")
         &t↔ị1      % and the second half when reversed is the number 1
                    %  i.e. the denominator should be a power of 10

Ältere Antwort:

15 bis 20 Bytes

a₀ᶠịˢtl;10↺^.&a₁ᶠịˢh

Probieren Sie es online!

(-1 Byte dank @Fatalize, aber leider +6 Byte, da ich Fehler in der älteren Methode entdeckt habe.)

Gleiche Idee wie meine Julia-Antwort .


1
Sie können durch 1 Byte verkürzen , indem variable Ersetzen Amit der Ausgangsgröße .(und somit die letzten zu entfernen , Aweil die Ausgangsgröße am Ende implizit ist)
Fatalize

@Fatalize Danke, ich vergesse, dass die Ausgabe bei diesen Entscheidungsproblemen so ziemlich als freie Variable zur Verfügung steht. Leider habe ich Fehler in dem Code gefunden, den ich hatte: Da er nur nach einem numerischen Präfix und einem numerischen Suffix fragte, übergab er Dinge wie 61/10(nur 6 als Zähler / Präfix verwenden) 2/110(nur 10 als Nenner / Suffix verwenden). Ich habe versucht, das Problem zu beheben, bin mir aber nicht sicher, ob dies der beste Weg ist.
Sundar - Wiedereinsetzung von Monica

Ich bin mir nicht sicher, ob ich dir helfen kann, da ich die Spezifikationen dieser Herausforderung überhaupt nicht verstehe, selbst nachdem ich sie dreimal gelesen habe. Ich weiß nicht, was "gemischte Brüche und unpassende Brüche" in meinem Land heißen oder ob es hier überhaupt in Grundschulen unterrichtet wird.
Fatalize

1
@Fatalize Fair genug. Haben Sie Interesse, den Chatroom wiederzubeleben? Ich habe ein paar Fragen, mit denen ich Sie belästigen kann, wenn Sie interessiert sind und die Zeit haben.
Sundar - Reinstate Monica

Sicher, frag einfach einen Mod, um den Raum wiederzubeleben und mich zu markieren, wenn du Fragen
stellst

3

Julia 0,6 , 29 Bytes

r->10^ndigits(num(r))==den(r)

Probieren Sie es online!

Basierend auf der Idee, dass die Ausgabe nur dann wahr sein sollte, wenn der Nenner eine Zehnerpotenz mit so vielen Nullen ist, wie der Zähler Ziffern enthält. Nimmt Eingaben als RationalTyp an, prüft, ob der Nenner gleich 10 ist, erhöht auf die Anzahl der Ziffern im Zähler.


3

Sauber , 57 Bytes

import StdEnv,Text
$b#[u,v:_]=split"/"b
=v==""<+10^size u

Probieren Sie es online!

Dieser ist etwas kürzer, bricht aber für große Zähler / Nenner.

Sauber , 77 61 60 58 Bytes

-1 dank OMᗺs Tipp zu meiner anderen Antwort

import StdEnv,Text
$b#[u,v:_]=split"/"b
=1<+[48\\_<-:u]==v

Probieren Sie es online!

Dies verwendet Neils Methode , es ist etwas kürzer als dies direkt zu tun.
Bei der Überladung von 1<+[48\\_<-:u]Konvertierungen gibt es einige Tricks: Konvertierungen [Int]nach [Char]und dann nach {#Char} (:== String), aber Intdirekt nach String.

Sauber , 91 89 Bytes

import StdEnv,Text
t=toInt
$a b#[b,c:_]=map t(split"/"b)
#d=t(a<+b)
=d/c==t a&&d-d/c*c==b

Probieren Sie es online!

Definiert eine Funktion $ :: String String -> Bool, die Zähler und Nenner extrahiert, den ganzzahligen Teil und den Zähler in einer Zeichenfolge verkettet und die Äquivalenz überprüft.


3

05AB1E , 7 Bytes

'/¡ćg°Q

Nimmt nur die Brüche als Eingabe.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

'/¡        # Split the input by '/'
           #  i.e. '3/10' → ['3', '10']
   ć       # Head extracted:
           #  i.e. ['3', '10'] → 10 and 3
    g      # Take the length of the numerator
           #  i.e. '3' → 1
     °     # Take 10 to the power of this length
           #  1 → 10**1 → 10
      Q    # Check if that value equals the denominator
           #  10 and 10 → 1 (truthy)

Oder eine allgemeinere Erklärung:

Wir müssen zwei Dinge validieren:

  • Ist der Nenner ein Faktor 10 ( 1, 10, 100, 1000usw.)?
  • Entspricht die Länge des Zählers + 1 der Länge des Nenners?
    • Dieser zweite Teil wird durchgeführt, indem überprüft wird, ob der Nenner wie er ist gleich 10 zur Potenz der Länge des Zählers ist, wodurch 2 Bytes eingespart werden

PS: Wenn wir die Zähler und Nenner als getrennte Eingänge nehmen könnten, nur 3 Bytes hätte genügt: g°Q.


3

JavaScript, 26 Bytes

Übernimmt Eingaben in currying syntax ( f(x)(y)), wobei xes sich bei der Ganzzahl yum den Bruch handelt, als Zeichenfolge.

x=>y=>x==eval(x+y)-eval(y)

Probieren Sie es online aus


3

Java 10, 107 70 67 57 Bytes

f->new Long(f.split("/")[1])==Math.pow(10,f.indexOf("/"))

Willkommen in der Welt ohne eval..

-40 Bytes durch Erstellen eines Ports von @ChasBrowns Python 2-Antwort .
-10 Bytes dank @Shaggy (Ich hätte die Antwort von @ChasBrown besser lesen sollen und seine Verwendung von find( indexOf) ..)

Probieren Sie es online aus.

Erläuterung:

f->                         // Method with String parameter and boolean return-type
  new Long(f.split("/")[1]) //  Take the denominator as integer
  ==Math.pow(10,            //  And check whether it is equal to 10 to the power of:
                f.indexOf("/"))
                            //   the length of the numerator-String


@ Shaggy Ah, Chas Brown hat sogar die gleiche Antwort in Python 2, die ich verlinkt habe. Ich bin mir nicht sicher, warum ich das nicht schon benutzt habe. Danke!
Kevin Cruijssen


2

Perl 5 -p, 23 Bytes

$_=eval=~s/..//r eq$_+0

Probieren Sie es online!

Nimmt den Bruchteil alleine als Eingabe (wie durch OP erlaubt), gibt 1 für wahr und nichts für falsch aus.

$_=       # assign to be printed by -p
eval      # evaluate fraction to get 0.something, for eg. 0.54
=~s/..//r # remove the 0. part, giving 54
 eq       # string equality check
$_+0      # after first coercing input to number to remove / and denominator

Der für sich genommene Dezimalteil wäre nur dann genau gleich dem Zähler, wenn der Nenner die unmittelbar nächste Zehnerpotenz ist, die größer ist als der Zähler. Dies ist die Bedingung, auf die wir prüfen müssen.


2

Nein, 17 Bytes

I#I"/"^WL1-%WL_=P

Probieren Sie es online!

Erläuterung

10eineinein=Log10n+1nx

I#                - Push the first input then pop it off the stack
  I"/"^           - Push the second input and split the string at "/"
       W          - Convert the top (the denominator) of the stack from a string to a number
        L1-       - Take the log 10 of the top of the stack and subtract 1 (a)
           %      - Rotate the stack
            WL_   - Convert the top of the stack (the numerator) to a number, take the log10 and floor the result (b)
               =  - Check if a and b are equal
                P - Print the top of the stack


2

R , 53 Bytes

function(n,x=el(strsplit(n,"/")))x[2]==10^nchar(x[1])

Probieren Sie es online!

Nimmt nur den Bruchteil als Eingabe. Wie von xnor in einem Kommentar erwähnt:

Dies scheint gleichbedeutend zu sein mit "Bestimmen Sie bei einer Eingabe, die keine Rolle spielt, und zwei Zahlen als durch einen Schrägstrich getrennte Zeichenfolge, ob die zweite Zahl 10 der Potenz der Länge der ersten Zahl entspricht".

Die Antwort von Robert S. ist weniger golfen, aber viel interessanter als meine.



1

Excel, 52 Bytes

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,LEN(B1))=0

Ignoriert die Ganzzahleingabe. Grundsätzlich:IS Denominator = 10^LEN(Numerator)


Für Nenner begrenzt auf <10^9: 48 Bytes:

=10^FIND("/",B1)/10-MID(B1,FIND("/",B1)+1,1E9)=0

Ein Großteil der Logik spaltet sich auf /. Wenn die Eingabe separat erfolgen könnte, 16 Bytes:

=10^LEN(B1)-C1=0

1

Elixier , 81 Bytes

fn b->[n,d]=String.split b,"/";String.to_integer(d)==:math.pow 10,byte_size n end

Probieren Sie es online!

Könnte in der Lage sein, irgendwohin zu kommen {n,"/"<>d}=Integer.parse b, aber nicht sicher, wie.



1

C (gcc / clang), 59 49 47 Bytes

f(a,b){a=atoi(b=strchr(a,47)+1)==pow(10,b+~a);}

Port of Chas Browns Python 2 Antwort . Probieren Sie es hier online aus .

Ignoriert den ganzzahligen Teil der Eingabe. Vielen Dank an Jonathan Frech für das Golfen mit 2 Bytes.

Ungolfed:

f(a, b) { // function returning an int and taking a string as input; also declaring another string variable
          // this abuses the parameters as much as possible, omitting the type int and implicitly converting it to char *
    a =                             // return a truthy or falsey value based on
        atoi(b = strchr(a, 47) + 1) // the denominator (as integer; 47 is the ASCII code for '/')
        == pow(10, b + ~a);         // is equal to 10 to the power of the length of the numerator-string
}

'/'kann höchstwahrscheinlich sein 47.
Jonathan Frech

Mögliche 47 Bytes .
Jonathan Frech

Nett, danke!
OOBalance

Bitte schön. Ich denke, Sie haben vergessen, Ihren Header zu aktualisieren, um die neue Byteanzahl wiederzugeben.
Jonathan Frech

1

ForceLang, 86 78 Bytes

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.