Написати розв’язувач рівняння слова [дублікат]


17

Вступ

Розглянемо наступний приклад:

  CODE
+ GOLF
——————
 GREAT

Це рівняння, де кожна літера представляє десяткову цифру, а слова представляють натуральні числа (подібні букви представляють подібні цифри, а різні літери - різні цифри). Завдання полягає в тому, щоб зіставити кожну букву з її цифрним значенням, щоб рівняння було правильним. Одне рішення для рівняння вище:

  9265
+ 1278
——————
 10543

Ваше завдання

Ваше завдання - написати програму або функцію, яка може вирішити такі рівняння, як видно вище.

Вхідні дані

Вхід - це рядок у такому форматі:

[A-Z]+\+[A-Z]+=[A-Z]+

Приклад:

  1. CODE+GOLF=GREAT
  2. AA+BB=CC

Пробіли опущені, і будуть використовуватися лише літери між великими літерами A і Z (ніяких спеціальних і малих літер).

Цей рядок може читатися зі стандартного вводу, з файлу або як функціональний параметр.

Вихідні дані

У вихідного формату є два варіанти:

  1. вихідне рівняння з підміненими цифрами
  2. список букв та їх значення

Якщо є кілька рішень, будь-яке (але тільки одне) з них слід повернути. Якщо рішень немає, програма повинна повернути порожній рядок або null. Вихід може бути повернутий у вигляді рядка, може бути записаний у стандартний вихід або у файл.

Приклад:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (ви можете використовувати будь-який роздільник)

Правила

  1. Щоб полегшити ситуацію, номери прийнято починати з 0, але ви можете обробляти числа з провідними 0 як недійсні рішення, це залежить від вас
  2. Подібні букви являють собою подібні цифри, а різні літери - різні цифри
  3. Ви можете використовувати будь-яку мову та стандартну бібліотеку обраної мови (без зовнішніх ліб)
  4. Ви не можете підключитися до будь-яких ресурсів в Інтернеті (навіщо це взагалі?)
  5. Це завдання з гольфовим кодом, найкоротший виграш коду. Послідовні символи пробілу вважаються одним символом. (Отже, будь-яка програма, написана у пробілі, автоматично виграє)

У мене є дещо хакітське рішення, використовуючи 179 знаків. Якщо щось не зрозуміло, будь ласка, запитайте мене в коментарях.


Я думаю, що оптимальна відповідь - "все 0". Ви можете спеціально заборонити це.
підземниймонорельс

1
Що ти маєш на увазі 0? Різні літери повинні позначати різні цифри.
Девід Френк

Пропустив це, ніколи :)
undergroundmonorail

If there are no solutions, the program should return an empty string or null.Нескінченні петлі все ще нічого не виводять ... чи можу я?
Тит

1
Усі виграшні відповіді на цей виклик фактично зводяться до використання правила підрахунку пробілів, тому голосування наближене як дублікат.
pppery

Відповіді:


11

Пітон - 48 символів

exec("".join(map(chr,map(len,'                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             '.split("    ")))))

Зловживання правилом пробілів.

Спершу я перетворив кожного персонажа у відповіді CesiumLifeJacket на його значення ASCII (я міг написати своє, але я лінивий, і це ніяк не вплине на остаточну оцінку). Довга рядок у моєму рішенні - це пробіл для кожного з цих значень ASCII та вкладки, що розділяють їх. Розділіть на вкладках, знайдіть довжини, перетворіть назад на символи та виконайте.

SE перетворює вкладки на 4 пробіли кожен, тому копіювання тексту не працюватиме. Вам просто доведеться повірити мені :)


1
Чи можете ви надати посилання на ideone або шістнадцятковий дамп вашого коду?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Також: exec - це ключове слово, ви можете зберегти два
знаки,

4

Ruby 2.0, 122 символи

Брутальна сила переміщення + eval! Це ще не відповідає критеріям повернення null / empty string, коли немає рішення; це просто петлі нескінченно. Якщо він не зможе знайти результат після ~ 300 мільйонів ітерацій, він поверне нуль. Достатньо близько?

f=->s{d=*0..9
d.shuffle!&&$.+=1until$.>9**9||z=eval((r=$_.tr(s.scan(/\w/).uniq*'',d*'')).gsub(/\b0/,'').sub ?=,'==')
z&&r}

Він знаходить усі унікальні букви на вході, потім кілька разів переміщує цифри 0-9 і намагається зіставити їх з літерами, поки не знайде конфігурацію, яка працює.

Код представлений у вигляді функції, fяка називається, що повертає рядок із заміненими числами, як у вихідному варіанті 1 вище. Приклад використання:

puts f["AA+BB=CC"]
 #=> 22+44=66
puts f["CODE+GOLF=GREAT"]
 #=> 8673+0642=09315

Час роботи CODE+GOLF=GREATприкладу на моїй машині коливається від миттєвого до приблизно 6 секунд - залежить від того, наскільки вам пощастило з перетасуванням!

Я особливо не задоволений тим, gsub(/\b0/,'')як видалити провідні нулі, але це було єдине, що я міг би подумати, щоб завадити evalінтерпретувати числа як восьмеричні вставки.

( БОНУС : Оскільки він використовує eval, він працює для довільних виразів Ruby, а не просто додавання!)


У мене була така ж ідея, коли я читав це, але отримав ~ 170 символів коду, так добре зроблено. 0..9 - це десять цифр, тож чи не слід обмежувати 10 ** 10? Ви можете використовувати перестановку Array # для перегляду всіх можливих відображень, але це може збільшити код довше.
blutorange

@blutorange Я просто вибрав 9 ** 9, оскільки це було велике число, яке можна писати з кількома символами. Я думаю, цього має бути більш ніж достатньо для будь-яких розумних тестових випадків! Я не пробував версію на основі permutation, але, як ви кажете, я в першу чергу стосувався довжини коду.
Пол Престиждж

4

LiveScript (179 символів)

Він має детермінований та відносно швидкий час роботи, а також працює з іншими операторами (+, -, *).

f=(s)->                     # define function that takes parameter s
  c=s.replace /[^A-Z]/g ''  # remove all the non-letters
  if c                      # if any letters remain
    for i from 0 to 9       # loop from 0 to 9
       if s.indexOf(i)<0&&a=f s.split(c.0).join i  # if i is not present in the number, replace the first letter with i and call the function recursively
         return a           # if there is a solution, return it
  else                      # if there are no letters left
    if eval s.replace(/(^|\D)0+(\d)/g,'$1$2').replace \= \==  # if the expression is correct (we need to remove leading 0, because javascript interprets numbers with leading 0 as octal)
       return s  # return solution



f("CODE+GOLF=GREAT")

2

Пітон, 256 213 символів

Страхітливий час роботи, спробую покращити далі:

q='='
e=input()
v=set(e)-set([q,'+'])
for x in __import__('itertools').permutations(range(10),len(v)):
    t=e
    for l,n in zip(v,x):t=t.replace(l,str(n))
    try: 
        if eval(t.replace(q,q*2)):print(t);break
    except:pass

2

JavaScript 138

for(s=prompt(p='1');eval(p.replace('=','!='));)for(p=s,i=64;i++<90;)p=p.replace(new RegExp(String.fromCharCode(i),'g'),10*Math.random()|0)

Випадкова груба сила.
Може зайняти деякий час (мій найкращий знімок CODE+GOLF=GREAT- 3 секунди, мій гірший 3 хвилини).
Спробуйте це з простим виразом, якA+B=C


2

Хаскелл, 222

import Data.List
z=(\(b,(_:c))->b:z c).span Data.Char.isUpper
j(Just g)=g
main=interact$(\d@[a,b,c]->show$take 1[e|e<-map(zip$nub$d>>=id)$permutations['0'..'9'],(\f->f a+f b==(f c::Int))(read.map(j.(`lookup`e)))]).take 3.z

Груба сила. Пробує будь-якого можливого відповідності, поки не знайде їх або після того, як закінчить їх випробування. Я розтягнув правила виводу: друкує щось на зразок [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]рішення, а якщо такого немає, друкує []. Дайте мені знати, чи потрібно мені це змінити.


Я думаю, цей вихід прийнятний.
Девід Френк

2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

Всього 975 символів, але 960 з них - пробіл у двох послідовностях, тому їх рахують як 2 символи, і разом з іншими 15 ми отримуємо 17.
975 може здатися чималим, але зауважте, що розв'язок пітонного каналу undergroundmonorail має 18862 символи, вони Ви просто в одному рядку :)

Ви можете запустити його на http://cjam.aditsu.net/ для коротких слів, але, мабуть, вам слід скористатися інтерпретатором java для довших. З Java на моєму ноутбуці, SEND+MORE=MONEYпрацює за 30-40 сек і CODE+GOLF=GREATмайже за 3 хв. Він не приймає числа, починаючи з 0 (тому що це не круто).

Ось програма, яка генерує програму вище (також допомагає, якщо StackExchange неправильно відображає пробіл):

"{L__&=}:U;
{L!!{L))_9>{;:L;I}{+:L;}?}*}:I;
{{U!_{I}*}g}:M;
{L,N<L,g&}:K;
{I{K{L0+:L;}*MK}g}:G;
{{C#L=}%si}:R;
{XRYR+ZR=PRAb0#0<&}:F;
l'+/~'=/~:Z;:Y;:X;
[X0=Y0=Z0=]:P;
XYZ++_&:C,:NB<{0a:L;{F0{GL}?}g}*
L{XR'+YR'=ZR}{L}?"
127b3b[32 9 A]:cf='"\'"_32c9cAc"\"f#3b127b:c~"

Перші 11 рядків містять оригінальну програму (не дуже гольф) у рядку, а останній рядок робить перетворення та додає декодуючу частину.


0

Powershell, 137 байт

порт LiveScript

$f={param($s)if($c=$s-replace'[^A-Z]'){0..9|?{$s-notmatch$_}|%{&$f ($s-replace$c[0],$_)}|Select -f 1}elseif($s-replace'=','-eq'|iex){$s}}

Невикористаний сценарій тесту:

$f={

param($s)                           # parameter string
$c=$s-replace'[^A-Z]'               # remove all the non-letters
if($c){                             # if any letters remain
    0..9|?{                         # loop from 0 to 9
        $s-notmatch$_               # if $s is not contains current number
    }|%{
        &$f ($s-replace$c[0],$_)    # replace the first letter with current number and call the function recursively
    }|Select -f 1                   # seelct first non-null value (break if found)
}
elseif($s-replace'=','-eq'|iex){    # else if evaluated value if the expression is $true
    $s                              # return $s as solution
}

}

&$f "AA+BB=CC"
&$f "A+AB=A"            # empty because it has no solution
&$f "CODE+GOLF=GREAT"

Вихід:

11+22=33
2846+0851=03697

0

PHP, 118 113 байт

for(;;)eval(strtr($argn,"=".$w=substr(count_chars($argn,3),2),"-".$n=str_shuffle(1234567890))."||die('$w
$n');");

друкує цифри під літерами та виходить із програми; петлі нескінченно, якщо нерозв’язні. Виконати як труба з -nr.

зламатися

for(;;)
    eval(                               # 6. evaluate
        strtr($argn,                    # 4. translate letters to digits, "=" to "-"
            "=".$w=substr(              # 2. remove non-letters
                count_chars($argn,3)    # 1. get characters used in the argument
                ,2),
            "-".$n=str_shuffle(1234567890)  # 3. shuffle digits
        )."||die('$w\n$n');"            # 5. if falsy (`A+B-C==0`), print translation and exit
    )
;

0

PHP, 145 байт

function f($s){for(;$i<10*preg_match("/[A-Z]/",$s,$m);)strpos(_.$s,++$i+47)||f(strtr($s,$m[0],$i-1));$i||eval(strtr($s,"=","-")."||die('$s');");}

рекурсивна функція, друкує розв’язане рівняння та виходить із програми; повертається, NULLколи нерозв'язна.

Спробуйте в Інтернеті

зламатися

function f($s)
{
    for(;
        $i<10                   # loop $i from 0 to 9
        *preg_match("/[A-Z]/",$s,$m)    # find a letter; if not found: $i<10*0 == falsy
        ;
    )
        strpos(_.$s,++$i+47)            # find $i in string
        ||f(strtr($s,$m[0],$i-1));      # if not found, replace letter with $i, recurse
    $i||                        # no letter found ($i is unset):
        eval(                   # evaluate:
            strtr($s,"=","-")       # replace "=" with "-"
            ."||die('$s');"         # if falsy (A+B-C==0), print equation, exit program
        );
    # else implicitly return NULL
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.