Uma expressão, muitos valores

26

Usando nossos familiares símbolos matemáticos: +, x, parênteses e qualquer número racional, é fácil criar expressões que sejam avaliadas para um número desejado. Por exemplo: 1+(2x3)=7, (1+2)+(3x6.5)=22.5e assim por diante. Chato o suficiente.

Neste desafio, usaremos um novo operador: ±. O uso de ±em uma expressão significa que você precisa avaliar a expressão substituindo os ±'s por +ou -de todas as maneiras possíveis e retornando o conjunto de todos os valores possíveis. Por exemplo:

  • 1±2±3 = {-4,0,2,6}porque 1±2±3pode ser qualquer um 1+2+3, 1+2-3, 1-2+3e 1-2-3e os seus valores são 6,0,2,-4respectivamente.
  • (±2)x(2±3) = {-10,-2,2,10} por razões semelhantes.

Agora, como se vê, dado qualquer conjunto de números reais distintos, é possível criar uma expressão com +, x, (, ), ±, e números reais que avalia o conjunto dado.

Tarefa

Sua tarefa é escrever um programa ou função em um idioma de sua escolha, que leva uma seqüência (lista / array / qualquer formato conveniente) de números inteiros e produz uma expressão (como uma string), constituído por +, x, (, ), ±, e números racionais que avalia o conjunto dos números fornecidos.

  • Observe que o caractere exato ±não importa; você pode usar qualquer outro caractere de sua escolha, desde que seja distinguível dos outros caracteres que estiver usando. Mas você deve mencionar qual personagem está usando em sua submissão.
  • É permitido que a entrada consista em aproximações decimais (até precisão razoável) dos números racionais utilizados.
  • A entrada e a saída podem ser obtidas de qualquer uma das maneiras padrão.
  • As brechas padrão são proibidas.
  • Você pode assumir que os números inteiros fornecidos serão distintos e fornecidos em ordem crescente.
  • A saída pode conter espaços e novas linhas.

Critério vencedor

Isso é , então o código mais curto em bytes vence.

Exemplos

Entrada | Saída possível
------------- + -----------------------------
[1,2,3] 2 ± 0,5 ± 0,5                   
[-7, -3,1,21] | (1 ± 2) x (3 ± 4)

Ideia tirada de uma pergunta no Torneio das Cidades, outono de 2015 .

Ankoganit
fonte
5
Bem-vindo ao PPCG! Bom primeiro desafio! Eu acho que isso atrairia mais respostas se fosse o contrário (encontre o cenário com a expressão) porque parece que esse é um desafio bastante complicado. Bom desafio, no entanto!
HyperNeutrino
Bem vindo novamente! Adicionando para @HyperNeutrino, provavelmente haverá várias soluções para alguns dos conjuntos, o que poderia ser um problema, ao decidir qual questão é o "melhor" a menos que o fator decisivo é a concisão
David Archibald
@HyperNeutrino Thanks! Eu percebi que isso pode se tornar um pouco difícil, mas acredito plenamente nas capacidades superiores dos golfistas daqui; vamos ver como fica. :)
Ankoganit
3
Sim. Alguns dos jogadores neste site têm superpoderes incríveis, e nós sequer suspeitar alguns estão golfe bots> _>: D
HyperNeutrino
@DavidArchibald Sim, a saída pretendida é qualquer solução que funcione.
Ankoganit

Respostas:

11

Python 2 , 56 bytes

f=lambda h,*t:t and"(.5?.5)*(%s+%%s)+"%f(*t)%-h+`h`or`h`

Experimente online!

O ?significa ±. Exemplo de uso:

f(-3,5,20) ->
(.5?.5)*((.5?.5)*(20+-5)+5+3)+-3

A idéia é que podemos pegar uma expressão Ee juntar um novo valor hao seu conjunto de valores fazendo (.5±.5)*(E+-h)+h.

xnor
fonte
Por que +-he não apenas -h? Ou seja, por que não fazer a +um -e remover o -que está atualmente no programa?
Isaacg
1
@isaacg A especificação não permite um -operador na expressão.
Xnor
9

Haskell , 52 bytes

f(h:t)=shows h"+(.5?.5)*("++f[x-h|x<-t]++")"
f e="0"

Experimente online!

Usa ?para ±. Exemplo:

f [1,3,7] ->
1+(.5?.5)*(2+(.5?.5)*(4+(.5?.5)*(0)))

A função showsfunciona shows a b=(show a)++b, um truque que aprendi com Lynn.

shows 12 "abc" ->
"12abc"
xnor
fonte
5

Haskell , 58 bytes

Usando #para ±, como é um byte a menos.

f pega uma lista de números inteiros e retorna uma string.

f[x]=show x
f(x:r)=show x++"+(.5#.5)x("++f((-x+)<$>r)++")"

Resultado é o formato n+(.5#.5)x(rest), onde né o primeiro elemento da lista e resté a representação de todos os outros com nsubtraídos de cada um.

Experimente online!

Ørjan Johansen
fonte
5

Gelatina , 29 bytes

“(¤)”j.⁾+×j;”(
I;@Ḣj¢;”)ẋ⁸L¤¤

Imprime v + (0,5¤0,5) × (i 1 + (0,5¤0,5) × ((i 2 + (0,5¤0,5) × (... (i n ) ...)))) em que v é o primeiro número em a matriz de entrada e i n é o n th diferença incremental entre os elementos da matriz de entrada.

Experimente online!

Quão?

“(¤)”j.⁾+×j;”( - Link 1, adjoining list: no input
“(¤)”          - literal     ['(','¤',')']
      .        - literal     0.5
     j         - join        ['(',0.5,'¤',0.5,')']
       ⁾+×     - literal     ['+','×']
          j    - join        ['+',['(',0.5,'¤',0.5,')'],'×']
            ”( - literal     '('
           ;   - concatenate ['+',['(',0.5,'¤',0.5,')'],'×','(']

I;@Ḣj¢;”)ẋ⁸L¤¤ - Main link: list a               e.g. [-1,5,2]
I              - incremental differences(a)           [6,-3]
   Ḣ           - head(a)                              [-1]
 ;@            - concatenate (rev @rgs)               [-1,6,-3]
     ¢         - last link (1) as a nilad             ['+',['(',0.5,'¤',0.5,')'],'×','(']
    j          - join                                 [-1,['+',['(',0.5,'¤',0.5,')'],'×','('],6,['+',['(',0.5,'¤',0.5,')'],'×','('],-3]
             ¤ - nilad followed by link(s) as a nilad
            ¤  -     nilad followed by link(s) as a nilad
          ⁸    -         link's left argument, a
           L   -         length                       3
       ”)      -     literal ')'
         ẋ     -     repeat                           [')',')',')']
      ;        - concatenate                          [-1,['+',['(',0.5,'¤',0.5,')'],'×','('],6,['+',['(',0.5,'¤',0.5,')'],'×','('],-3,')',')',')']
               - implicit print                       -1+(0.5¤0.5)×(6+(0.5¤0.5)×(-3))
Jonathan Allan
fonte
4

05AB1E , 25 bytes

0¸«¥X;D"+(ÿ±ÿ)*("ý¹g<')×J

Experimente online!

Explicação

0¸«                        # prepend a 0 to input list
   ¥                       # calculate delta's
    X;D                    # push 0.5 twice
       "+(ÿ±ÿ)*("          # push this string and interpolate 0.5 where "ÿ" is
                 ý         # merge the list of delta's with this string as a separator
                  ¹g<')×J  # add the closing parenthesis

Infelizmente, construir a expressão da direita acaba com a mesma contagem de bytes
0¸«¥¤s¨RvX;Dy"ÿ+(ÿ±ÿ)*(ÿ). Os 8 bytes usados ​​para a instalação são o grande desperdício aqui.

Emigna
fonte
3

Haskell, 54 bytes

f[]="0"
f(x:s)=show x++"+(.5?.5)*("++f(map(-x+)s)++")"

o sinal + - é '?'. exemplo:

f[1,2,3,4] = "1+(.5#.5)*(1+(.5#.5)*(1+(.5#.5)*(1+(.5#.5)*(0))))"
orgulhoso haskeller
fonte
2

JavaScript (ES6), 56 51 bytes

f=([v,...a],x=v)=>x?x+`+([email protected])*(${f(a,a[0]-v)})`:0

Com base na fórmula de @ JonathanAllan. @apoia± .

Neil
fonte