Temukan angka dan hitung output

22

Objektif

Diberikan daftar input 6digit yang berbeda, temukan 3 angka a, bdan csedemikian rupa sehingga a × b = c, dengan amemiliki 2 digit, bmemiliki 1 digit dan cmemiliki 3 digit. Dengan cara yang lebih visual, program Anda harus mengatur 6 digit di dalam kotak gambar ini:

masukkan deskripsi gambar di sini

Jika ada lebih dari satu solusi, Anda dapat mengeluarkan salah satu dari mereka.

Memasukkan

6 digit berbeda. Anda dapat menggunakannya dengan cara apa pun yang masuk akal untuk bahasa Anda.

Keluaran

3 angka a, bdan c. Format output relatif bebas, selama 3 angka dipisahkan dan selalu dicetak dalam urutan yang sama (tetapi tidak harus dalam urutan a, b, c).

Uji Kasus

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

Mencetak gol

Kode terpendek dalam byte menang.

HABJAN
sumber
1
Itulah hal pertama yang saya pikirkan ketika saya melihat tantangan juga @ Dada ... Saya sarankan memasukkannya ke dalam kotak pasir untuk mendapatkan umpan balik sebelum mempostingnya :-)
Stewie Griffin
1
Apakah input dijamin menghasilkan solusi?
AdmBorkBork
1
Saya telah mengedit kata-kata dari tantangan Anda sedikit untuk membuatnya jelas (menurut saya). Pastikan saya tidak mengubah tujuan tantangan.
Fatalkan
1
Saya juga berpikir tantangannya membutuhkan judul yang lebih eksplisit, tetapi saya kehabisan ide sekarang.
Fatalkan
1
Haruskah input 0,1,2,3,4,5hasil dalam 13,4,052; tidak ada solusi; atau apakah ada perilaku yang OK?
Jonathan Allan

Jawaban:

8

Brachylog (2), 10 byte

p~c₃o.k×~t

Cobalah online!

Terlalu lambat untuk dijalankan dalam jangka waktu yang wajar (juru bahasa Brachylog menghabiskan waktu lama melakukan perkalian pada string kosong, angka 4 digit, angka negatif, dll. Menggunakan pemecah kendala yang sangat lambat). TIO link menggunakan input dengan hanya 3 digit (program ini dapat menangani input dengan jumlah digit berapa pun). Ini adalah fungsi yang inputnya adalah angka yang berisi semua digit yang diperlukan (mis. 234567) - kurangnya duplikat dalam input berarti bahwa Anda selalu dapat dengan mudah meletakkannya 0di bagian akhir untuk menghindari angka nol di depan - dan yang hasilnya adalah daftar di memesan [b, a, c](misalnya [6, 57, 342]).

Penjelasan

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

Jadi kemana perginya persyaratan pada kelompok menjadi 2, 1, dan 3 digit? Kita tahu ada 6 digit dalam input, dan grup dalam urutan. Oleh karena itu, satu-satunya ukuran yang mungkin mereka miliki adalah [1, 1, 4], [1, 2, 3], atau [2, 2, 2]. Kasing pertama tidak mungkin (Anda tidak dapat mengalikan dua angka 1 digit untuk menghasilkan angka 4 digit, karena 9 × 9 hanya 81), seperti kasing terakhir (Anda tidak dapat mengalikan dua nomor 2 digit ke angka menghasilkan angka 2 digit, karena bahkan 10 × 10 menghasilkan 100). Jadi, nilai pengembalian [b, a, c]harus panjang 1, 2, dan 3 digit dalam urutan itu, demikian ajuga 2 digit, badalah 1 digit, dan c3 digit, seperti yang diminta.


sumber
2
Baiklah ... Saya menyerah
Fatalkan
8

JavaScript (ES6), 90 88 byte

Mengambil input sebagai array 6 digit. Mengembalikan string yang menggambarkan solusi yang mungkin (seperti '54*3==162') atau keluar dengan kesalahan 'terlalu banyak rekursi' jika (dan hanya jika) tidak ada solusi.

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)

Bagaimana itu bekerja

Ini adalah algoritma deterministik.

Primes P=2dan Q=3779dipilih sedemikian rupa sehingga panggilan balik semacam (k = k * P % Q) & 2dijamin untuk menghasilkan semua 720 kemungkinan permutasi dari array input dari waktu ke waktu. Lebih tepatnya, semua permutasi dicakup setelah 2798 macam - yang harus dalam batas rekursi dari semua browser.

Kami menyuntikkan setiap permutasi dalam ekspresi 01*2==345dengan memetakan digit ke entri yang sesuai dalam array.

Kami mengevaluasi ungkapan ini dan melakukan panggilan rekursif sampai benar.

Uji

Arnauld
sumber
Dengan asumsi format output masih valid, gunakan -alih-alih ==(dan balikkan ?:) untuk menyimpan byte.
Neil
1
@ Neil Sebenarnya, saya membuat saran yang sama untuk zeppelin. Saya mungkin harus golf lagi, tetapi saya harus mengakui bahwa saya suka format output saat ini.
Arnauld
Apakah Anda bruteforce untuk menemukan 3379, atau apakah Anda menggunakan penalaran matematika? Jika demikian, dapatkah Anda menemukan cara untuk menemukannya? :)
Yytsi
@ TuukkaX Tidak ada yang benar-benar mewah di sini. Saya baru saja melakukannya, kriteria saya adalah 1) sesedikit mungkin untuk P dan Q dan 2) sesedikit mungkin pengulangan.
Arnauld
6

Brachylog , 17 byte

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

Cobalah online!

Penjelasan

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
Fatalisasi
sumber
3

05AB1E , 15 13 byte

Disimpan dua byte berkat Emigna !

œJvy3L£Â`*Qi,

Menggunakan pengkodean CP-1252 . Cobalah online!

Penjelasan:

œ                 # 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
Adnan
sumber
Anda dapat mengganti 213Sdengan 3Lkarena pesanan tidak harus 2,1,3sesuai dengan spesifikasi.
Emigna
Senang mengetahui bahwa secara £vektor menjumlahkan ... Jika itu cara yang tepat untuk mengatakan itu.
Magic Octopus Urn
3

Bash + coreutils, 70

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

Tidak ada cara yang sangat mudah untuk menghasilkan semua permutasi. Alih-alih menghasilkan permutasi secara acak dan menghitung sampai kami menemukan yang baik.

Output dalam bentuk A*B-C- yaitu ekspresi yang akan mengevaluasi ke nol ketika kita memiliki permutasi yang benar.

Cobalah online .

Trauma Digital
sumber
2

CJam , 23 byte

qm!{3/)2/+:i}%{(\:*=}=p

Cobalah online!

Kucing Bisnis
sumber
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*

Cobalah online!

Solusi 88 byte dengan output yang lebih fleksibel

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

Cobalah online!
di mana output akan ['6', '5', '7', '3', '4', '2'] sebagai gantinya '6', '57', '342'

tongkat
sumber
2
Anda tidak menempatkan Anda importdi puncak ...
guncang
@ mbomb007 harus mengerjakan TIO ¯ \ _ (ツ) _ / ¯
Rod
Anda adalah orang pertama yang saya lihat yang benar-benar meletakkannya f=di header. Itu bukan masalah besar.
mbomb007
2

PHP, 110 byte

Itu akan sampai di sana ... pada akhirnya ...

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

Tidak Disatukan:

<?
$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";
Alex Howansky
sumber
2

PHP, 77 byte

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

Mengambil input sebagai string.

pengguna63956
sumber
1

ES6 (Javascript), 85, 82, 79 byte

Menerima array angka (string), mengembalikan array 3-elemen [A,B,C]=> C=A*B

Golf

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

EDIT:

  • Disimpan 3 byte lebih banyak dengan menggunakan kembali ddan a, dan menyingkirkan ==(Terima kasih @Arnauld!)
  • Disimpan 3 byte menggunakan tugas penataan

Cobalah !

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>

zeppelin
sumber
Bisakah Anda menjamin bahwa pengurutan acak Anda benar-benar akan mencakup semua permutasi?
Neil
@Neil, jika Anda mencari bukti formal yang ketat, saya tidak berpikir saya bisa memberikan Anda, tetapi secara empiris itu menghasilkan distribusi permutasi yang cukup seragam.
zeppelin
1

Pip , 18 byte

17 byte kode, +1 untuk -Sbendera.

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

Mengambil input sebagai serangkaian digit melalui argumen baris perintah. Output dalam urutan c, b, a. Cobalah online!

Kode ini menampilkan semua solusi jika ada banyak. Jika diperlukan untuk menghasilkan hanya satu solusi, maka tambahkan tiga byte dan bungkus program (...0).

Penjelasan

                   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)
DLosc
sumber
1

Ruby, 60 byte

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

Mencetak semua solusi sebagai "a * b == c"

Contoh:

->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
GB
sumber
1

Batch, 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%%

Mengambil input pada STDIN sebagai string [1-9]{6}dan menampilkan semua solusi dalam dd*d-dddformat. Batch tidak terlalu bagus dalam manipulasi string sehingga menghasilkan permutasi 720 sedikit canggung.

Neil
sumber