Quebra-cabeça de quatro quatros

21

O quebra - cabeça de quatro quatros é um quebra-cabeça matemático recreativo popular que envolve o uso exato de quatro 4s (e nenhum outro número) e um conjunto definido de operações para atingir cada número de 0 a um determinado máximo.

Nesta versão, os únicos operadores a seguir são permitidos:

  • Quaisquer símbolos de agrupamento podem ser usados
  • Adição ( +), Subtração ( -), Multiplicação ( *), Divisão ( /)
  • Fatorial ( !), Função gama ( Γ)
  • Exponenciação ( ^), Raiz quadrada ( )
  • Concatenação (por exemplo, 44é dois 4s)
  • Ponto decimal (por exemplo, 4.4dois 4s), Overbar (por exemplo .4~ = 4/9)

A ordem padrão de operações se aplica.

Seu programa deve gerar, dada uma entrada entre 0 e 100 inclusive, uma solução correta para essa entrada. Se o programa gerar uma solução inválida para qualquer entrada, esse programa é inválido.

Por exemplo, com uma entrada de 0, seu programa pode gerar 44-44.

O uso de módulos externos não é permitido. Somente _.4~é permitido para o operador da barra de barra - ou seja, apenas um 4pode estar atrás do ponto decimal.

Isso é código de golfe, então a solução mais curta vence.


Editar : Para ser mais claro, o programa deve gerar um conjunto das operações acima aplicadas a exatamente quatro 4s - nem mais nem menos. Além disso, .4 = 4/10é um termo válido e conta como usando apenas um 4.

Volatilidade
fonte
nenhuma operação de arredondamento? :-(
John Dvorak
@JanDvorak err, não, isso não seria permitido.
Volatilidade
gama e fatorial são permitidos?
John Dvorak
@JanDvorak tudo o que está listado (mas apenas o que está listado) pode ser usado.
Volatilidade
podemos produzir fatorial como uma função de prefixo (em !(4)vez de (4)!)?
John Dvorak

Respostas:

6

GolfScript (129 caracteres *)

[4.`2'√4'24'4!'6'Γ4'1'Γ√4'120'ΓΓ4']2/:F{.F=[[44.`]]*\{`{+{'+*-'1/{:^;.[~@[\]{'()'1/*}%^*@@^~\]\}/}:|~2/~\+|;}+F/}%+}3*\{\0==}+?1=

O tempo de execução é da ordem de 4 minutos no meu PC. Uma aceleração moderada pode ser obtida ao custo de dois caracteres, adicionando uma operação de exclusividade .&imediatamente após o %+.

I usar expressões pré-codificado para 1, 2, 4, 6, 24, 120, e 44, e construir a descansar daqueles usando apenas +, *e -. Dessa forma, não preciso fazer nenhuma aritmética não inteira no próprio programa. Tentei obter expressões mais simples colocando os valores pré-codificados mais simples no início.

Todos esses valores são necessários e é necessário suportar as duas direções da subtração ( complex_expression - simple_expressione vice-versa). Também é necessário incluir algumas operações que exigem parênteses (especificamente a*(b-c)), para que eu agrupe todas as subexpressões indiscriminadamente.

* Estou contando pontos de código Unicode assumindo que o programa está codificado em UTF-8 e escovando o tapete do fato de que, a menos que você esteja usando uma versão recente do Ruby para executar o intérprete, está realmente tratando-o como caracteres ASCII. Se você está muito preocupado com isso, use Gpara Gamma e vsqrt.

Bem, estritamente eu poderia remover 44em troca de 11como 44/4e 71como √(Γ√4+(ΓΓ4+Γ√4)!), mas isso não é uma boa escolha.

Peter Taylor
fonte
7

Python 155 bytes

h={4:'4',24:'4!',6:'â4',.4:'.4',1:'âû4',4/9.:'.4~'}
f={}
def g(r,s='24',y='4!'):f[eval(s)]=y;[g(r-1,s+o+`k`,y+o+h[k])for k in h for o in'/*-+'if r]
g(3)

Os três primeiros bytes ( \xEF\xBB\xBF) são a marca de pedido de UTF-8 bytes, embora o arquivo deva ser salvo no formato ANSI. O ûe âserá interpretado como e Γrespectivamente nos cp437 e cp850 , que devem funcionar em praticamente qualquer caixa do Windows.

O tempo de execução é de cerca de 0,4s no meu computador.

Uso de amostra (nomeie o arquivo four_fours.py):

$ python
>>> from four_fours import f
>>> f[39]
'4!+4!/.4/4'
>>> f[87]
'4!*4-4/.4~'
>>> for i in range(101): print i, f[i]
0 4!+4!-4!-4!
1 4!+4!/4!-4!
2 4!-4!+Γ4-4
3 4!-4!+4-Γ√4
4 4!+4!/Γ4-4!
.
.
.
96 4!+4!+4!+4!
97 4!*4!/Γ4+Γ√4
98 4!*4+Γ4-4
99 4!*4+4-Γ√4
100 4!*4!/Γ4+4

Resultados para 0..100 . Devido à maneira como o hash é iterado, ele prefere usar o 4!mais rápido possível.

Editar: salvou um número de bytes adicionando Γ√4 = 1, o que elimina a necessidade de qualquer agrupamento, e removendo √4 = 2, o que não era mais necessário.

primo
fonte
4

J, 175 161 caracteres

   f=.')',~'(',;@((<;._2'+ - * % .4 .4~ g(r(4)) r(4) 4 g(4) 4! ( ) '){~(143402 A.i.9)
      /:~(12,11,0,6$0 4 4)+(9$4 7 7)#:((,@(+/,-/,*/,%/)~)^:2,0.4 4r9 1 2 4 6 24)&i.)

   f 1
(.4+.4)+(.4%r(4))

   f 42
(r(4)+4)+(g(4)*g(4))

   f 100
(r(4)+r(4))+(4*4!)

O formato verificado é (v op v) op (v op v)onde v={0.4 4/9 1 2 4 6 24}eop={+ - * /}

0..100 resultados

randomra
fonte
Eu não acho que .4seja um número válido para este jogo.
John Dvorak
@JanDvorak que é - talvez eu deveria ter feito mais claro
Volatilidade