Một tập hợp con của số học bằng lời nói


8

Thực hiện một bộ giải số học bằng lời nói của một số dãy số giống nhau được cộng lại với nhau:

  TWO
+ TWO
-----
 FOUR

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

  SPEED
+ SPEED
-------
  KILLS

Có một số hạn chế: mỗi chữ cái phải đại diện cho các chữ số khác nhau và không có chữ cái nào có thể bằng không.

Thực hiện bộ giải dưới dạng hàm của toán hạng, tổng và số lần lặp lại trả về một danh sách các giải pháp (giải pháp: bộ dữ liệu của toán hạng và tổng kết quả). Ví dụ:

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

Bạn không cần biểu diễn các biến dưới dạng chữ cái và bạn không cần sử dụng hàm băm trong giải pháp. Tìm kiếm lực lượng cho phép.

Mã ngắn nhất sẽ thắng.


Bạn có thể đưa ra một giải pháp mẫu cho hai trường hợp khác?
fR0DY

TỐC ĐỘ: = 29331, 58662: = KILLS, mã theo sau, cần phải được đánh gôn.
người dùng không xác định

Câu trả lời:


3

Toán học

Không gian thêm vào cho rõ ràng. Không chơi gôn nhiều.
Cần sử dụng chữ cái Hy Lạp vì các chữ cái đầu vào được coi là ký hiệu.

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

Sử dụng:

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

Nó không tìm thấy bất kỳ giải pháp nào cho TỐC ĐỘ + TỐC ĐỘ + TỐC ĐỘ = KILLS ... đó có phải là một lỗi không?

Biên tập

Cho phép bằng 0, nó tìm thấy các giải pháp sau cho phương trình TỐC ĐỘ + TỐC ĐỘ + TỐC ĐỘ = KILLS:

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

Biên tập

Theo nhận xét:

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

meta-comment ... Có cách nào để hiển thị các chữ cái Hy Lạp trong các khối mã không?
Tiến sĩ belisarius

EDIT: cái được hiển thị trên tờ giấy chỉ có hai TỐC ĐỘ
Ming-Tang

belisarius: Thủ thuật không phải là sử dụng các lối thoát HTML. Vì những người chỉ đại diện cho các ký tự sử dụng các ký tự trực tiếp không bị cấm ;-). Bạn có thể phải sửa chữa thụt lề của bạn, mặc dù; Tôi không chắc là tôi đã giữ đúng.
Joey

@Joey Các ký tự thoát không được sử dụng trong nguồn Mathicala, tôi chỉ sử dụng chúng để hiển thị ở đây. Nhưng có vẻ như không phải tất cả các trình duyệt đều hiển thị các ký tự bằng nhau. Tôi thấy mã của bạn và của tôi giống hệt nhau :)
Tiến sĩ belisarius

1

Con trăn

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


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

Sử dụng:

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

0

PHP (200)

Hàm này mất nhiều thời gian để thực thi và sử dụng nhiều bộ nhớ, nhưng nó đáp ứng các tiêu chí.

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

Sử dụng mẫu:

$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

Giải thích không chơi gôn:

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

Nếu chúng tôi được phép nhập toán hạng và tính tổng dưới dạng chuỗi thay vì mảng, thì tôi có thể bỏ qua các thao tác nối và lưu 20 ký tự để đặt tổng số ở mức 180.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.