Finde die Zahlen und berechne die Ausgabe

22

Zielsetzung

Eine Eingangs Liste der genannten 6deutlichen Ziffern, finden drei Zahlen a, bund cso , dass a × b = c, mit a2 Ziffern aufweisen, bmit 1 Ziffer und c3 Ziffern haben. Visuell muss Ihr Programm diese 6 Ziffern in den Feldern dieses Bildes anordnen:

Bildbeschreibung hier eingeben

Wenn mehr als eine Lösung vorhanden ist, können Sie eine davon ausgeben.

Eingang

6 verschiedene Ziffern. Sie können sie in jeder für Ihre Sprache angemessenen Weise verwenden.

Ausgabe

Die drei Zahlen a, bund c. Das Ausgabeformat ist relativ frei, solange die 3 Zahlen getrennt sind und immer in derselben Reihenfolge gedruckt werden (aber nicht unbedingt in der Reihenfolge a, b, c).

Testfälle

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

Wertung

Der kürzeste Code in Bytes gewinnt.

HABJAN
quelle
1
Das war das erste, woran ich dachte, als ich die Herausforderung auch sah @Dada ... Ich schlage vor, sie in den Sandkasten zu legen, um vor dem Posten ein Feedback zu erhalten :-)
Stewie Griffin
1
Wird die Eingabe garantiert zu einer Lösung führen?
AdmBorkBork
1
Ich habe den Wortlaut Ihrer Herausforderung (meiner Meinung nach) ein wenig überarbeitet, um sie klarer zu machen. Stellen Sie sicher, dass ich das Ziel der Herausforderung nicht geändert habe.
Fatalize
1
Ich denke auch, dass die Herausforderung einen expliziteren Titel erfordert, aber ich bin im Moment ohne Ideen.
Fatalize
1
Sollte eine Eingabe von 0,1,2,3,4,5result in 13,4,052; keine Lösung; oder ist irgendein Verhalten in Ordnung?
Jonathan Allan

Antworten:

8

Brachylog (2), 10 Bytes

p~c₃o.k×~t

Probieren Sie es online!

Viel zu langsam, um in einem angemessenen Zeitraum ausgeführt zu werden (der Brachylog-Interpreter verbringt viel Zeit damit, Multiplikationen mit leeren Zeichenfolgen, 4-stelligen Zahlen, negativen Zahlen usw. unter Verwendung eines sehr langsamen Constraint-Lösers durchzuführen). Die TIO-Verbindung verwendet eine Eingabe mit nur 3 Stellen (dieses Programm kann Eingaben mit einer beliebigen Anzahl von Stellen verarbeiten). Dies ist eine Funktion, deren Eingabe eine Zahl ist, die alle erforderlichen Ziffern enthält (z. B. 234567das Fehlen von Duplikaten in der Eingabe bedeutet, dass Sie immer nur eine 0am Ende einfügen können, um eine führende Null zu vermeiden) und deren Ausgabe eine Liste in der ist bestellen [b, a, c](zB [6, 57, 342]).

Erläuterung

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

Wie lautete die Anforderung an die Gruppen, 2, 1 und 3 Ziffern zu haben? Nun, wir wissen, dass die Eingabe 6 Ziffern enthält und die Gruppen in sortierter Reihenfolge sind. Die einzigen möglichen Größen, die sie haben können, sind daher [1, 1, 4], [1, 2, 3] oder [2, 2, 2]. Der erste Fall ist unmöglich (Sie können nicht zwei 1-stellige Zahlen multiplizieren, um eine 4-stellige Zahl zu erhalten, da 9 × 9 nur 81 ist), ebenso wie der letzte Fall (Sie können nicht zwei 2-stellige Zahlen mit multiplizieren) eine zweistellige Zahl erzeugen, da gerade 10 × 10 100 ergibt). Daher müssen die Rückgabewerte [b, a, c]in dieser Reihenfolge 1, 2 und 3 Ziffern lang sein, also a2 Ziffern, b1 Ziffer und c3 Ziffern, wie angefordert.


quelle
2
Nun ... Ich
gebe auf
8

JavaScript (ES6), 90 88 Bytes

Nimmt die Eingabe als Array von 6 Ziffern. Gibt eine Zeichenfolge zurück, die eine mögliche Lösung beschreibt (z. B. '54*3==162'), oder wird mit dem Fehler "zu viel Rekursion" beendet, wenn (und nur wenn) keine Lösung vorliegt.

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)

Wie es funktioniert

Dies ist ein deterministischer Algorithmus.

Die Primzahlen P=2und Q=3779wurden so gewählt, dass der Sort Callback (k = k * P % Q) & 2garantiert alle 720 möglichen Permutationen des Input Arrays über die Zeit generiert. Genauer gesagt werden alle Permutationen nach 2798 Sortierungen abgedeckt - dies sollte innerhalb der Rekursionsgrenze aller Browser liegen.

Wir fügen jede Permutation in den Ausdruck ein, 01*2==345indem wir die Ziffern den entsprechenden Einträgen im Array zuordnen.

Wir werten diesen Ausdruck aus und führen rekursive Aufrufe durch, bis er wahr ist.

Prüfung

Arnauld
quelle
Angenommen, das Ausgabeformat ist noch gültig, speichern Sie ein Byte -mit ==(und kehren Sie es um ?:).
Neil
1
@Neil Eigentlich habe ich dem Zeppelin den gleichen Vorschlag gemacht. Ich sollte wahrscheinlich noch mehr Golf spielen, aber ich muss zugeben, dass mir das aktuelle Ausgabeformat gefällt.
Arnauld
Haben Sie 3379 bruteforce gefunden oder haben Sie mathematisches Denken angewendet? Wenn ja, wie können Sie es finden? :)
Yytsi
@ TuukkaX Nichts wirklich Lust hier. Ich habe es nur brachial durchgesetzt, wobei meine Kriterien 1) so wenig Ziffern wie möglich für P und Q und 2) so wenig Sortieriterationen wie möglich sind.
Arnauld
6

Brachylog , 17 Bytes

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

Probieren Sie es online!

Erläuterung

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
Tödlich
quelle
3

05AB1E , 15 13 Bytes

Zwei Bytes gespart dank Emigna !

œJvy3L£Â`*Qi,

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Erläuterung:

œ                 # 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
quelle
Sie können ersetzen 213Smit 3Lwie der Auftrag nicht über sein 2,1,3auf die Spezifikationen nach.
Emigna
Gut zu wissen, dass £kumulativ vektorisiert ... Wenn das der richtige Weg ist, das zu sagen.
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

Keine besonders einfache Möglichkeit, alle Permutationen zu generieren. Generieren Sie stattdessen zufällig Permutationen und berechnen Sie, bis wir eine gute finden.

Die Ausgabe erfolgt in der Form A*B-C- dh der Ausdruck, der bei korrekter Permutation mit Null bewertet wird.

Probieren Sie es online aus .

Digitales Trauma
quelle
2

Python 2 , 105 Bytes

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*

Probieren Sie es online!

88-Byte-Lösung mit flexiblerer Ausgabe

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

Probieren Sie es online!
Wobei die Ausgabe ['6', '5', '7', '3', '4', '2'] statt '6', '57', '342' wäre

Stange
quelle
2
Sie haben Ihre nicht importan der Spitze gesetzt ... schüttelt den Kopf
mbomb007
@ mbomb007 muss an TIO ¯ \ _ (ツ) _ / ¯ arbeiten
Rod
Du bist die erste Person, die ich gesehen habe, die das tatsächlich f=in den Header gesetzt hat. Es ist keine große Sache.
mbomb007
2

PHP, 110 Bytes

Es wird dort ankommen ... irgendwann ...

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

PHP, 77 Bytes

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

Übernimmt die Eingabe als Zeichenfolge.

user63956
quelle
1

ES6 (Javascript), 85, 8279 Bytes

Akzeptiert ein Array von Ziffern (Strings) und gibt ein Array mit 3 Elementen zurück [A,B,C]=> C=A*B

Golf gespielt

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

EDITS:

  • 3 weitere Bytes durch Wiederverwendung von dund aund ==Entfernen von (Danke @Arnauld!)
  • 3 Bytes durch Destrukturierungszuweisung eingespart

Versuch es !

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
quelle
Können Sie garantieren, dass Ihre zufällige Sortierung tatsächlich alle Permutationen abdeckt?
Neil
@Neil, wenn Sie nach strengen formalen Beweisen suchen, kann ich Ihnen wahrscheinlich keinen liefern, aber empirisch führt dies zu einer ziemlich gleichmäßigen Verteilung der Permutationen.
Zeppelin
1

Pip , 18 Bytes

17 Byte Code, +1 für -SFlag.

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

Übernimmt die Eingabe als Ziffernfolge über das Befehlszeilenargument. Die Ausgabe erfolgt in der Reihenfolge c, b, a. Probieren Sie es online!

Dieser Code gibt alle Lösungen aus, wenn mehrere vorhanden sind. Wenn nur eine Lösung ausgegeben werden muss, fügen Sie drei Bytes hinzu und schließen Sie das Programm ein (...0).

Erläuterung

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

Ruby, 60 Bytes

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

Druckt alle Lösungen als "a * b == c"

Beispiel:

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

Batch, 305 Bytes

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

Übernimmt die Eingabe in STDIN als Zeichenfolge [1-9]{6}und gibt alle Lösungen im dd*d-dddFormat aus. Batch ist nicht sehr gut in der Manipulation von Strings, daher ist es etwas umständlich, die 720-Permutationen zu erzeugen.

Neil
quelle