곱하고 나누기


10

주어진 값 x 는 모든 원래 숫자를 유지하면서 x 를 곱하고 x 로 나눌 수있는 y 보다 큰 가장 작은 숫자 값을 찾습니다 .

  • 새로운 숫자는 숫자를 잃지 않습니다.
  • 새로운 숫자는 숫자를 얻지 못합니다.

예를 들면 다음과 같습니다.

입력 : x = 2, y = 250000

  • 원본 : 285714
    • 사단 : 142857
    • 곱셈 : 571428

285714y 보다 크기 때문에 이것은 사실입니다 . 다음으로 나누었을 때 의 X 결과 142,857 과 곱한 경우 X의 결과 571,428 . 두 테스트 모두 285714 의 모든 원래 숫자 가 존재하며 추가 숫자는 추가되지 않았습니다.


규칙

  • 계산하는 데 시간이 오래 걸리므로 X2 또는 3 이어야합니다 .
  • Y0 보다 큰 정수 여야 합니다 .
  • 가장 짧은 코드가 승리합니다.

테스트 사례

테스트가 가장 빠르기 때문에 가장 일반적인 테스트 사례입니다.

  • x = 2, y = 250000 = 285714
  • x = 2, y = 290000 = 2589714
  • x = 2, y = 3000000 = 20978514
  • x = 3, y = 31000000 = 31046895
  • x = 3, y = 290000000 = 301046895

설명

  • 나누기 유형은 중요하지 않습니다. 2.05, 0.25 및 5.20을 얻을 수 있다면 자유롭게 느끼십시오.

모두에게 행운을 빕니다!


4
" X는 2와 5 사이의 값이어야합니다 ." -X> = 4 인 경우 X를 곱한 숫자는 X를 곱한 숫자보다 16 배 이상 커지므로 더 많은 자릿수를 갖습니다.
ngn

2
곱이 몫의 x ^ 2 곱하기 때문에 x는 2 또는 3 이외의 다른 값을 가질 수 없으며 둘 다 같은 자릿수를 가져야합니다. x = 1은 사소한 경우입니다. IMO, 내가 잘못하더라도 x = 3에 대한 해결책은 없습니다.
Jatin Sanghvi

2
나누기 부동 또는 정수 나누기입니까?
Outgolfer Erik

3
테스트 사례는 훌륭 할 것입니다
Stephen

3
나는 부동 소수점 출력이 고려되는지 여부에 따라 정답이 변경 될 수 있기 때문에 설명이 실제로 도전을 모호 하게하기 때문에 투표를 다시 열지 않기를 거부하는 유일한 사람이 아니라고 생각합니다. @EriktheOutgolfer의 질문에 부동 소수점 출력을 허용하는 것이 아니라 잘린 정수 나누기 를 사용할 수 있는지에 대한 질문이 의심됩니다 . (그리고 내 의견이 혼란
Ørjan Johansen

답변:


4

껍질 , 14 바이트

ḟ§¤=OoDd§¤+d*/

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

설명

ḟ§¤=O(Dd)§¤+d*/  -- example inputs: x=2  y=1
ḟ                -- find first value greater than y where the following is true (example on 285714)
 §               -- | fork
         §       -- | | fork
              /  -- | | | divide by x: 142857
                 -- | | and
             *   -- | | | multiply by y: 571428
                 -- | | then do the following with 142857 and 571428
                 -- | | | concatenate but first take
           +     -- | | | | digits: [1,4,2,8,5,7] [5,7,1,4,2,8]
          ¤ d    -- | | | : [1,4,2,8,5,7,5,7,1,4,2,8]
                 -- | and
       d         -- | | digits: [2,8,5,7,1,4]
      D          -- | | double: [2,8,5,7,1,4,2,8,5,7,1,4]
                 -- | then do the following with [2,8,5,7,1,4,2,8,5,7,1,4] and [1,4,2,8,5,7,5,7,1,4,2,8]
   =             -- | | are they equal
  ¤ O            -- | | | when sorted: [1,1,2,2,4,4,5,5,7,7,8,8] [1,1,2,2,4,4,5,5,7,7,8,8]
                 -- | : truthy
                 -- : 285714

더 가까운 시작점을 얻기 위해 y 값을 조정했으며 결과는 x = 3, y = 25000000에 대해 올바르지 않습니다 .
Emma-PerpetualJ

@PerpetualJ : 그런 다음 결과를 알고 있다면 당신은 간단하게 조정할 수 y로 하고, 이 버전이 있어야한다 약간 더 빠른 (만하지만 유형 검사).
ბიმო

나는 약간의 생각 후에 그것을 조정했고 나의 첫번째 코멘트를 편집했다.
Emma-PerpetualJ

@PerpetualJ : 나는 그것을 고쳤다 : -어느 것이 잘못되었는지 에 대한 가정을했다 .
ბიმო

1
@PerpetualJ : 나는 프로그램을 썼다;) 나는 설명을 추가했다. 이제 모든 사람들은 무슨 일이 일어나고 있는지 이해해야한다.
ბიმო

5

Brachylog v2, 15 바이트

t<.g,?kA/p.∧A×p

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

형식으로 입력을 [x,y]받습니다.

설명

t<.g,?kA/p.∧A×p
t                  Tail (extract y from the input)
 <                 Brute-force search for a number > y, such that:
  .                  it's the output to the user (called ".");
   g                 forming it into a list,
    ,?               appending both inputs (to form [.,x,y]),
      k              and removing the last (to form [.,x])
       A             gives a value called A, such that:
        /              first ÷ second element of {A}
         p             is a permutation of
          .            .
           ∧         and
            A×         first × second element of {A}
              p        is a permutation of {.}

해설

여러 값을 여러 번 재사용 할 때 Brachylog의 약점이 여기에 표시됩니다. 이 프로그램은 거의 모든 배관 및 알고리즘이 거의 없습니다.

따라서 단순히 y 의 값을 하드 코딩하는 것이 더 편리해 보일 수 있습니다 (이 질문에 대한 의견은 2가 유일한 값이라는 가설을 세웁니다). 그러나 실제로 y = 3에 대한 솔루션 이 있습니다. 불행히도 배관 공사는 y 의 값도 처리해야합니다 . 내가 아는 가장 작은 것은 다음과 같습니다.

                         315789473684210526
315789473684210526 × 3 = 947368421052631578
315789473684210526 ÷ 3 = 105263157894736842

(이 숫자를 찾는 데 사용한 기술은 완전히 일반적인 것이 아니므로 다른 방법을 사용하면 더 작은 솔루션이있을 수 있습니다.)

그러나이 프로그램 으로 이를 확인하지는 못할 것 입니다. Brachylog p는 특수한 경우 (예 : 입력과 출력이 이미 알려진 경우)에 대해 최적화되지 않은 매우 일반적인 방식으로 작성되었으며, 정렬을 통해 O ( n log n ) 에서 확인할 수 있음 내가 사용하고 있다고 생각하는 무차별 대입 접근법의 경우 O ( n !) 보다 ). 결과적으로 105263157894736842가 315789473684210526의 순열인지 확인하는 데 시간이 오래 걸립니다 (현재 명확한 진행없이 몇 분 동안 그대로 두었습니다).

(편집 : 나는 Brachylog 소스를 확인했습니다. p알려진 두 개의 정수 를 사용하면 사용 된 알고리즘은 알고리즘으로 출력 정수와 동일한 정수를 찾을 때까지 해당 정수의 가능한 모든 순열을 생성합니다. "입력 → 자릿수, permute 자릿수 → outdigits, outdigits → output"입니다.보다 효율적인 알고리즘은 우선 자릿수 / 출력 관계를 설정 하여 순열 내의 역 추적이 사용 가능한 자릿수를 고려할 수 있도록하는 것입니다.)


포크를 사용하면 코드를 1 바이트 줄일 수 있습니다. 온라인으로 사용해보십시오!
Kroppeb

또한 문서에 따르면 알려진 두 목록이 순열인지 확인하는 것 같습니다. swi-prolog.org/pldoc/man?predicate=permutation/2
Kroppeb

@Kroppeb : 문제는 Brachylog가 두 개의 알려진 정수를 인수로 제공하더라도 알려진 두 개의 목록으로 p실행되지 않는다는 것입니다 permutation/2. 첫 번째 정수의 모든 순열 ( 하나의 알려진 목록 permutation/2과 함께 사용 )을 생성 한 다음 두 번째 정수와 비교합니다.
ais523



3

q, 65 바이트

{f:{asc 10 vs x};while[not((f y)~f y*x)&(f y*x)~f"i"$y%x;y+:1];y}

10 진법으로 숫자를 나누고 각 오름차순으로 정렬하고 같은지 확인하십시오. 그렇지 않으면 y를 증가시키고 다시 가십시오


3

자바 스크립트 (ES6), 76 73 69 바이트

eval()@ShieruAsakoto가 제안한대로을 사용하여 3 바이트 를 절약했습니다.

로 입력을 (x)(y)받습니다.

x=>y=>eval("for(;(g=x=>r=[...x+''].sort())(y*x)+g(y/x)!=g(y)+r;)++y")

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

재귀 버전은 62 바이트 이지만 필요한 반복 횟수가 많기 때문에 여기에 적합하지 않습니다.

어떻게?

g

예:

g(285714) = [ '1', '2', '4', '5', '7', '8' ]

y×xy/xyg(y×x)g(y/x)g(y)

두 개의 배열을 함께 추가하면 각 배열이 쉼표로 구분 된 문자열로 암시 적으로 강제됩니다. 첫 번째 배열의 마지막 숫자는 두 번째 배열의 첫 번째 숫자와 쉼표없이 직접 연결되므로이 형식은 모호하지 않습니다.

예:

g(123) + g(456) = [ '1', '2', '3' ] + [ '4', '5', '6' ] = '1,2,34,5,6'

그러나:

g(1234) + g(56) = [ '1', '2', '3', '4' ] + [ '5', '6' ] = '1,2,3,45,6'

댓글

x => y =>                   // given x and y
  eval(                     // evaluate as JS code:
    "for(;" +               //   loop:
      "(g = x =>" +         //     g = helper function taking x
        "r =" +             //       the result will be eventually saved in r
          "[...x + '']" +   //       coerce x to a string and split it
          ".sort() + ''" +  //       sort the digits and coerce them back to a string
      ")(y * x) +" +        //     compute g(y * x)
      "g(y / x) !=" +       //     concatenate it with g(y / x)
      "g(y) + r;" +         //     loop while it's not equal to g(y) concatenated with
    ")" +                   //     itself
    "++y"                   //   increment y after each iteration
  )                         // end of eval(); return y

66 : x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):yy가 솔루션 tho와 거리가 멀면 스택 오버플로가 발생할 수 있습니다.
Shieru Asakoto

또는 75 사용 eval:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
Shieru Asakoto

@ShieruAsakoto eval()아이디어 주셔서 감사합니다 . 내 첫 번째 시도는 실제로 재귀 였지만 필요한 반복 횟수가 많기 때문에 포기했습니다.
Arnauld

3

하스켈, 76 74 바이트

Lynn의 의견 덕분에 2 바이트가 줄었습니다.

import Data.List
s=sort.show
x#y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0

1
같은 바이트 수에 대한 ff x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0있지만 연산자로 대답을 정의하면 두 바이트가 절약됩니다. x!y=…그러면 대답은 (!):)
Lynn

목록 이해를 사용하지 않았다! 제안 해 주셔서 감사합니다 : D
umnikos

2

apt, 24 바이트

몇 가지 맥주에 대한 순진한 해결책. 더 좋은 방법이 있다고 확신합니다.

@[X*UX/U]®ì nÃeeXì n}a°V

시도 해봐


불행히도 x = 3이고 y = 25000 일 때 잘못된 결과가 발생 합니다.
Emma-PerpetualJ

@PerpetualJ 가정 315789473684210526x=3Javascript 또는 Japt 배정 밀도에 맞지 않기 때문에 올바르게 계산할 수없는 첫 번째 솔루션 이라고 가정 합니다.
Bubbler

@PerpetualJ는 이전에 수정되었습니다. 그러나 버블 러는 위에서 언급 한 이유로 테스트 케이스가 완료되지 않습니다.
얽히고 설킨

@Shaggy 이제 올바른 결과가 나오고 Bubbler가 지적한 솔루션이 25000을 넘는 첫 번째 올바른 결과가 아닙니다 . 궁금하다면 내 테스트 사례를 참조하십시오. +1
Emma-PerpetualJ


1

젤리 ,  14  13 바이트

-1-Outgolfer Erik 덕분에 (``make_digits를 사용하므로 D필수는 아닙니다)
버그 수정 +2 (Out-by one 이슈를 지적한 Outgolfer Erik에게 다시 감사드립니다)

×;÷;⁸Ṣ€E
‘ç1#

결과를 인쇄하는 전체 프로그램 (2 진 링크로 길이 1의 목록이 생성됨).

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

어떻게?

×;÷;⁸Ṣ€E - Link 1, checkValidity: n, x               e.g. n=285714,  x=2
×        -     multiply -> n×x                       571428
  ÷      -     divide -> n÷x                         142857
 ;       -     concatenate -> [n×x,n÷x]              [571428,142857]
    ⁸    -     chain's left argument = n             285714
   ;     -     concatenate -> [n×x,n÷x,n]            [571428,142857,285714]
     Ṣ€  -     sort €ach (implicitly make decimals)  [[1,2,4,5,7,8],[1,2,4,5,7,8],[1,2,4,5,7,8]]
        E    -     all equal?                        1

‘ç1# - Main link: y, x
‘    - increment -> y+1
   # - count up from n=y+1 finding the first...
  1  - ...1 match of:
 ç   -   the last link (1) as a dyad i.e. f(n, x)

나누기가 정확하지 않은 D경우 정렬 전에 적용된 암시 적 십진 명령어 (a와 동등 )는 소수 부분을 생성합니다.
예 : 1800÷3D-> [6,0,0]
while- 1801÷3D>[6.0,0.0,0.33333333333337123]


이 답변이 유효한지 확실하지 않습니다. 도전은 결과가 " y 보다 큼"을 요구하며 , 이는 " Y 보다 큼"으로 해석됩니다 . 또한 필요하지 않습니다 D.
Outgolfer Erik

아 좋은 자리는 >=완전히 놓쳤다! make_digits가 설정되어 있는지 전혀 몰랐 습니다. 감사합니다. 그래도 나중에 수정하고 업데이트해야합니다 ...
Jonathan Allan

1

매스 매 티카, 82 74 바이트

x=Sort@*IntegerDigits;Do[If[x[i#]==x@Floor[i/#]==x@i,Break@i],{i,#2,∞}]&

tsh 덕분에 -8 바이트

로 인수를 취하는 함수입니다 [x,y]. 효과적으로 무작위 력 자릿수의 정렬 된 목록을 검사하는 경우 그 검색 y, y/xxy동일하다.

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


나는 Mathematica에 익숙하지 않습니다. 모든 ANS, ANS / X, ANS * X 9로 나누어해야하며 :하지만 당신이 부문의 소수 부분을 삭제 바로 경우 대답은 여전히이 될 것이라고 입증 할 수있는 솔루션을 짧게 할 수 있습니다.
tsh

@tsh 그건 효과가 x=3있지만 확실하지는 않습니다 x=2.
Ørjan Johansen

@ ØrjanJohansen하자 v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n], u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]. 그리고 u-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])이후로는 10^x-10^y=0 (mod 9)항상 보유하고 있습니다. u-v=0 (mod 9)항상 보유합니다. 경우 거기에 잘못 대답은 w이후 w*x-w=0 (mod 9), 그리고 w-floor(w/x)=0 (mod 9)우리가 있습니다 floor(w/x)=0 (mod 9). if floor(w/x)*x <> w, w-floor(w/x)*x>=9그러나 w-floor(w/x)*x<xx는 2 또는 3
tsh

감사합니다! 이 점을 얻기 위해 너무 먼 길을 복용 다른 사람의 이익을 위해, w=0 (mod 9)에서가 다음 w*x-w=0 (mod 9)때문에 x-1나눌 수없는 3가
Ørjan 요한센

IntegerQ테스트를 제외하면 IntegerDigits분수에서 시도 할 때 몇 가지 오류가 발생 하지만 Mathematica는 여전히 그 오류를 무시하고 정답을 생성합니다. 최종 답변이 정확하더라도 계산 중에 포함 된 오류가 허용되는지 확실하지 않습니다.
numbermaniac

0

APL (NARS), 490 자, 980 바이트

T←{v←⍴⍴⍵⋄v>2:7⋄v=2:6⋄(v=1)∧''≡0↑⍵:4⋄''≡0↑⍵:3⋄v=1:5⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
D←{x←{⍵≥1e40:,¯1⋄(40⍴10)⊤⍵}⍵⋄{r←(⍵≠0)⍳1⋄k←⍴⍵⋄r>k:,0⋄(r-1)↓⍵}x}
r←c f w;k;i;z;v;x;y;t;u;o ⍝   w  cxr
   r←¯1⋄→0×⍳(2≠T c)∨2≠T w⋄→0×⍳(c≤1)∨w<0⋄→0×⍳c>3
   r←⌊w÷c⋄→Q×⍳w≤c×r⋄r←r+c
Q: u←D r⋄x←1⊃u⋄y←c×x⋄t←c×y⋄o←↑⍴u⋄→0×⍳o>10⋄→A×⍳∼t>9
M:                     r←10*o⋄⍞←r⋄→Q
A: u←D r⋄→M×⍳x≠1⊃u⋄→B×⍳∼(t∊u)∧y∊u⋄z←r×c⋄v←D z⋄→C×⍳(⍳0)≡v∼⍦u
B: r←r+1⋄→A
C: k←z×c⋄⍞←'x'⋄→B×⍳(⍳0)≢v∼⍦D k
   ⎕←' '⋄r←z

테스트

  2 f¨250000 290000 3000000
xxxx 
1000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
10000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
285714 2589714 20978514 
 3 f¨ 31000000 290000000 
xxxxxxxxx 
100000000xxxxxxxxxxxxxxxxxxxxxxxxxx 
31046895 301046895 

나는 r이 r에 가까운 r (x와 y가 입력되는 값)로 시작하는 방식으로 r, r * x, r * x * x가 3 인 숫자를 가질 수있는 ra 편리한 숫자로 문제를 생각했습니다. 기본 게시물과 동일한 문자를 사용하는 문제). r의 첫 번째 숫자가 r보다 d 인 경우 r (또는 더 나은 r * x)을 하나의 솔루션으로 만들기 위해 d * x 및 d * x * x도 숫자로 표시되어야한다는 관찰을 사용했습니다.


0

05AB1E , 16 바이트

[>©Ð²÷s²*)€{Ë®s#

온라인으로 사용해보십시오. (참고 : 매우 비효율적 인 솔루션이므로 결과에 가까운 입력을 사용하십시오. 더 큰 입력에 대해서는 로컬에서도 작동하지만 TIO에서는 60 초 후에 시간이 초과됩니다.)

설명:

[                   # Start an infinite loop
 >                  #  Increase by 1 (in the first iteration the implicit input is used)
  ©                 #  Store it in the register (without popping)
   Ð                #  Triplicate it
    ²÷              #  Divide it by the second input
      s             #  Swap so the value is at the top of the stack again
       ²*           #  Multiply it by the second input
         )          #  Wrap all the entire stack (all three values) to a list
          €{        #  Sort the digits for each of those lists
             ®s     #  Push the value from the register onto the stack again
            Ë       #  If all three lists are equal:
               #    #   Stop the infinite loop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.