Tìm số và tính đầu ra


22

Mục tiêu

Với một danh sách đầu vào của 6chữ số riêng biệt, tìm 3 số a, bcnhư vậy a × b = c, với aviệc có 2 chữ số, bcó 1 chữ số và ccó 3 chữ số. Nói một cách trực quan hơn, chương trình của bạn phải sắp xếp 6 chữ số đó vào các ô của hình ảnh này:

nhập mô tả hình ảnh ở đây

Nếu có nhiều giải pháp tồn tại, bạn có thể xuất bất kỳ giải pháp nào trong số đó.

Đầu vào

6 chữ số riêng biệt. Bạn có thể sử dụng chúng theo bất kỳ cách hợp lý nào cho ngôn ngữ của bạn.

Đầu ra

3 số a, bc. Định dạng đầu ra tương đối miễn phí, miễn là 3 số được tách ra và luôn được in theo cùng một thứ tự (nhưng không nhất thiết phải theo thứ tự a, b, c).

Các trường hợp thử nghiệm

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

Chấm điểm

Mã ngắn nhất tính bằng byte thắng.


1
Đó là điều đầu tiên tôi nghĩ đến khi thấy thử thách quá @Dada ... Tôi khuyên bạn nên đặt nó vào hộp cát để nhận được một số phản hồi trước khi đăng nó :-)
Stewie Griffin

1
Là đầu vào được đảm bảo để dẫn đến một giải pháp?
admBorkBork

1
Tôi đã chỉnh sửa từ ngữ của thách thức của bạn khá nhiều để làm cho nó rõ ràng (theo ý kiến ​​của tôi). Hãy chắc chắn rằng tôi đã không thay đổi mục tiêu của thử thách.
Gây tử vong vào

1
Tôi cũng nghĩ rằng thách thức cần một tiêu đề rõ ràng hơn, nhưng tôi không có ý tưởng ngay bây giờ.
Gây tử vong vào

1
Nếu một đầu vào của 0,1,2,3,4,5kết quả trong 13,4,052; không có giải pháp; hoặc có hành vi nào ổn không?
Jonathan Allan

Câu trả lời:


8

Brachylog (2), 10 byte

p~c₃o.k×~t

Hãy thử trực tuyến!

Quá chậm để chạy trong một khoảng thời gian hợp lý (trình thông dịch Brachylog dành một thời gian dài để thực hiện phép nhân trên các chuỗi trống, số có 4 chữ số, số âm, v.v ... sử dụng bộ giải ràng buộc rất chậm). Liên kết TIO sử dụng đầu vào chỉ có 3 chữ số (chương trình này có thể xử lý đầu vào với bất kỳ số chữ số nào). Đây là một hàm có đầu vào là một số chứa tất cả các chữ số cần thiết (ví dụ 234567) - việc thiếu trùng lặp trong đầu vào có nghĩa là bạn luôn có thể đặt bất kỳ 0ở cuối để tránh số 0 đứng đầu - và đầu ra của nó là một danh sách trong thứ tự [b, a, c](ví dụ [6, 57, 342]).

Giải trình

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

Vì vậy, yêu cầu về các nhóm là 2, 1 và 3 chữ số đi đâu? Vâng, chúng tôi biết có 6 chữ số trong đầu vào, và các nhóm theo thứ tự được sắp xếp. Do đó, các kích thước có thể có duy nhất mà họ có thể có là [1, 1, 4], [1, 2, 3] hoặc [2, 2, 2]. Trường hợp đầu tiên là không thể (bạn không thể nhân hai số có 1 chữ số để tạo số có 4 chữ số, vì 9 × 9 chỉ là 81), như trường hợp cuối cùng (bạn không thể nhân hai số có 2 chữ số với tạo ra một số có 2 chữ số, thậm chí 10 × 10 tạo ra 100). Do đó, các giá trị trả về[b, a, c] phải dài 1, 2 và 3 chữ số theo thứ tự đó, a2 chữ số, blà 1 chữ số và clà 3 chữ số, theo yêu cầu.


2
Chà ... tôi đầu hàng
Fatalize 16/2/2017

8

JavaScript (ES6), 90 88 byte

Lấy đầu vào là một mảng gồm 6 chữ số. Trả về một chuỗi mô tả một giải pháp có thể (chẳng hạn như '54*3==162') hoặc thoát với lỗi 'quá nhiều đệ quy' nếu (và chỉ khi) không có giải pháp.

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)

Làm thế nào nó hoạt động

Đây là một thuật toán xác định.

Các số nguyên tố P=2Q=3779được chọn theo cách mà cuộc gọi lại sắp xếp (k = k * P % Q) & 2được đảm bảo để tạo ra tất cả 720 hoán vị có thể có của mảng đầu vào theo thời gian. Chính xác hơn, tất cả các hoán vị được bao phủ sau 2798 loại - phải nằm trong giới hạn đệ quy của tất cả các trình duyệt.

Chúng tôi tiêm từng hoán vị trong biểu thức 01*2==345 bằng cách ánh xạ các chữ số đến các mục tương ứng trong mảng.

Chúng tôi đánh giá biểu thức này và thực hiện các cuộc gọi đệ quy cho đến khi nó đúng.

Kiểm tra


Giả sử định dạng đầu ra vẫn hợp lệ, sử dụng -thay vì ==(và đảo ngược ?:) để lưu một byte.
Neil

1
@Neil Thật ra, tôi đã đưa ra đề nghị tương tự với zeppelin. Tôi có lẽ nên chơi golf nhiều hơn nữa, nhưng tôi phải thừa nhận rằng tôi thích định dạng đầu ra hiện tại.
Arnauld

Bạn đã tàn bạo để tìm ra 3379, hay bạn đã sử dụng lý luận toán học? Nếu vậy, có thể cung cấp cách của bạn để tìm thấy nó? :)
Yytsi

@TuukkaX Không có gì thực sự lạ mắt ở đây. Tôi chỉ đánh giá nó, tiêu chí của tôi là 1) càng ít chữ số càng tốt cho P và Q và 2) càng ít lần lặp càng tốt.
Arnauld

6

Brachylog , 17 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

Đã lưu hai byte nhờ Emigna !

œJvy3L£Â`*Qi,

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!

Giải trình:

œ                 # 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

Bạn có thể thay thế 213Sbằng 3Lthứ tự không phải 2,1,3theo thông số kỹ thuật.
Emigna

£Thật tốt khi biết rằng tích lũy hóa ... Nếu đó là cách chính xác để nói điều đó.
Bạch tuộc ma thuật Urn

3

Bash + coreutils, 70

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

Không có cách đặc biệt dễ dàng để tạo ra tất cả các hoán vị. Thay vào đó ngẫu nhiên tạo ra hoán vị và tính toán cho đến khi chúng ta tìm thấy một cái tốt.

Đầu ra ở dạng A*B-C - tức là biểu thức sẽ ước lượng bằng 0 khi chúng ta có hoán vị đúng.

Hãy thử trực tuyến .



2

Python 2 , 105 byte

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*

Hãy thử trực tuyến!

Giải pháp 88 byte với đầu ra linh hoạt hơn

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

Hãy thử trực tuyến!
trong đó đầu ra sẽ là ['6', '5', '7', '3', '4', '2'] thay vì '6', '57', '342'


2
Bạn đã không đặt bạn importlên hàng đầu ... lắc đầu
mbomb007

@ mbomb007 phải hoạt động trên TIO \ _ (ツ) _ /
Rod

Bạn là người đầu tiên tôi thấy người thực sự đặt f=tiêu đề. Nó không phải là một việc lớn.
mbomb007

2

PHP, 110 byte

Nó sẽ đến đó ... cuối cùng ...

<?$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";

Ung dung:

<?
$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 byte

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

Đưa đầu vào dưới dạng một chuỗi.


1

ES6 (Javascript), 85, 82, 79 byte

Chấp nhận một mảng các chữ số (chuỗi), trả về mảng 3 phần tử [A,B,C]=> C=A*B

Chơi gôn

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

CHỈNH SỬA:

  • Đã lưu thêm 3 byte bằng cách sử dụng lại daloại bỏ ==(Cảm ơn @Arnauld!)
  • Đã lưu 3 byte bằng cách sử dụng phép gán hủy

Thử nó !

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>


Bạn có thể đảm bảo rằng sắp xếp ngẫu nhiên của bạn sẽ thực sự bao gồm tất cả các hoán vị?
Neil

@Neil, nếu bạn đang tìm kiếm bằng chứng chính thức nghiêm ngặt, tôi không nghĩ rằng tôi có thể cung cấp cho bạn một bằng chứng, nhưng về mặt thực nghiệm, điều đó dẫn đến việc phân phối khá nhiều hoán vị.
zeppelin

1

Pip , 18 byte

17 byte mã, +1 cho -Scờ.

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

Đưa đầu vào dưới dạng một chuỗi các chữ số thông qua đối số dòng lệnh. Đầu ra theo thứ tự c, b, a. Hãy thử trực tuyến!

Mã này xuất ra tất cả các giải pháp nếu nhiều tồn tại. Nếu nó được yêu cầu chỉ xuất ra một giải pháp, sau đó thêm ba byte và gói chương trình vào (...0).

Giải trình

                   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

Ruby, 60 byte

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

In tất cả các giải pháp dưới dạng "a * b == c"

Thí dụ:

->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

Hàng loạt, 305 byte

@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%%

Lấy đầu vào trên STDIN dưới dạng chuỗi [1-9]{6}và xuất tất cả các giải pháp ở dd*d-dddđịnh dạng. Batch không giỏi về thao tác chuỗi nên việc tạo ra hoán vị 720 là một chút khó xử.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.