숫자를 찾아 출력을 계산


22

목표

입력의 목록이 주어 6별개 3 개 자리 번호를 찾을 수 a, b그리고 c그러한 a × b = ca2 자릿수를 갖는 b1 자리를 갖는 c3 자리를 갖는. 보다 시각적으로 프로그램은이 이미지의 상자에 6 자리 숫자를 정렬해야합니다.

여기에 이미지 설명을 입력하십시오

둘 이상의 솔루션이 존재하면 그 중 하나를 출력 할 수 있습니다.

입력

6 자리 숫자. 당신은 당신의 언어에 대해 합리적인 방법으로 그들을 취할 수 있습니다.

산출

3 수 a, bc. 출력 형식은 3 개의 숫자가 분리되어 항상 같은 순서로 인쇄되는 한 (그러나 반드시 순서대로는 아님) 비교적 자유 롭습니다 a, b, c.

테스트 사례

1, 2, 3, 4, 5, 6 -> 54,3,162  
2, 3, 4, 5, 6, 7 -> 57,6,342 or 52,7,364

채점

바이트 단위의 가장 짧은 코드가 이깁니다.


1
내가 @Dada도 챌린지를 보았을 때 내가 생각했던 첫 번째 일이다. 나는 그것을 게시하기 전에 피드백을 얻기 위해 샌드 박스에 넣는 것이 좋습니다 :-)
Stewie Griffin

1
입력 결과 솔루션이 보장됩니까?
AdmBorkBork

1
나는 당신의 도전에 대한 문구를 상당히 명확하게하기 위해 편집했습니다 (제 의견으로는). 도전의 목표를 바꾸지 않았는지 확인하십시오.
Fatalize

1
또한 도전에는보다 명확한 제목이 필요하다고 생각하지만 지금은 아이디어가 없습니다.
Fatalize

1
0,1,2,3,4,5결과 입력이 13,4,052; 해결책 없음; 아니면 어떤 행동이 괜찮습니까?
Jonathan Allan

답변:


8

Brachylog (2), 10 바이트

p~c₃o.k×~t

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

합리적인 시간에 실행하기에는 너무 느립니다 (Brachylog 인터프리터는 매우 느린 제한 솔버를 사용하여 빈 문자열, 4 자리 숫자, 음수 등을 곱하는 데 오랜 시간을 소비합니다). TIO 링크는 3 자리 숫자의 입력 만 사용합니다 (이 프로그램은 임의의 숫자의 입력을 처리 할 수 ​​있습니다). 이것은 입력이 필요한 모든 자릿수를 포함하는 숫자 인 함수입니다 (예 : 234567입력에 중복이 없음은 0맨 앞에 0을 피하기 위해 항상 아무 것도 넣을 수 없음을 의미 함) . 주문 [b, a, c](예 :) [6, 57, 342].

설명

p~c₃o.k×~t
p           Permute the digits of the input
 ~c₃        Split them into three groups
    o       Sort the three groups
     .      to produce the output, which must have the following property:
      k     all but the last group
       ×    when multiplied together
        ~t  produces the last group

그룹의 요구 사항이 2, 1 및 3 자리가되어야합니까? 입력에 6 자리 숫자가 있고 그룹은 정렬 된 순서로되어 있습니다. 따라서 가능한 크기는 [1, 1, 4], [1, 2, 3] 또는 [2, 2, 2]입니다. 첫 번째 경우는 불가능합니다 (9 × 9는 81이므로 4 개의 숫자를 생성하기 위해 두 개의 1 자리 숫자를 곱할 수 없음), 두 번째 숫자는 두 자리 숫자를 곱할 수 없습니다 10 × 10에서도 100을 생성하므로 2 자리 숫자를 생성합니다. 따라서 리턴 값 [b, a, c]은 요청 된대로 1, 2 및 3 자리의 순서로되어 있어야하며, 따라서 a2 자리, b1 자리, c3 자리입니다.


2
음 ... 나는 항복
Fatalize

8

자바 스크립트 (ES6), 90 88 바이트

6 자리의 배열로 입력을받습니다. 가능한 솔루션 (예 :)을 설명하는 문자열을 반환 '54*3==162'하거나 솔루션이없는 경우 '너무 많은 재귀'오류와 함께 종료됩니다.

f=(a,k=1)=>eval(s='01*2==345'.replace(/\d/g,n=>a[n],a.sort(_=>(k=k*2%3779)&2)))?s:f(a,k)

작동 원리

결정 론적 알고리즘입니다.

소수 P=2와는 Q=3779정렬 콜백 것과 같은 방식으로 선택되었다 (k = k * P % Q) & 2시간별 입력 어레이의 모든 가능한 순열 (720)를 생성하도록 보장된다. 더 정확하게 말하면, 모든 순열은 2798 개의 정렬 후에 다뤄집니다. 이는 모든 브라우저의 재귀 한계 내에 있어야합니다.

01*2==345숫자를 배열의 해당 항목에 매핑 하여 식 에 각 순열을 삽입합니다 .

우리는이 표현을 평가하고 그것이 사실이 될 때까지 재귀 호출을합니다.

테스트


출력 형식이 여전히 유효하다고 가정하면 바이트 -대신 바이트를 저장하기 위해 대신 ==(을 반대로 ?:)을 사용하십시오.
Neil

1
@Neil 사실, 나는 zeppelin에 같은 제안을했습니다. 아마 골프를 더해야하지만 현재 출력 형식이 마음에 든다는 것을 인정해야합니다.
Arnauld

3379를 찾기 위해 무차별 적으로 또는 수학 추론을 사용 했습니까? 그렇다면 찾는 방법을 제공 할 수 있습니까? :)
Yytsi

@TuukkaX 정말 멋진 것은 없습니다. 난 그냥 그것을 무차별 내 기준은 1) P와 Q에 가능한 한 적은 수의 숫자와 2) 가능한 적은 정렬 반복입니다.
Arnauld

6

Brachylog , 17 바이트

p~c[Ċ,I,Ṫ]cᵐ.k×~t

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

설명

p                   Try a permutation of the Input
 ~c[Ċ,I,Ṫ]          Deconcatenate it; the result must be a list of the form [[_,_],_,[_,_,_]]
          cᵐ.       Output is the list of integers you get when mapping concatenate on the
                      previous list
             k×~t   The first two ints of the Output, when multiplied, result in the third
                      int of the Output

3

05AB1E , 15 13 바이트

Emigna 덕분에 2 바이트를 절약했습니다 !

œJvy3L£Â`*Qi,

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!

설명:

œ                 # Get all permutations of the input
 J                # Join them to get the numbers
  vy              # For each element in the list..
    3L            #   Push the list [1, 2, 3]
      £           #   Pops a and pushes [a[0:1], a[1:3], a[3:6]]
       Â`         #   Bifurcate and flatten
         *        #   Multiply the top two elements in the stack
          Qi      #   If equal to the third element..
            ,     #     Print the array

당신은 대체 할 수 213S3L순서가 있어야하지 않았다 같은 2,1,3사양에 따라.
Emigna

£누적 적으로 벡터화 된다는 것을 알게되어 기쁩니다.
Magic Octopus Urn

3

배쉬 + 코어 유틸리티, 70

for((b=1;b;));{
a=`shuf -ze $@`
b=${a:0:2}*${a:2:1}-${a:3:3}
}
echo $b

모든 순열을 생성하는 특히 쉬운 방법은 없습니다. 대신 무작위로 순열을 생성하고 좋은 것을 찾을 때까지 계산하십시오.

A*B-C결과는 올바른 순열이있을 때 0으로 평가되는 식 의 형태 입니다.

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



2

파이썬 2 , 105 바이트

lambda s:[(x[0],x[1:3],x[3:])for x in permutations(s)if eval('%s*%s%s==%s%s%s'%x)]
from itertools import*

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

보다 유연한 출력의 88 바이트 솔루션

lambda s:[x for x in permutations(s)if eval('%s*%s%s==%s%s%s'%x)]
from itertools import*

온라인으로 사용해보십시오!
여기서 출력은 [ '6', '5', '7', '3', '4', '2'] 대신 '6', '57', '342'


2
당신은 당신을 두지 않았다 import상단에 ... 쉐이크는 머리
mbomb007

@ mbomb007 TIO ¯ \ _ (ツ) _ / ¯ 작업을해야합니다
Rod

당신은 내가 f=헤더에 실제로 넣은 사람을 처음 본 사람 입니다. 별거 아니에요
mbomb007

2

PHP, 110 바이트

도착할 것이다 ... 결국 ...

<?$v=$argv;unset($v[0]);do shuffle($v)&[$a,$b,$c,$d,$e,$f]=$v;while("$a$b"*$c!="$d$e$f");echo"$a$b $c $d$e$f";

언 골프 드 :

<?
$v=$argv;
unset($v[0]);
do
  shuffle($v);
  [$a,$b,$c,$d,$e,$f]=$v;
while("$a$b"*$c!="$d$e$f");
echo"$a$b $c $d$e$f";

2

PHP, 77 바이트

for(;;)eval(strtr('0.*1-"428"||die("0.,1,428");',1/7,str_shuffle($argv[1])));

입력을 문자열로받습니다.


1

ES6 (자바 스크립트) 85, 82, 79 바이트

숫자 배열 (문자열)을 허용하고 3 요소 배열을 반환합니다. [A,B,C]=> C=A*B

골프

R=(w,[a,b,c,d,e,f]=w)=>f*(d+=e)^(a+=b+c)?R(w.sort(_=>Math.random()-.5)):[a,d,f]

EDITS :

  • dand 를 재사용하여 3 바이트를 더 절약 a하고 ==(Thanks @Arnauld!)
  • 구조적 할당을 사용하여 3 바이트 절약

시도 해봐 !

R=(w,[a,b,c,d,e,f]=w)=>f*(d+=e)^(a+=b+c)?R(w.sort(_=>Math.random()-.5)):[a,d,f];

function generate(A) {
   console.log(R([...A]));
}
<input type="text" id="A" value="123456"/><button onclick="generate(A.value)">GENERATE</button>


임의의 정렬이 실제로 모든 순열을 다룰 것이라고 보장 할 수 있습니까?
Neil

@Neil, 당신이 엄격한 공식적인 증거를 찾고 있다면, 나는 당신에게 하나를 제공 할 수 없다고 생각하지만, 경험적으로 그것은 순열의 거의 균일 한 분포를 초래합니다.
zeppelin

1

, 18 바이트

17 바이트 코드, -S플래그는 +1

$/_=1FI_^@3,5MPMa

명령 행 인수를 통해 입력을 문자열로 취합니다. 출력은 c, b, a 순서입니다. 온라인으로 사용해보십시오!

이 코드는 여러 솔루션이있는 경우 모든 솔루션을 출력 합니다. 하나의 솔루션 만 출력해야하는 경우 3 바이트를 추가하고 프로그램을에 래핑하십시오 (...0).

설명

                   a is 1st cmdline arg (implicit)
              PMa  Compute all permutations of a
             M     To each, map this function:
          3,5       Range(3,5)--contains values 3 and 4
       _^@          Split the function argument at those indices
                    This transforms a string like 342657 into a list [342; 6; 57]
     FI            Now filter the list of split permutations on this function:
$/_                 Fold on division: takes 1st element and divides it by the rest
   =1               Compare the quotient with 1
                    This keeps only the permutations where the first number is the product
                    of the other two
                   Autoprint the list (implicit), with each sublist on a separate line
                   and space-separated (-S flag)

1

루비, 60 바이트

->x{x.permutation{|a|(eval a="%d%d*%d==%d%d%d"%a)&&puts(a)}}

모든 솔루션을 "a * b == c"로 인쇄합니다

예:

->x{x.permutation{|a|(eval a="%d%d*%d==%d%d%d"%a)&&puts(a)}}[[1,2,3,4,5,6]]
54*3==162

->x{x.permutation{|a|(eval a="%d%d*%d==%d%d%d"%a)&&puts(a)}}[[2,3,4,5,6,7]]
52*7==364
57*6==342

1

배치, 305 바이트

@echo off
set/pd=
for /l %%i in (0,1,719)do set n=%%i&call:c
exit/b
:c
set t=%d%
set s=
for /l %%j in (6,-1,1)do set/ap=n%%%%j,n/=%%j&call:l
set s=%s:~0,2%*%s:~2,1%-%s:~3%
set/an=%s%
if %n%==0 echo %s%
exit/b
:l
call set u=%%t:~%p%%%
call set s=%%s%%%%u:~,1%%
call set t=%%t:~,%p%%%%%u:~1%%

STDIN에 입력을 문자열로 [1-9]{6}취하여 모든 솔루션을 dd*d-ddd형식으로 출력 합니다. 배치는 문자열 조작에별로 좋지 않으므로 720 순열을 생성하는 것이 약간 어색합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.