Знайдіть числа та обчисліть вихід


22

Об'єктивна

З огляду на список введення 6окремих цифр, знайти 3 числа a, bі cтаким чином, що a × b = c, з aз 2 цифри, bякі мають 1 цифру і cз 3 цифри. Більш наочно, ваша програма повинна розташувати ці 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]. Перший випадок неможливий (ви не можете помножити два одноцифрових числа для отримання 4-розрядного числа, оскільки 9 × 9 - це лише 81), як і останній випадок (ви не можете перемножувати два двоцифрових числа на виробляють 2-розрядне число, оскільки навіть 10 × 10 дає 100). Таким чином, повернені значення [b, a, c]повинні бути 1, 2 і 3 цифри в такому порядку, так aце 2 цифри, bце 1 цифра і 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) якомога менше сортування ітерацій.
Арнольд


3

05AB1E , 15 13 байт

Збережено два байти завдяки Еміньї !

œ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відповідності з характеристиками.
Емінья

Добре знати, що £кумулятивно векторизується ... Якщо це правильний спосіб сказати це.
Чарівний восьминога Урна

3

Bash + coreutils, 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";

Безголівки:

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


1

ES6 (Javascript), 85, 82, 79 байт

Приймає масив цифр (рядків), повертає 3-елементний масив [A,B,C]=> C=A*B

Гольф

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, якщо ви шукаєте суворих формальних доказів, я не думаю, що я можу надати вам такого, але емпірично це призводить до досить рівномірного розподілу перестановок.
zeppelin

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.