Subset dari aritmatika verbal

8

Terapkan pemecah aritmatika verbal dari beberapa urutan angka yang sama yang ditambahkan bersamaan:

  TWO
+ TWO
-----
 FOUR

  REPEAT
  REPEAT
  REPEAT
+ REPEAT
--------
 ANDSTOP

  SPEED
+ SPEED
-------
  KILLS

Ada beberapa batasan: setiap huruf harus mewakili angka yang berbeda, dan tidak ada huruf yang bisa nol.

Menerapkan pemecah sebagai fungsi operan, jumlah dan jumlah pengulangan mengembalikan daftar solusi (solusi: tupel dari operan dan jumlah yang dihasilkan). Sebagai contoh:

f(['T','W','O'], ['F','O','U','R'], 2) == [(734, 1468)]

Anda tidak perlu merepresentasikan variabel sebagai huruf, dan Anda tidak perlu menggunakan hash dalam solusinya. Pencarian dengan kekerasan diperbolehkan.

Kode terpendek menang.

Ming-Tang
sumber
Bisakah Anda memberikan solusi sampel untuk dua kasus lainnya?
fR0DDY
SPEED: = 29331, 58662: = KILLS, kode berikut, harus di-golf.
pengguna tidak diketahui

Jawaban:

3

Mathematica

Spaces ditambahkan untuk kejelasan. Tidak banyak bermain golf.
Harus menggunakan huruf Yunani karena huruf input diperlakukan sebagai simbol.

F[σ_ ,ρ_ ,τ_]:=
 (φ = FromDigits;
 Rest@Union[
   If [ τ * φ@σ == φ@ρ, {φ@σ,φ@ρ} ] /.#& /@
 (Thread[Rule[ σ ∪ ρ , # ] ] & /@ Permutations[Range@9, {Length[σ ∪ ρ] }])])

Pemakaian:

F[{r,e,p,e,a,t},{a,n,d,s,t,o,p},3]
{{819123,2457369}}

F[{s,p,e,e,d},{k,i,l,l,s},3]
{}

F[{t,w,o},{f,o,u,r},2]
{{734,1468},{836,1672},{846,1692},{867,1734},{928,1856},{938,1876}}  

Itu tidak menemukan solusi untuk SPEED + SPEED + SPEED = KILLS ... apakah itu bug?

Edit

Membiarkan nol, ia menemukan solusi berikut untuk persamaan SPEED + SPEED + SPEED = KILLS:

{{10887,32661},{12667,38001},{23554,70662},
 {23664,70992},{25334,76002},{26334,79002}}

Edit

Menurut komentar:

F[{s, p, e, e, d}, {k, i, l, l, s}, 2]  

{{21776,43552},{21886,43772},{23556,47112},{27331,54662},
 {29331,58662},{42667,85334},{45667,91334},{46557,93114}}
Belisarius
sumber
meta-comment ... Apakah ada cara untuk menampilkan huruf yunani di blok kode?
Dr. belisarius
EDIT: yang ditunjukkan di atas kertas hanya memiliki dua SPEED
Ming-Tang
belisarius: Trik untuk tidak menggunakan pelarian HTML. Karena mereka hanya mewakili karakter yang menggunakan karakter secara langsung tidak dilarang ;-). Anda mungkin harus memperbaiki indentasi Anda; Saya tidak yakin saya menyimpannya dengan benar.
Joey
@ Joey Karakter yang lolos tidak digunakan dalam sumber Mathematica, saya menggunakannya hanya untuk merender di sini. Tapi sepertinya tidak semua browser memberikan karakter yang sama. Saya melihat kode Anda dan saya persis sama :)
Dr. belisarius
1

Python

def f(A,B,N):
 D={}
 r=[]
 for j in A:D[j]=0
 for j in B:D[j]=0
 x=len(D)
 for i in xrange(10**(x-1),10**x):
        c=str(i)
        s={}
        for j in c:s[j]=0
        if(len(s)-x or '0' in c):continue
        k=P=Q=0
        for j in D:D[j]=int(c[k]);k+=1
        for j in A:P=P*10+D[j]
        for j in B:Q=Q*10+D[j]
        if(P*N==Q):r.append((P,Q))
 return r
print f(['T','W','O'], ['F','O','U','R'], 2)

http://ideone.com/4wIQe

fR0DDY
sumber
1

scala: 333 289

type S=String
def d(x:S,m:Map[Char,Int])={var s=0
for(c<-x;k=m.find(_._1==c);v=(k.get)._2){s*=10
s+=v}
s}
def s(t:Int,f:S,p:S):Unit={
def c(m:Map[Char,Int])=d(f,m)*t==d(p,m)
val g=f.toSet++p
val m=g.zip(util.Random.shuffle((1 to 9).toSeq).take(g.size))
if(c(m.toMap))print(m)else s(t,f,p)}

Pemakaian:

s (2,"SPEED","KILLS")
Set((D,7), (K,8), (I,5), (E,6), (S,4), (L,3), (P,2))

s(4,"REPEAT","ANDSTOP")
// endless loop :)
Pengguna tidak diketahui
sumber
0

PHP (200)

Fungsi ini membutuhkan waktu yang sangat lama untuk mengeksekusi dan menggunakan banyak memori, tetapi memenuhi kriteria.

function f($o,$s,$n){$w=count_chars(($c=join($o)).$d=join($s),3);while(++$i<pow(10,9)){if(($u=count_chars($i,3))&&$u[0]*$u[8]&&($n*$a=strtr($c,$w,$i))==$b=strtr($d,$w,$i))$x[]=array($a,$b);}return$x;}

Penggunaan sampel:

$a=array('T','W','O');
$b=array('F','O','U','R');
$c=f($a, $b, 2); // returns an array of tuples that satisfy the equation

Penjelasan un-golf:

function solve($operand, $sum, $num) {
  // convert the operand and sum arrays into strings, join them, then get a string containing the unique characters
  $operand_string = join($operand);
  $sum_string = join($sum);
  $unique_chars = count_chars($operand_string . $sum_string, 3);

  // loop from 1 to 10^9
  while (++$i < pow(10,9)) {
    // get the unique digits in $i
    $unique_digits = count_chars($i, 3);
    // check whether the first digit is non-zero (count_chars sorts in ascending order)
    // and whether the ninth digit is non-zero, these conditions guarantee that $i
    // is a permutation of 1...9 
    if ($u[0] * $u[8]) {
      // translate the operand and sum into numbers, then check if the operand * num = sum
      $translated_operand = strtr($operand_string, $unique_chars, $i);
      $translated_sum = strtr($sum_string, $unique_chars, $i);
      if ($num * $translated_operand == $translated_sum) {
        // add the solution to the solutions array
        $solutions[] = array($translated_operand, $translated_sum);
      }
    }
  }
  // return the solutions array
  return $solutions;
}

Jika kami diizinkan untuk memasukkan operan dan menjumlahkan sebagai string, bukan array, maka saya dapat melewati operasi gabungan dan menyimpan 20 karakter untuk membuat total 180.

migimaru
sumber