Znajdź liczby i oblicz wynik

22

Cel

Biorąc pod uwagę lista wejściowa 6różnych cyfr, znajdują się 3 numery a, bi ctakie, które a × b = cza konieczności 2 cyfry, bmający 1 cyfrę i cposiadające 3 cyfry. W bardziej wizualny sposób program musi ułożyć te 6 cyfr w polach tego obrazu:

wprowadź opis zdjęcia tutaj

Jeśli istnieje więcej niż jedno rozwiązanie, możesz wypisać dowolne z nich.

Wkład

6 różnych cyfr. Możesz wziąć je w dowolny rozsądny sposób dla swojego języka.

Wydajność

Do 3 numery a, bi c. Format wyjściowy jest względnie darmowy, o ile 3 liczby są rozdzielone i zawsze są drukowane w tej samej kolejności (ale niekoniecznie w kolejnościa, b, c ).

Przypadki testowe

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

Punktacja

Najkrótszy kod w bajtach wygrywa.

HABJAN
źródło
1
To pierwsza rzecz, o której pomyślałem, kiedy zobaczyłem też wyzwanie @Dada ... Sugeruję umieszczenie go w piaskownicy, aby uzyskać opinie przed opublikowaniem :-)
Stewie Griffin
1
Czy dane wejściowe gwarantują rozwiązanie?
AdmBorkBork
1
Zmodyfikowałem sformułowanie twojego wyzwania dość jasno, aby było jasne (moim zdaniem). Upewnij się, że nie zmieniłem celu wyzwania.
Fatalize
1
Myślę też, że wyzwanie wymaga bardziej jednoznacznego tytułu, ale obecnie brakuje mi pomysłów.
Fatalize
1
Jeśli 0,1,2,3,4,5wynik wyniku 13,4,052; brak rozwiązania; lub czy jakieś zachowanie jest w porządku?
Jonathan Allan

Odpowiedzi:

8

Brachylog (2), 10 bajtów

p~c₃o.k×~t

Wypróbuj online!

Zbyt wolno, aby uruchomić się w rozsądnym czasie (interpreter Brachylog spędza dużo czasu na mnożeniu pustych ciągów, liczb 4-cyfrowych, liczb ujemnych itp. Przy użyciu bardzo wolnego narzędzia do rozwiązywania ograniczeń). Łącze TIO używa wejścia składającego się tylko z 3 cyfr (ten program może obsługiwać dane wejściowe z dowolną liczbą cyfr). Jest to funkcja, której wejście jest liczbą zawierającą wszystkie wymagane cyfry (np. 234567) - brak duplikatów na wejściu oznacza, że ​​zawsze możesz po prostu wstawić dowolny 0na końcu, aby uniknąć wiodącego zera - i którego wyjściem jest lista w zamówienie [b, a, c](np [6, 57, 342].).

Wyjaśnienie

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

Więc gdzie poszedł wymóg dla grup 2, 1 i 3 cyfr? Wiemy, że na wejściu jest 6 cyfr, a grupy są posortowane. Jedynymi możliwymi rozmiarami, jakie mogą mieć, są zatem [1, 1, 4], [1, 2, 3] lub [2, 2, 2]. Pierwszy przypadek jest niemożliwy (nie można pomnożyć dwóch liczb 1-cyfrowych, aby uzyskać liczbę 4-cyfrową, ponieważ 9 × 9 to tylko 81), podobnie jak ostatni przypadek (nie można pomnożyć dwóch liczb 2-cyfrowych do daje 2-cyfrową liczbę, ponieważ nawet 10 × 10 daje 100). Zatem zwracane wartości [b, a, c]muszą mieć 1, 2 i 3 cyfry długości w tej kolejności, podobnie jak a2 cyfry, b1 cyfra i c3 cyfry, zgodnie z żądaniem.


źródło
2
Cóż ...
Poddaję się
8

JavaScript (ES6), 90 88 bajtów

Pobiera dane wejściowe jako tablicę 6 cyfr. Zwraca ciąg opisujący możliwe rozwiązanie (np. '54*3==162') Lub kończy działanie z błędem „zbyt dużej rekurencji”, jeśli (i tylko wtedy) nie ma rozwiązania.

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)

Jak to działa

Jest to algorytm deterministyczny.

Liczby pierwsze P=2i Q=3779zostały wybrane w taki sposób, że wywołanie zwrotne sortowania (k = k * P % Q) & 2gwarantuje wygenerowanie wszystkich 720 możliwych permutacji tablicy wejściowej w czasie. Dokładniej, wszystkie permutacje są objęte po 2798 rodzajach - co powinno mieścić się w limicie rekurencji wszystkich przeglądarek.

Wstrzykujemy każdą permutację w wyrażeniu 01*2==345 poprzez mapowanie cyfr na odpowiednie wpisy w tablicy.

Oceniamy to wyrażenie i wykonujemy rekurencyjne połączenia, aż będzie to prawdą.

Test

Arnauld
źródło
Zakładając, że format wyjściowy jest nadal prawidłowy, użyj -zamiast ==(i odwróć ?:), aby zapisać bajt.
Neil
1
@Neil Właściwie to ja zasugerowałem Zeppelinowi. Prawdopodobnie powinienem jeszcze trochę zagrać w golfa, ale muszę przyznać, że podoba mi się obecny format wyjściowy.
Arnauld
Czy użyłeś siły, by znaleźć 3379, czy użyłeś rozumowania matematycznego? Jeśli tak, czy możesz podać swój sposób jej znalezienia? :)
Yytsi
@TuukkaX Nie ma tu naprawdę nic szczególnego. Właśnie go brutalnie wykorzystałem, moje kryteria to 1) jak najmniej cyfr dla P i Q i 2) jak najmniej iteracji sortowania, jak to możliwe.
Arnauld
6

Brachylog , 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
Fatalizować
źródło
3

05AB1E , 15 13 bajtów

Zaoszczędź dwa bajty dzięki Emignie !

œJvy3L£Â`*Qi,

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Wyjaśnienie:

œ                 # 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
źródło
Można wymienić 213Sz 3Ljak kolejność nie musiał być 2,1,3według specyfikacji.
Emigna
Dobrze wiedzieć, że £kumulatywnie wektoryzuje ... Jeśli to właściwy sposób, aby to powiedzieć.
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

Nie ma szczególnie łatwego sposobu na wygenerowanie wszystkich permutacji. Zamiast tego losowo generuj permutacje i obliczaj, aż znajdziemy dobrą.

Dane wyjściowe mają postać A*B-C- tzn. Wyrażenie, które będzie oceniać na zero, gdy będziemy mieć prawidłową permutację.

Wypróbuj online .

Cyfrowa trauma
źródło
2

Python 2 , 105 bajtów

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*

Wypróbuj online!

Rozwiązanie 88 bajtów z bardziej elastycznym wyjściem

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

Wypróbuj online!
gdzie wynikiem byłoby [„6”, „5”, „7”, „3”, „4”, „2”] zamiast „6”, „57”, „342”

Pręt
źródło
2
Nie umieściłeś swojego importna szczycie ... potrząsa głową
mbomb007
@ mbomb007 muszę pracować nad TIO ¯ \ _ (ツ) _ / ¯
Rod
Jesteś pierwszą osobą, którą widziałem, która faktycznie umieściła f=nagłówek. To nie jest wielka sprawa.
mbomb007
2

PHP, 110 bajtów

Dotrze tam ... w końcu ...

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

Nie golfowany:

<?
$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
źródło
2

PHP, 77 bajtów

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

Pobiera dane wejściowe jako ciąg.

użytkownik63956
źródło
1

ES6 (JavaScript), 85, 82, 79 bajtów

Akceptuje tablicę cyfr (ciągów znaków), zwraca tablicę 3-elementową [A,B,C]=> C=A*B

Grał w golfa

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

EDYCJE:

  • Zaoszczędzono jeszcze 3 bajty , używając ponownie di apozbywając się ==(Dzięki @Arnauld!)
  • Zaoszczędzono 3 bajty przy użyciu przypisania destrukcyjnego

Spróbuj !

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>

zepelin
źródło
Czy możesz zagwarantować, że twoje losowe sortowanie faktycznie obejmie wszystkie permutacje?
Neil
@Neil, jeśli szukasz ścisłego formalnego dowodu, nie sądzę, żebym mógł ci go dostarczyć, ale empirycznie powoduje to dość jednolity rozkład permutacji.
zeppelin
1

Pip , 18 bajtów

17 bajtów kodu, +1 dla -Sflagi.

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

Pobiera dane wejściowe jako ciąg cyfr za pomocą argumentu wiersza polecenia. Dane wyjściowe są w kolejności c, b, a.Wypróbuj online!

Ten kod wyświetla wszystkie rozwiązania, jeśli istnieje wiele. Jeśli wymagane jest wyprowadzenie tylko jednego rozwiązania, dodaj trzy bajty i zawiń program (...0).

Wyjaśnienie

                   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
źródło
1

Rubinowy, 60 bajtów

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

Drukuje wszystkie rozwiązania jako „a * b == c”

Przykład:

->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
źródło
1

Partia, 305 bajtów

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

Pobiera dane wejściowe STDIN jako ciąg znaków [1-9]{6}i wyświetla wszystkie rozwiązania w dd*d-dddformacie. Batch nie jest zbyt dobry w manipulowaniu ciągami, więc generowanie permutacji 720 jest trochę niewygodne.

Neil
źródło