Найти числа и рассчитать выход


22

Задача

По заданному списку ввода 6различных цифр найдите 3 числа a, bи, cтаким образом a × b = c, aимея 2 цифры, b1 цифру и c3 цифры. Для наглядности ваша программа должна расположить эти 6 цифр в полях этого изображения:

введите описание изображения здесь

Если существует более одного решения, вы можете вывести любое из них.

вход

6 разных цифр. Вы можете принять их любым приемлемым для вашего языка способом.

Выход

В 3 числа a, bи c. Выходной формат является относительно свободным, если 3 числа разделены и всегда печатаются в одном и том же порядке (но не обязательно в порядке a, b, c).

Тестовые случаи

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

счет

Самый короткий код в байтах побеждает.


1
Это первое, о чем я подумал, когда увидел проблему тоже @Dada ... Я предлагаю положить ее в песочницу, чтобы получить отзывы перед публикацией :-)
Стьюи Гриффин,

1
Гарантирован ли ввод результатов решения?
AdmBorkBork

1
Я немного отредактировал формулировку вашего вызова, чтобы прояснить его (на мой взгляд). Убедитесь, что я не изменил цель испытания.
Роковая

1
Я также думаю, что задача нуждается в более четком названии, но у меня сейчас нет идей.
Роковая

1
Если ввод 0,1,2,3,4,5результата в 13,4,052; нет решения; или все в порядке?
Джонатан Аллан

Ответы:


8

Брахилог (2), 10 байт

p~c₃o.k×~t

Попробуйте онлайн!

Слишком медленный, чтобы работать в течение разумного промежутка времени (интерпретатор брахилога тратит много времени на умножение на пустые строки, 4-значные числа, отрицательные числа и т. Д. С использованием очень медленного решателя ограничений). Ссылка TIO использует ввод только с 3 цифрами (эта программа может обрабатывать ввод с любым количеством цифр). Это функция, чьим входным значением является число, содержащее все требуемые цифры (например 234567) - отсутствие дубликатов на входе означает, что вы всегда можете просто поставить любое число 0в конце, чтобы избежать начального нуля, - и чей выходной результат представляет собой список в заказ [b, a, c](например [6, 57, 342]).

объяснение

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

Так куда же делось требование к группам из 2, 1 и 3 цифр? Ну, мы знаем, что на входе 6 цифр, и группы расположены в отсортированном порядке. Следовательно, они могут иметь только возможные размеры: [1, 1, 4], [1, 2, 3] или [2, 2, 2]. Первый случай невозможен (вы не можете умножить два 1-значных числа для получения 4-значного числа, так как 9 × 9 - это только 81), как и последний случай (вы не можете умножить два 2-значных числа на произвести двузначное число, так как даже 10 × 10 дает 100). Таким образом, возвращаемые значения [b, a, c]должны иметь длину 1, 2 и 3 цифры в этом порядке, то aесть 2 цифры, b1 цифра и c3 цифры в соответствии с запросом.


2
Ну ... я сдаюсь
Роковой

8

JavaScript (ES6), 90 88 байт

Вводит в виде массива из 6 цифр. Возвращает строку, описывающую возможное решение (например, '54*3==162') или завершается с ошибкой «слишком много рекурсии», если (и только если) нет решения.

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)

Как это работает

Это детерминированный алгоритм.

Штрихи P=2и Q=3779были выбраны таким образом , что сортировка обратного вызова (k = k * P % Q) & 2гарантированно генерировать все 720 возможных перестановок входного массива с течением времени. Точнее, все перестановки охватываются после 2798 сортировок, что должно быть в пределах рекурсии всех браузеров.

Мы вводим каждую перестановку в выражение 01*2==345, сопоставляя цифры с соответствующими записями в массиве.

Мы оцениваем это выражение и делаем рекурсивные вызовы, пока оно не станет истинным.

Тест


Предполагая, что выходной формат все еще действителен, используйте -вместо ==(и переверните ?:), чтобы сохранить байт.
Нил

1
@Neil На самом деле, я сделал то же самое предложение для Zeppelin. Я, вероятно, должен еще сыграть в гольф, но должен признать, что мне нравится текущий формат вывода.
Арно

Брутфорс нашел 3379 или использовал математические рассуждения? Если да, можете ли вы найти способ найти его? :)
Yytsi

@TuukkaX Здесь нет ничего особенного. Я просто использовал его, мои критерии: 1) как можно меньше цифр для P и Q и 2) как можно меньше итераций сортировки.
Arnauld

6

Брахилог , 17 байт

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

Попробуйте онлайн!

объяснение

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 байт

Сохранено два байта благодаря Emigna !

œJvy3L£Â`*Qi,

Использует кодировку CP-1252 . Попробуйте онлайн!

Объяснение:

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

Вы можете заменить 213Sна, так 3Lкак заказ не должен быть в 2,1,3соответствии со спецификациями.
Emigna

Приятно знать, что в £совокупности векторизация ... Если это правильный способ сказать это.
Волшебная урна осьминога

3

Баш + кореутилс, 70

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

Нет особенно простого способа генерировать все перестановки. Вместо этого случайным образом генерируйте перестановки и вычисляйте, пока мы не найдем хорошую.

Вывод в форме A*B-C- то есть выражение, которое будет оцениваться в ноль, когда мы имеем правильную перестановку.

Попробуйте онлайн .



2

Python 2 , 105 байт

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*

Попробуйте онлайн!

88-байтовое решение с более гибким выводом

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

Попробуйте онлайн!
где результат будет ['6', '5', '7', '3', '4', '2'] вместо '6', '57', '342'


2
Вы не поставили свою importвершину ... качает головой
mbomb007

@ mbomb007 должен поработать над TIO ¯ \ _ (ツ) _ / ¯
Род

Вы первый человек, которого я видел, кто на самом деле поместил f=в заголовок. Это не имеет большого значения.
mbomb007

2

PHP, 110 байт

Это будет там ... в конце концов ...

<?$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 байт

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

Принимает ввод в виде строки.


1

ES6 (Javascript), 85, 8279 байтов

Принимает массив цифр (строк), возвращает массив из 3 элементов [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]

правок:

  • Сохраненные более 3 байт за счет многократного использования dи a, и избавлении от ==(спасибо @Arnauld!)
  • Сохранено 3 байта с использованием назначения деструктурирования

Попытайся !

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>


Можете ли вы гарантировать, что ваша случайная сортировка будет охватывать все перестановки?
Нил

@Neil, если вы ищете строгое формальное доказательство, я не думаю, что смогу предоставить вам его, но опытным путем оно приводит к довольно равномерному распределению перестановок.
Цеппелин

1

Пип , 18 байт

17 байт кода, +1 за -Sфлаг.

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

Принимает ввод в виде строки цифр через аргумент командной строки. Выход в порядке c, b, a. Попробуйте онлайн!

Этот код выводит все решения, если существует несколько. Если требуется вывести только одно решение, добавьте три байта и оберните программу в(...0) .

объяснение

                   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

Рубин, 60 байт

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

Печатает все решения как "a * b == c"

Пример:

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

Пакетный, 305 байтов

@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 в виде строки [1-9]{6}и выводит все решения в dd*d-dddформате. Пакет не очень хорош в манипулировании строками, поэтому генерировать 720 перестановок немного неудобно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.