Sayıları bul ve çıktıyı hesapla


22

Amaç

Bir giriş listesi verilen 6, farklı basamak 3 numaraları bulmak a, bve cbu gibi a × b = colan, a, 2 rakama sahip olan b1 basamak olan ve c3 rakama sahip olan. Daha görsel bir şekilde, programınız bu görüntünün kutularında bu 6 basamağı düzenlemelidir:

görüntü tanımını buraya girin

Birden fazla çözüm mevcutsa, bunlardan herhangi birini çıkarabilirsiniz.

Giriş

6 farklı basamak. Onları diliniz için makul herhangi bir şekilde alabilirsiniz.

Çıktı

3 sayı a, bve c. Çıktı formatı, 3 sayı ayrıldığı ve her zaman aynı sırada (ancak mutlaka sırayla değil a, b, c) yazdırıldığı sürece nispeten serbesttir .

Test Kılıfları

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

puanlama

Bayt cinsinden en kısa kod kazanır.


1
Bu, meydan okumayı da gördüğümde ilk düşündüğüm şey @Dada ... Göndermeden önce geri bildirim almak için kum havuzuna koymanızı öneririm :-)
Stewie Griffin

1
Girişin bir çözüme kavuşması garanti ediliyor mu?
AdmBorkBork

1
Bu konuyu açıkça anlatabilmek için mücadelenizin ifadesini biraz düzenlemiştim (bence). Mücadelenin amacını değiştirmediğimden emin olun.
17'de

1
Ayrıca, meydan okumanın daha açık bir başlık gerektirdiğini düşünüyorum, ancak şu anda fikirlerin dışında.
17'de ölüm

1
0,1,2,3,4,5Sonuç girişi yapılmalı 13,4,052; çözüm yok; veya herhangi bir davranış tamam mı?
Jonathan Allan,

Yanıtlar:


8

Brachylog (2), 10 bayt

p~c₃o.k×~t

Çevrimiçi deneyin!

Makul bir süre boyunca koşmak için çok yavaş (Brachylog yorumlayıcısı, çok yavaş bir kısıtlayıcı çözücü kullanarak boş dizgilerde, 4 basamaklı sayılar, negatif sayılar vb. Çarpmalarda uzun süre harcıyor). TIO bağlantısı yalnızca 3 basamaklı bir giriş kullanır (bu program herhangi bir sayıdaki basamağa giriş yapabilir). Bu, girişi gerekli olan tüm basamakları içeren bir sayıdır (örn. 234567) - girişteki kopyaların olmaması, 0sıfırdan kaçınmak için daima sonuna kadar koyabileceğiniz anlamına gelir - ve çıktısı listedeki bir listedir. sipariş [b, a, c](örneğin [6, 57, 342]).

açıklama

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

Peki grupların 2, 1 ve 3 basamak olması gerekliliği nereye gitti? Girişte 6 hane olduğunu biliyoruz ve gruplar sıralı sırada. Bu nedenle sahip olabilecekleri mümkün olan tek boyut [1, 1, 4], [1, 2, 3] veya [2, 2, 2]. İlk durum imkansızdır (9 × 9 yalnızca 81 olduğundan 4 basamaklı bir sayı üretmek için iki adet 1 rakamı çarpamazsınız), son durumda olduğu gibi (iki 2 basamaklı sayıyı çarpamazsınız) 2 basamaklı bir sayı üretir, 10 × 10 bile 100 üretir). Bu nedenle, dönüş değerleri [b, a, c]bu sırada 1, 2 ve 3 hane uzunluğunda olmalıdır, yani a2 hane, b1 hane ve cistendiği gibi 3 hanedir.


2
Eh ... Ben teslim
Fatalize

8

JavaScript (ES6), 90 88 bayt

Girdiyi 6 basamaklı bir dizi olarak alır. Olası bir çözümü (örneğin '54*3==162') tanımlayan bir dize döndürür veya (eğer yalnızca) bir çözüm yoksa 'çok fazla özyineleme' hatasıyla çıkar.

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)

Nasıl çalışır

Bu deterministik bir algoritmadır.

Asal sayılar P=2ve Q=3779zaman içinde geri çağırma (k = k * P % Q) & 2dizisinin tüm 720 olası permütasyonunu üretecek şekilde geri çağırma işleminin garanti edileceği şekilde seçilmiştir . Daha doğrusu, tüm permütasyonlar 2798 çeşitten sonra kapsanır - ki bunlar tüm tarayıcıların özyineleme sınırında olmalıdır.

İfadedeki her permitasyonunu 01*2==345, rakamları dizideki karşılık gelen girişlerle eşleştirerek enjekte ederiz .

Bu ifadeyi değerlendiriyoruz ve doğru olana kadar özyinelemeli çağrılar yapıyoruz.

Ölçek


Çıkış formatının hala geçerli olduğunu varsayarak, bir bayt kaydetmek için -yerine ==(ve geri ?:) kullanın.
Neil

1
@Neil Aslında, zeplin için de aynı şeyi yaptım. Muhtemelen biraz daha golf oynamalıyım ancak şu anki çıktı formatını sevdiğimi itiraf etmeliyim.
Arnauld,

3379'u bulmak için kaba kuvvet kullandın mı yoksa matematiksel akıl yürütmeyi mi kullandın? Eğer öyleyse, onu bulma yolunu sağlayabilir mi? :)
Yytsi

@TuukkaX Burada gerçekten hoş bir şey yok. Ben sadece kısaca zorladım, kriterlerim 1) P ve Q için mümkün olduğu kadar az rakam ve 2) olabildiğince az sayıda sıralama.
Arnauld

6

Brachylog , 17 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

Emigna sayesinde iki bayt kurtarıldı !

œJvy3L£Â`*Qi,

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!

Açıklama:

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

Sen yerini alabilir 213Sile 3Lsipariş olmak zorunda değildi olarak 2,1,3özelliklerine göre.
Emigna,

£Kümülatif olarak vektörleştirdiğini bilmek güzel ... Eğer bunu söylemenin doğru yolu buysa.
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

Tüm permütasyonları oluşturmak için özellikle kolay bir yol yok. Bunun yerine rastgele permütasyonlar üretin ve iyi bir tane bulana kadar hesaplayın.

Çıktı biçimindedir A*B-C- yani doğru izne sahip olduğumuzda sıfırı değerlendirecek ifade.

Çevrimiçi deneyin .



2

Python 2 , 105 bayt

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*

Çevrimiçi deneyin!

Daha esnek çıktıya sahip 88 baytlık çözüm

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

Çevrimiçi deneyin!
çıktının ['6', '5', '7', '3', '4', '2'] olması yerine '6', '57', '342'


2
Eğer koymadı importüstünde ... sallar kafa
mbomb007

@ mbomb007, TIO'da çalışmalı ¯ \ _ (ツ) _ / ¯
Rod

Sen gerçekten beni f=başlığa sokan ilk gördüğüm kişisin . Çok önemli değil.
mbomb007

2

PHP, 110 bayt

Oraya gelecek ... sonunda ...

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

Ungolfed:

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

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

Bir dize olarak girdi alır.


1

ES6 (Javascript), 85, 82, 79 bayt

Bir basamak dizesini kabul eder (dizeler), 3 öğeli bir dizi döndürür [A,B,C]=> C=A*B

golfed

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

DÜZENLEMELER:

  • Kayıtlı daha 3 tekrar kullanarak bayt dve ave kurtulmak alma ==(teşekkürler @Arnauld!)
  • Yıkım ataması kullanılarak 3 bayt kurtarıldı

Dene !

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>


Rasgele sıralamalarınızın tüm permütasyonları kapsayacağını garanti eder misiniz?
Neil

@Neil, sıkı bir resmi kanıt arıyorsanız, size bir tane sağlayabileceğimi sanmıyorum, ancak ampirik olarak bu, permütasyonların oldukça tekdüze dağılımına neden olur.
zeplin

1

Pip , 18 bayt

17 baytlık kod, -Sbayrak için +1 .

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

Komut satırı argümanı ile girdiyi basamak dizisi olarak alır. Çıkış c, b, a sıralarına göredir. Çevrimiçi deneyin!

Birden fazla varsa bu kod tüm çözümleri çıkarır. Yalnızca bir çözüm çıkması gerekiyorsa , üç bayt ekleyin ve programı kaydırın (...0).

açıklama

                   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 bayt

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

Tüm çözümleri "a * b == c" olarak yazdırır

Örnek:

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

Toplu iş, 305 bayt

@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'de dizge olarak girdi alır [1-9]{6}ve tüm çözümleri dd*d-dddbiçiminde verir. Toplu işlem, dize işleminde çok iyi değil, bu nedenle 720 permütasyon oluşturmak biraz garip.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.