Um subconjunto da aritmética verbal

8

Implemente um solucionador aritmético verbal de várias mesmas seqüências de números somados:

  TWO
+ TWO
-----
 FOUR

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

  SPEED
+ SPEED
-------
  KILLS

Existem algumas restrições: cada letra deve representar dígitos diferentes e nenhuma letra pode ser zero.

Implemente o solucionador em função dos operandos; a soma e o número de repetições retornam uma lista de soluções (solução: a tupla do operando e da soma resultantes). Por exemplo:

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

Você não precisa representar variáveis ​​como letras e não precisa usar um hash na solução. Pesquisa de força bruta permitida.

O menor código vence.

Ming-Tang
fonte
Você pode fornecer uma solução de amostra para os outros dois casos?
FR0DDY 18/03/11
VELOCIDADE: = 29331, 58662: = MATA, o código a seguir, precisa ser jogado no golfe.
usuário desconhecido

Respostas:

3

Mathematica

Espaços adicionados para maior clareza. Não é muito golfe.
Precisa usar letras gregas, porque as letras de entrada são tratadas como símbolos.

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

Uso:

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ão encontrou nenhuma solução para o SPEED + SPEED + SPEED = KILLS ... isso é um bug?

Editar

Permitindo zero, encontra as seguintes soluções para a equação SPEED + SPEED + SPEED = KILLS:

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

Editar

De acordo com o comentário:

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}}
Dr. belisarius
fonte
meta-comentário ... Existe uma maneira de mostrar letras gregas em blocos de código?
Dr. belisarius
EDIT: a mostrada no papel tem apenas duas velocidades de
Ming-Tang
belisarius: O truque é não usar escapes de HTML. Como aqueles que representam apenas caracteres usando caracteres diretamente, não é proibido ;-). Você pode ter que consertar seu recuo; Não tenho certeza se mantive isso correto.
Joey
@ Joey Os caracteres de escape não são usados ​​na fonte do Mathematica, usei-os apenas para renderização aqui. Mas parece que nem todos os navegadores tornam os caracteres iguais. Eu vejo o seu código e meu exatamente o mesmo :)
Dr. belisarius
1

Pitão

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

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

Uso:

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 :)
Usuário desconhecido
fonte
0

PHP (200)

Essa função leva muito tempo para ser executada e usa muita memória, mas atende aos critérios.

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

Uso da amostra:

$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

Explicação sem golfe:

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

Se for permitido inserir o operando e somar como strings em vez de matrizes, posso pular as operações de junção e salvar 20 caracteres para colocar o total em 180.

migimaru
fonte