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.