Jedno wyrażenie, wiele wartości

26

Korzystając z naszych znanych symboli matematycznych: +, x, nawias i dowolna liczba wymierna, łatwo jest utworzyć wyrażenia, które zostaną ocenione na określoną liczbę. Na przykład 1+(2x3)=7, (1+2)+(3x6.5)=22.5i tak dalej. Nudno.

W tym wyzwaniem, użyjemy nowego operatora: ±. Zastosowanie ±w wyrażeniu oznacza, że trzeba ocenić ekspresję poprzez zastąpienie ±„s przez +lub -na wszystkie możliwe sposoby i powrót zbiór wszystkich możliwych wartości. Na przykład:

  • 1±2±3 = {-4,0,2,6}ponieważ 1±2±3może być dowolny 1+2+3, 1+2-3, 1-2+3i 1-2-3, a ich wartości są 6,0,2,-4odpowiednio.
  • (±2)x(2±3) = {-10,-2,2,10} z podobnych powodów.

Teraz, jak się okazuje, biorąc pod uwagę każdy zestaw różnych liczb rzeczywistych, to jest możliwe, aby utworzyć wyrażenie z +, x, (, ), ±, i liczbami rzeczywistymi, że ma wartość danego zestawu.

Zadanie

Twoim zadaniem jest napisanie programu lub funkcji w dowolnym języku, który zabierze sekwencję (lista / tablica / dowolny wygodny format) z liczb całkowitych i wyprowadza wyrażenie (jako ciąg) składający się z +, x, (, ), ±, i liczb wymiernych który ocenia na zbiór podanych liczb.

  • Pamiętaj, że dokładny znak ±nie ma znaczenia; możesz użyć dowolnej innej postaci, o ile można ją odróżnić od innych używanych postaci. Musisz jednak wspomnieć, jakiej postaci używasz w swoim zgłoszeniu.
  • Dane wejściowe mogą składać się z przybliżeń dziesiętnych (do rozsądnej dokładności) użytych liczb wymiernych.
  • Dane wejściowe i wyjściowe można pobierać na dowolny ze standardowych sposobów.
  • Standardowe luki są zabronione.
  • Możesz założyć, że podane liczby całkowite będą różne i podane w porządku rosnącym.
  • Dane wyjściowe mogą zawierać spacje i znaki nowej linii.

Zwycięskie kryterium

To jest , więc wygrywa najkrótszy kod w bajtach.

Przykłady

Wejście | Możliwe wyjście
------------- + -----------------------------
[1,2,3] | 2 ± 0,5 ± 0,5                   
[-7, -3,1,21] | (1 ± 2) x (3 ± 4)

Pomysł zaczerpnięty z pytania z Turnieju Miast, jesień 2015 .

Ankoganit
źródło
5
Witamy w PPCG! Ładne pierwsze wyzwanie! Myślę, że przyciągnęłoby to więcej odpowiedzi, gdyby było na odwrót (znajdź zestaw z podanym wyrażeniem), ponieważ wydaje się, że jest to dość trudne wyzwanie. Niemniej jednak dobre wyzwanie!
HyperNeutrino
Witaj ponownie! Dodając do @HyperNeutrino, prawdopodobnie będzie wiele rozwiązań dla niektórych zestawów, co może stanowić problem przy podejmowaniu decyzji, które pytanie jest „najlepsze”, chyba że decydującym czynnikiem jest zwięzłość
David Archibald
@HyperNeutrino Thanks! Zrozumiałem, że może to okazać się nieco trudne, ale w pełni wierzę w lepsze możliwości golfistów tutaj; zobaczmy, jak się okaże. :)
Ankoganit
3
Tak. Niektórzy golfiści na tej stronie mają niesamowite supermoce, a nawet podejrzewamy, że niektórzy są botami do gry w golfa> _>: D
HyperNeutrino 17.04.17
@DavidArchibald Tak, zamierzonym wyjściem jest każde rozwiązanie, które działa.
Ankoganit

Odpowiedzi:

11

Python 2 , 56 bajtów

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

Wypróbuj online!

?Oznacza ±. Przykładowe użycie:

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

Chodzi o to, że możemy zrobić wyrażenie Ei dołączyć nową wartość hdo zestawu wartości, wykonując to (.5±.5)*(E+-h)+h.

xnor
źródło
Dlaczego +-hnie tylko -h? To znaczy, dlaczego nie zrobić +a -i usunąć ten, -który jest obecnie w programie?
isaacg
1
@isaacg Specyfikacja nie zezwala na -operator w wyrażeniu.
xnor
9

Haskell , 52 bajty

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

Wypróbuj online!

Wykorzystuje ?do ±. Przykład:

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

Funkcja showsdziała shows a b=(show a)++b- sztuczka, której nauczyłem się od Lynn.

shows 12 "abc" ->
"12abc"
xnor
źródło
5

Haskell , 58 bajtów

Używanie #dla ±, ponieważ jest to jeden bajt mniej.

f pobiera listę liczb całkowitych i zwraca ciąg znaków.

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

Wynik ma postać n+(.5#.5)x(rest), gdzie njest pierwszym elementem listy i restreprezentuje wszystkie pozostałe z nodejmowanymi od siebie.

Wypróbuj online!

Ørjan Johansen
źródło
5

Galaretka , 29 bajtów

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

Drukuje v + (0,5¤0,5) × (i 1 + (0,5¤0,5) × ((i 2 + (0,5¤0,5) × (... (i n ) ...))), gdzie v jest pierwszą liczbą w tablica wejściowa i n jest n- przyrostową różnicą między elementami tablicy wejściowej.

Wypróbuj online!

W jaki sposób?

“(¤)”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
źródło
4

05AB1E , 25 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Budowanie wyrażenia z prawej strony kończy się niestety taką samą liczbą bajtów
0¸«¥¤s¨RvX;Dy"ÿ+(ÿ±ÿ)*(ÿ). 8 bajtów użytych do instalacji jest tutaj dużym marnotrawstwem.

Emigna
źródło
3

Haskell, 54 bajty

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

znak + - to '?'. przykład:

f[1,2,3,4] = "1+(.5#.5)*(1+(.5#.5)*(1+(.5#.5)*(1+(.5#.5)*(0))))"
dumny haskeller
źródło
2

JavaScript (ES6), 56 51 bajtów

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

Na podstawie formuły @ JonathanAllan. @oznacza ±.

Neil
źródło