혼합 분수 평등


15

초등학교에서 아이들은 분자가 분모보다 작고 분수의 값이 1보다 작은 적절한 분수에 대해 배웁니다. 나중에 분수의 값이 1보다 큰 분수와 이러한 분수를 표현하는 두 가지 다른 방법 인 혼합 분수와 부적절한 분수에 대해 배웁니다.

혼합 분수가 주어지면 정수 값과 분자가 함께 연결된 부적절한 분수와 같은지 확인하십시오. 예를 들어 입력 1 3/4의 경우 부적합 비율은 13/4입니다.

테스트 사례

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

입력의 경우 정수 부분과 분수 부분을 별도의 입력으로 사용할 수 있지만 분수를 두 조각으로 입력 할 수 없으며 소수로 사용할 수 없습니다. 정수 부분을 사용할 필요가없는 경우 정수 부분을 제거 할 수 있습니다 (입력으로 사용하지 않음).


분수를 단순화해야합니까? 다음과 같이 54/100간단 하게 네 번째 테스트 사례가 잘못된 것입니다27/50
Jo King

1
출력이 두 개의 고유하고 일관된 값이거나 일관성이없는 진실 / 거짓 값이어야합니까?
Luis Mendo

1
그건 그렇고, 4 번째 테스트 사례를 55로 수정하면 문제가 변경되지 않습니다. 55/100또한 단순화 될 수 11/20있으므로 @JoKing과 동일한 질문이 발생합니다.
sundar-복원 모니카

3
"분수를 두 조각으로 입력 할 수 없습니다"-왜 그럴까요? 그것은 정확히 무엇을하는 것입니다 /: /
Jonathan Allan

11
이것은 "중요하지 않은 입력과 두 개의 숫자를 슬래시로 구분 된 문자열로, 두 번째 숫자가 10과 첫 번째 숫자 길이의 거듭 제곱인지 여부를 판별하는"것과 같습니다.
xnor

답변:



8

펄 6 , 16 12 바이트

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

온라인으로 사용해보십시오!

분수를 나타내는 문자열로 입력을받습니다. Perl 6의 동적 타이핑은 문자열을 합리적인 분수로 처리 할 수 ​​있다는 것을 알았습니다. 따라서 문자열 "1/10"을 숫자로 강제 변환하면0.1

익명 코드 블록은 분수에 1을 더한 분수가 분수와 연결된 것을 단순히 검사합니다. 정수 부분이 중요하지 않다는 것을 보여준 xnor의 Python 답변 덕분 입니다.

이전 솔루션, 27 26 바이트

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

온라인으로 사용해보십시오!

입력을 합리적인 혼합 분수로 취하고 true 또는 false를 반환합니다. 네 번째 테스트 케이스는 단순화 될 수 있으므로 false를 리턴합니다.

설명:

.nude의 목록을 반환합니다 [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
나는 그것이 nu merator + de nominator .nude라는 이름으로 추측 되지만 누군가는 그것을 그것을 부를 수있어서 큰 즐거움을 얻었습니다.
OUurous

1
나는 그것을 단일 문자열로 가져간 무언가로하려고 했어요'1 3/10' {S/\s//==.words.sum}
Brad Gilbert b2gills

6

레티 나 0.8.2 , 17 16 바이트

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

온라인으로 사용해보십시오! 소수 부분 만 필요하므로 연결된 테스트 스위트는 테스트 케이스에서 정수를 제거합니다. 설명 : 분모가 10의 거듭 제곱이고 분모의 분모에 0마다 하나의 숫자가있는 경우에만 잘못된 연결은 혼합 수와 같습니다. .NET의 밸런싱 그룹은 충분한 숫자가 존재하는지 확인하는 데 사용됩니다. 편집 : @sundar 덕분에 1 바이트가 절약되었습니다.


작동하지 않습니다 1 11/10. 방법이 아닌 구현에 문제가있는 것 같습니다
H.PWiz

1
"정수 부분을 사용할 필요가없는 경우 정수 부분을 제거 할 수 있습니다 (입력으로 사용하지 않음)." -분수 만 갖도록 입력을 변경하면 선행 공간이 불필요 할 수 있습니다.
sundar-복원 모니카

1
@ H.PWiz 분자가 분모보다 큰 입력을 처리해야한다고 생각하지 않습니다 ( 비 정수 소수 부분 만 분수 로 표현 된 혼합 분수 이기 때문에 ). 그러나 OP에게 확인을 요청할 것입니다.
sundar-복원 모니카

@sundar ^대신 대신 변경해야 하므로 도움이되지 않습니다.
Neil

(가) /당신이 앵커를 필요가 있다고 생각하지 않도록, 그것은 명백한 무엇을 당신에게있는 거 일치한다 (보통 정규식 일치 규칙에 의해 진행, 아니 망막 전문 여기). 어쨌든 작동하는 것 같습니다 : 온라인으로 사용해보십시오! .
sundar-복원 모니카

6

껍질 , 8 바이트

§·=r¤+r+

온라인으로 사용해보십시오!

설명

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

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

온라인으로 사용해보십시오!

Giuseppe와 JayCe 덕분에 -13 바이트!


1
그냥 sub잘 여기에있다. 또한, t=대신 사용할 수 있습니다text=
Giuseppe

1
내가 무엇을 말할 수 있습니까? 훌륭한! 멋지게로 간단하게 65 바이트
JayCe

@JayCe 나는 오른쪽 페이지에 있었다는 것을 기쁘게 생각합니다! 감사!
Robert S.

아마도 20 바이트에 대한 xnor의 Python 3 답변 을 이식 볼 수 있습니다 ...
JayCe


4

Stax , 5 바이트

╡ÄLσ`

실행 및 디버깅

설명:

+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

파이썬 3 , 26 바이트

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

온라인으로 사용해보십시오!

예를 들어 input 3/4은을 제공합니다 3/4+1==13/4. 분수의 전체 부분을 취하는 대신 1혼합 분수의 동등성을 테스트하도록 설정했습니다 . Chas Brown의 테스트 사례.


4

Brachylog , 15 바이트

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

온라인으로 사용해보십시오!

소수 부분 만 문자열 입력으로 사용합니다.

내 줄리아의 대답과 같은 아이디어를 간접적으로 사용합니다. "분모는 10 ^ {길이의 분자 길이}}는"분모는 10의 거듭 제곱이고 분모의 길이는 분자의 길이와 같습니다 + "/"의 길이 (즉 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

더 오래된 답변 :

15 20 바이트

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

온라인으로 사용해보십시오!

(@Fatalize 덕분에 1 바이트, 그러나 불행히도 이전 방법에서 버그를 발견 한 이후 +6 바이트.)

나의 Julia 대답 과 같은 생각 .


1
variable A을 출력 변수 로 대체하여 1 바이트 단축 할 수 있습니다 .(따라서 마지막 A에 출력 변수가 내재적 으로 있기 때문에 마지막을 제거하십시오 )
Fatalize

@Fatalize 고마워, 나는 이러한 결정 문제에서 출력이 자유 변수로 거의 사용 가능하다는 것을 잊었다. 불행히도 내가 가진 코드에서 버그를 발견했습니다. 숫자 접두사와 숫자 접미사 만 요청했기 때문에 61/10(분자 / 접두사로 6 2/110만 사용 ) (분모 / 접미사로 10 만 사용 ) 와 같은 것을 전달했습니다 . 나는 이것이 최선의 방법인지 확실하지 않은 문제를 해결하려고 노력했다.
sundar-복원 모니카

이 도전 과제의 사양을 3 번 읽은 후에도 전혀 이해하지 못하기 때문에 도와 드릴 수 없습니다. 나는 우리나라에서 "혼합 분수와 부적절한 분수"가 무엇인지, 또는 여기 초등학교에서 가르치는지도 모른다.
페이탈 라이즈

1
@Fatalize Fair 충분히. 대화방 부활에 관심이 있습니까? 당신이 관심이 있고 시간이 있다면, 당신을 괴롭히는 많은 질문이 있습니다.
sundar-복원 모니카

물론, 방을 되살리려면 모드를 요청하고 질문 할 때 나를 태그하십시오
Fatalize

3

Julia 0.6 , 29 바이트

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

온라인으로 사용해보십시오!

분모가 10의 거듭 제곱이고 분자에 자릿수가있는 경우에만 출력이 참이어야한다는 아이디어를 기반으로합니다. 입력을 Rational유형 으로 취하고 분모가 분자의 자릿수로 올린 10과 같은지 확인합니다.


3

클린 , 57 바이트

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

온라인으로 사용해보십시오!

이것은 조금 짧지 만 큰 분자 / 분모에서는 깨집니다.

클린 , 77 61 60 58 바이트

내 답변에 대한 OMᗺ 의 팁 덕분에 -1

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

온라인으로 사용해보십시오!

이것은 Neil의 방법을 사용 합니다. 직접하는 것보다 약간 짧습니다.
변환 오버로드, 몇 가지 속임수있다 1<+[48\\_<-:u]변환 [Int][Char]다음에 {#Char} (:== String)있지만, Int직접으로는 String.

깨끗함 , 91 89 바이트

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

온라인으로 사용해보십시오!

$ :: String String -> Bool분자와 분모를 추출하고 정수 부분과 분자를 문자열로 연결하고 동등성을 검사 하는 함수 를 정의합니다 .


3

05AB1E , 7 바이트

'/¡ćg°Q

분수 만 입력으로 사용합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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

또는 더 일반적인 설명 :

우리는 두 가지를 확인해야합니다.

  • 분모가 10의 인수 1, 10, 100, 1000입니까 ( 등)?
  • 분자의 길이 + 1이 분모의 길이와 같습니까?
    • 이 두 번째 부분은 분모가있는 그대로 분자 길이의 10 제곱과 같은지 확인하여 2 바이트를 절약합니다.

추신 : 분자와 분모를 분리 된 입력으로 취할 수 있다면 3 바이트면 충분 g°Q합니다.



3

자바 10, 107 70 67 57 바이트

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

없이 세계에 오신 것을 환영합니다 eval ..

@ChasBrown 의 Python 2 응답 포트를 생성하여 -40 바이트 .
-10 덕분 바이트 @Shaggy (I 읽고해야 @ChasBrown 더 나은의 대답을하고 자신의 사용을 find( indexOf) ..)

온라인으로 사용해보십시오.

설명:

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 은 내가 연결 한 Python 2 답변에서도 같은 내용을 가지고 있습니다.
Kevin Cruijssen


2

Perl 5 -p, 23 바이트

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

온라인으로 사용해보십시오!

소수 부분 만 입력으로 사용하고 (OP에서 허용 한대로) 1을 true로 출력하고 false를 출력하지 않습니다.

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

그 자체로 취한 소수 부분은 분모가 분자보다 10의 큰 다음 거듭 제곱 인 경우에만 분자와 정확히 동일합니다.


2

아니에요, 17 바이트

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

온라인으로 사용해보십시오!

설명

10aaa=log10n+1n엑스

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 바이트

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

온라인으로 사용해보십시오!

소수 부분 만 입력으로 사용합니다. xnor이 주석에서 언급 한 것처럼 :

이것은 "중요하지 않은 입력과 두 개의 숫자를 슬래시로 구분 된 문자열로, 두 번째 숫자가 10과 첫 번째 숫자 길이의 거듭 제곱인지 여부를 판별하는"것과 같습니다.

Robert S.의 대답 은 덜 골프지만 내 것보다 훨씬 흥미 롭습니다.



1

엑셀, 52 바이트

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

정수 입력을 무시합니다. 원래:IS Denominator = 10^LEN(Numerator)


분모가 <10^948 바이트로 제한되는 경우 :

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

논리의 대부분이 분리되고 /있습니다. 입력을 별도로 가져올 수있는 경우 16 바이트 :

=10^LEN(B1)-C1=0



1

C (gcc / clang), 59 49 47 바이트

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

포트 의 Chas 브라운 의 파이썬 2 대답 . 여기에서 온라인으로 사용해보십시오 .

입력의 정수 부분을 무시합니다. Jonathan Frech 에게 감사합니다2 바이트 골프 에게 .

언 골프 드 :

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
}

'/'아마 될 수 있습니다 47.
Jonathan Frech


감사합니다!
OOBalance

아니에요. 새로운 바이트 수를 반영하도록 헤더를 업데이트하는 것을 잊어 버린 것 같습니다.
Jonathan Frech

1

ForceLang, 86 78 바이트

set a io.readnum()
set b io.readnum()
set d number.parse a+b+""
io.write d=a+b
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.