Um número de Friedman é um número inteiro positivo que é igual a uma expressão não trivial que usa seus próprios dígitos em combinação com as operações +, -, *, /, ^, parênteses e concatenação.
Um número agradável de Friedman é um número inteiro positivo que é igual a uma expressão não trivial que usa seus próprios dígitos em combinação com as mesmas operações, com os dígitos em sua ordem original.
Um Número Friedman Muito Bom (VNFN), que estou inventando aqui, é um Número Friedman Agradável, que pode ser escrito sem as partes menos bonitas (na minha opinião) de tal expressão. Parênteses, concatenação e negação unária não são permitidos.
Para esse desafio, há três maneiras possíveis de escrever uma expressão sem parênteses.
Prefixo: Isso é equivalente à associatividade à esquerda. Este tipo de expressão é gravado com todos os operadores à esquerda dos dígitos. Cada operador se aplica às duas expressões a seguir. Por exemplo:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
Um VNFN que pode ser escrito dessa maneira é 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Postfix: Isso é equivalente à associatividade correta. É como a notação de prefixo, exceto que a operação vai para a direita dos dígitos. Cada operador se aplica às duas expressões anteriores. Por exemplo:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
Um VNFN que pode ser escrito dessa maneira é 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: a notação Infix usa a ordem padrão de operações para as cinco operações. Para os propósitos do desafio, essa ordem de operações será definida da seguinte forma: Coloque entre parênteses ^
primeiro, à direita associativamente. Então, entre parênteses *
e /
simultaneamente, saiu associativamente. Por fim, entre parênteses +
e -
simultaneamente, deixados associativamente.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
Um VNFN que pode ser escrito dessa maneira é 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Desafio: dado um número inteiro positivo, se ele puder ser expresso como uma expressão não trivial de seus próprios dígitos em notação de prefixo, infixo ou postfix, produza essa expressão. Caso contrário, não produza nada.
Esclarecimentos: Se várias representações forem possíveis, você poderá gerar qualquer subconjunto não vazio delas. Por exemplo, 736 é um VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
ou ambos seriam saídas aceitáveis.
Uma expressão "trivial" significa aquela que não usa nenhum operador. Isso é relevante apenas para números de um dígito e significa que os números de um dígito não podem ser VNFNs. Isso é herdado da definição de um número de Friedman.
As respostas devem ser executadas em segundos ou minutos em entradas inferiores a um milhão.
IO: Regras padrão de IO. Programa completo, função, verbo ou similar. STDIN, linha de comando, argumento da função ou similar. Para a saída de "Nothing", a string vazia, uma linha em branco null
ou similar e uma coleção vazia são boas. A saída pode ser uma sequência delimitada com um caractere que não pode estar em uma representação ou pode ser uma coleção de sequências.
Exemplos:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Pontuação: Este é o código de golfe. Menos bytes ganha.
Além disso, se você encontrar um, forneça um novo número Friedman muito bom na sua resposta.
fonte
*(+(*(1,2),3,4)
está faltando um parêntese próximo, depois,3
Parentheses, concatenation and unary negation are disallowed.
Respostas:
Perl,
345334318293263245BLigue com
perl -M5.10.0 scratch.pl 736
Resultados
Os primeiros resultados que encontrei são:
Explicação
Totalmente não-destruído
Tentei me repetir o máximo possível para facilitar o golfe mais tarde.
Como é jogado
$_=q! ... !;eval
Isso fornece algo assim, do qual você pode remover as quebras de linha do resultado:
fonte
}glob
e salvar alguns bytes.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :) #Somente Ruby 2.1.5 -
213220238 + 9 = 247Não sei como Ruby vence Perl, mas aqui está ...
Execute isso com um sinalizador -rtimeout (e -W0 ou envie seu stderr para outro lugar).
Para tornar isso um pouco mais robusto, substitua
send([].methods[81],z-1)
porrepeated_permutation(z-1)
e marque um caractere extra (portanto, 248 ).Basicamente, passe por todas as permutações de operadores e tente infix, postfix e prefixo nessa ordem. O
d
método usaeval
no segundo parâmetro para executar os cálculos, capturando quaisquer exceções DivideByZero ou Overflow.Você precisa enviar stderr para / dev / null, porém, ou
eval
às vezes imprimirá avisos como(eval):1: warning: in a**b, b may be too big
.Enquanto eu criava esse jogo, encontrei uma maneira de salvar três caracteres!
Ungolfed (princípios desatualizados, mas semelhantes):
Changelog
247 fez esse trabalho para números maiores, em vez de atingir o tempo limite.
220 eliminaram três caracteres declarando matrizes paren e corrigiram um erro em que números de um dígito eram considerados VNFNs
213 confirmação inicial
fonte
a.zip(b,c)
retorna uma matriz de matrizes como[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
e['hi', 'there']*''
apenas concatena a representação de string dos valores da matriz.[a,b]*3
rende[a,b,a,b,a,b]
MATLAB (435 b)
tente aqui
http://octave-online.net/
fonte
Python 2, 303 bytes
Experimente online
A saída do infix conterá em
**
vez de^
. Se isso não for permitido,.replace('**','^')
ocorrerá e adicionará outros 18 bytesExplicação:
fonte