Karışık Kesir Eşitliği


15

İlkokulda, çocuklar payın paydadan daha az olduğu ve böylece fraksiyonun değerinin birden az olduğu uygun kesirler hakkında bilgi sahibi olurlar. Daha sonra, fraksiyonun değerinin birden fazla olduğu fraksiyonlar ve bu fraksiyonları ifade etmenin iki farklı yolu hakkında bilgi verilir: karışık fraksiyonlar ve uygun olmayan fraksiyonlar.

Karışık bir kesir göz önüne alındığında, tamsayı değeri ve payın birleştirildiği yanlış kesire eşdeğer olup olmadığını belirleyin. Örneğin, girdi 1 3/4için uygun olmayan kesir 13/4.

Test Durumları

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

Giriş için, tamsayı kısmını ve kesir parçasını ayrı girişler olarak alabilirsiniz, ancak kesiri iki parça halinde girdi olarak alamazsınız ve ondalık değer olarak alamazsınız. Kullanmanız gerekmiyorsa tamsayı kısmını düşürebilirsiniz (giriş olarak almazsınız).


Kesir basitleştirilmeli mi veya basitleştirilmeli mi? Dördüncü test davası 54/100basitleştirir gibi yanlış olurdu27/50
Jo King

1
Çıktı iki farklı, tutarlı değer veya herhangi bir, muhtemelen tutarsız, doğruluk / falsey değeri olmalı mı?
Luis Mendo

1
Bu arada, 4. test vakasını 55 olarak düzeltmek sorunu değiştirmezdi - 55/100basitleştirilebilir 11/20, bu yüzden @JoKing'in gündeme getirdiği aynı soru orada ortaya çıkıyor.
sundar - Monica'yı

3
"kesiri iki parça halinde girdi olarak alamazsınız" - err neden? Tam olarak ne /yapar: /
Jonathan Allan

11
Bu, "önemli olmayan bir girdi göz önüne alındığında ve eğik çizgi ile ayrılmış bir dize olarak iki sayı verildiğinde, ikinci sayının ilk sayının uzunluğunun gücüne 10 olup olmadığını belirleyin" ifadesine eşit gibi görünüyor.
xnor

Yanıtlar:


8

MATL , 7 bayt

UsGXzU=

Girdi bir dizedir. Çıktı 1doğruluk içindir, falsey 0içindir.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

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 bayt

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

Çevrimiçi deneyin!

Girdiyi kesri temsil eden bir dize olarak alır. Perl 6'nın dinamik yazımının rasyonel kesimlere dizeleri işleyebileceği ortaya çıktı, kim biliyordu? Dize "1/10"bir sayıya zorlandığında,0.1

Anonim kod bloğu, kesirin artı birinin kesirle birleştirilene eşit olup olmadığını denetler. Sayesinde XNOR Python cevap tamsayı kısmı önemli olmadığını bana gösterdiğin için.

Eski çözüm, 27 26 bayt

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

Çevrimiçi deneyin!

Girişi rasyonel karışık kesir olarak alır ve doğru veya yanlış döndürür. Basitleştirilebildiği için dördüncü test durumu için false değerini döndürür.

Açıklama:

.nudelistesini döndürür [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
Sanırım bu nu merator + de nominator .nudeiçin adlandırılmış , ama birisi muhtemelen böyle diyebiliriz büyük zevk aldı.
Οurous

1
Tek bir ip olarak alan bir '1 3/10' {S/\s//==.words.sum}
şeyle gidecektim

6

Retina 0.8.2 , 17 16 bayt

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

Çevrimiçi deneyin! Yalnızca kesir kısmı gerektirir, bu nedenle bağlı test takımı tamsayıyı test durumlarından kaldırır. Açıklama: Uygun olmayan birleştirme, yalnızca payda 10'luk bir güçse ve payda paydadaki her sıfır için bir basamak varsa karışık sayıya eşittir. .NET'in dengeleme grupları, yeterli basamak bulunduğunu doğrulamak için kullanılır. Düzenleme: @sundar sayesinde 1 bayt kaydedildi.


Çalışmıyor 1 11/10. Uygulamanızla ilgili bir sorun gibi görünüyor, yöntem değil
H.PWiz

1
Not: "Tamsayı kısmını kullanmanız gerekmiyorsa (giriş olarak almazsınız) bırakabilirsiniz." - girişi yalnızca kesir olacak şekilde değiştirirseniz, ön boşluk gereksiz olabilir.
sundar - Monica'yı

1
@ H.PWiz Payın paydadan daha büyük olduğu girdilerle uğraşmamız gerektiğini düşünmüyorum (çünkü bunların sadece fraksiyon olarak ifade edilen integral olmayan ondalık kısım ile karışık fraksiyonlar olması gerekiyor ). Ama OP'den bunu onaylamasını isteyeceğim.
sundar - Monica'yı

@ sundar Bunun ^yerine değiştirmek zorunda kalırdım , bu yüzden yardımcı olmaz.
Neil

/Oraya çapa gerek kalmaz, bu kesin neyi sen eşleştirme yapar (her zamanki regex eşleştirme kurallarına göre gidiş, hiçbir Retina uzmanlığı burada). Yine de çalışıyor gibi görünüyor: Çevrimiçi deneyin! .
sundar - Monica'yı

6

Kabuk , 8 bayt

§·=r¤+r+

Çevrimiçi deneyin!

açıklama

§(·=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



4

Stax , 5 bayt

╡ÄLσ`

Çalıştır ve hata ayıkla

Açıklama:

+yj$e= Full program, implicit input
+      Add integer and fraction part
 y     Push unparsed input
  j$   Split on spaces and flatten, i.e. Remove spaces
    e  Evaluate
     = Check for equality

4

Python 3 , 26 bayt

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

Çevrimiçi deneyin!

Örneğin, girdi 3/4verir 3/4+1==13/4. Fraksiyonun tamamını almak yerine 1, karışık fraksiyon eşitliğini test etmek için ayarladık . Chas Brown'dan test senaryoları.


4

Brachylog , 15 bayt

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

Çevrimiçi deneyin!

Kesirli kısmı tek başına dize girişi olarak alır.

Dolaylı olarak Julia cevabımla aynı fikri kullanıyor - "payda 10 ^ {pay uzunluğu}" diyebilir "payda on güçtür ve paydanın uzunluğu payın uzunluğuna eşittir + "/" uzunluğu (yani 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

Eski cevap:

15 20 bayt

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

Çevrimiçi deneyin!

(@Fatalize sayesinde -1 bayt, ancak eski yöntemdeki hataları keşfettiğimden maalesef +6 bayt.)

Julia cevabımla aynı fikir .


1
Değişkeni Açıkış değişkeniyle değiştirerek 1 bayt kısaltabilirsiniz .(ve böylece Açıktı değişkeni sonunda orada olmadığı için
sonuncuyu kaldırabilirsiniz

@Fatalize Teşekkürler, bu karar problemlerinde çıktının hemen hemen serbest değişken olarak mevcut olduğunu unutuyorum. Ne yazık ki ben vardı kodunda hata bulundu: sadece herhangi bir sayısal önek ve herhangi bir sayısal sonek istedi, çünkü 61/10(payda / önek olarak sadece 6 2/110kullanarak ) (payda / sonek olarak sadece 10 kullanarak ) gibi şeyler geçiyordu . Bunu düzeltmek için çalıştım, bunun olsa en iyi yol olup olmadığından emin değilim.
sundar - Monica adlı

Size yardımcı olabileceğimden emin değilim, çünkü 3 kez okuduktan sonra bile bu zorluğun özelliklerini hiç anlamıyorum. Ülkemde "karma kesirler ve uygun olmayan kesirler" olarak adlandırılanları mı yoksa buradaki ilkokullarda bile öğretilip öğretilmediğini bilmiyorum.
Fatalize

1
@Fatalize Yeterince adil. Sohbet odasını yeniden canlandırmak ister misiniz? İlgileniyorsanız ve zamanınız varsa, sizi rahatsız edecek bir sürü sorum var.
sundar - Monica adlı

Tabii, sadece odayı canlandırmak ve soru sorduğunuzda beni etiketlemek için bir mod isteyin
Fatalize

3

Julia 0.6 , 29 bayt

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

Çevrimiçi deneyin!

Çıktının sadece payda, rakamda rakam olduğu kadar sıfır olan on güç olduğunda doğru olması gerektiği fikrine dayanır. Girdi Rationaltürü olarak alınır, paydanın paydaki basamak sayısına yükseltilmiş 10'a eşit olup olmadığını kontrol eder.


3

Temiz , 57 bayt

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

Çevrimiçi deneyin!

Bu biraz daha kısa ama büyük pay / paydalar için kırılıyor.

Temiz , 77 61 60 58 bayt

Diğer yanıtımda OMᗺ'nin ipucu sayesinde -1

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

Çevrimiçi deneyin!

Bu Neil'in yöntemini kullanır , doğrudan yapmaktan biraz daha kısa.
Dönüşüm aşırı yüklenmesi, bazı kandırmaca var 1<+[48\\_<-:u]dönüştürür [Int]için [Char]ve daha sonra {#Char} (:== String), ancak Intdoğrudan String.

Temiz , 91 89 bayt

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

Çevrimiçi deneyin!

$ :: String String -> BoolPayı ve paydayı ayıklayan, tamsayı kısmını ve payını dize olarak birleştiren ve denkliği kontrol eden bir işlev tanımlar .


3

05AB1E , 7 bayt

'/¡ćg°Q

Kesirleri yalnızca girdi olarak alır.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

'/¡        # 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)

Veya daha genel bir açıklama:

İki şeyi doğrulamamız gerekiyor:

  • Payda bir faktör 10 mu (1, 10, 100, 1000 vb.) Midir?
  • Payın + 1 uzunluğu paydanın uzunluğuna eşit mi?
    • Bu ikinci bölüm, paydanın olduğu gibi, 2 bayt tasarruf eden payın uzunluğunun gücüne 10 olup olmadığını kontrol ederek yapılır.

Ps: Biz ayrılmış girdi olarak pay ve payda geçirebilir, sadece 3 byte yeterdi: g°Q.



3

Java 10, 107 70 67 57 bayt

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

Olmadan dünyaya hoş geldiniz eval..

@ChasBrown 'un Python 2 cevabı portu oluşturarak -40 bayt .
-10 sayesinde bayt @Shaggy (okudum gerektiğini @ChasBrown daha iyi cevabını ve onun kullanımı find( indexOf) ..)

Çevrimiçi deneyin.

Açıklama:

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 , bağladığım Python 2 cevabında bile aynı.
Kevin Cruijssen


2

Perl 5 -p, 23 bayt

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

Çevrimiçi deneyin!

Kesirli kısmı tek başına girdi olarak alır (OP tarafından izin verildiği gibi), çıktıları 1 doğru için ve hiçbir şey yanlış için.

$_=       # 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

Tek başına alınan ondalık kısım, payda sadece paydadan ondan daha büyük bir sonraki güç olduğunda, bu da kontrol etmemiz gereken şarttır.


2

Noether, 17 bayt

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

Çevrimiçi deneyin!

açıklama

Peki bu nasıl çalışıyor? Test örneklerine bakarsanız, tek gerçek vakalar paydanın on güç olduğu zamandır,10bir, nerede bir pay artı bir (bir=günlük10n+1, nerede n paydır ve x döşeme fonksiyonunu temsil eder).

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 bayt

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

Çevrimiçi deneyin!

Girdi olarak sadece kesirli kısmı alır. Bir yorumda xnor tarafından belirtildiği gibi:

Bu, "önemli olmayan bir girdi göz önüne alındığında ve eğik çizgi ile ayrılmış bir dize olarak iki sayı verildiğinde, ikinci sayının ilk sayının uzunluğunun gücüne 10 olup olmadığını belirleyin" ifadesine eşdeğer gibi görünüyor.

Robert S.'nin cevabı benimkinden daha az golfçu ama çok daha ilginç.



1

Excel, 52 bayt

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

Tamsayı girişini yok sayar. Temelde:IS Denominator = 10^LEN(Numerator)


Sınırlı paydalar için <10^9: 48 bayt:

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

Toplu mantık bölünüyor /. Giriş ayrı olarak alınabiliyorsa, 16 bayt:

=10^LEN(B1)-C1=0

1

İksir , 81 bayt

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

Çevrimiçi deneyin!

Birlikte bir yere gidebilir {n,"/"<>d}=Integer.parse b, ama nasıl emin değilim.



1

C (gcc / clang), 59 49 47 bayt

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

Port of Chas Brown'un Python 2 yanıtı . Burada çevrimiçi deneyin .

Girişin tamsayı kısmını yoksayar. 2 bayt golf için Jonathan Frech için teşekkürler .

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
}

'/'büyük olasılıkla olabilir 47.
Jonathan Frech


Güzel, teşekkürler!
OOBalance

Rica ederim. Sanırım yeni bayt sayısını yansıtacak şekilde başlığınızı güncellemeyi unuttunuz.
Jonathan Frech

1

ForceLang, 86 78 bayt

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.