Tek İfade, Birçok Değer


26

Bilinen matematiksel sembollerimizi kullanarak: +, x, parantez ve herhangi bir rasyonel sayı, istenen sayıları değerlendiren ifadeler oluşturmak kolaydır. Örneğin: 1+(2x3)=7, (1+2)+(3x6.5)=22.5ve bu kadar. Yeterince sıkıcı.

Bu meydan okuma, biz yeni operatörünü kullanacağız: ±. ±Bir ifadede kullanılması , ifadesini değiştirerek ifadeyi değerlendirmeniz gerektiği anlamına gelir ±.+ veya -tüm yollarla tüm olası değer kümesini döndürmeniz . Örneğin:

  • 1±2±3 = {-4,0,2,6}Çünkü 1±2±3herhangi biri olabilir 1+2+3, 1+2-3, 1-2+3ve1-2-3 onların değerlerini ve vardır 6,0,2,-4sırasıyla.
  • (±2)x(2±3) = {-10,-2,2,10} benzer nedenlerden dolayı.

Olarak çıkıyor Şimdi, ayrı gerçek sayıların herhangi seti önüne alındığında, bu bir ifade oluşturmak mümkündür +, x, (,) , ±, ve gerçek sayılar göz önüne alındığında kümesine değerlendirir.

Görev

Göreviniz (liste / dizi / uygun herhangi bir biçimi) bir diziyi alır seçtiğiniz bir dilde bir program veya fonksiyon yazmaktır tamsayılar oluşan (bir karakter dizisi) bir ifade ve çıkışlar +, x, (, ), ±, ve rasyonel sayılar verilen sayılar kümesini değerlendirir.

  • Tam karakter olduğunu unutmayın ± önemli olmadığını ; Kullanmakta olduğunuz diğer karakterlerden ayırt edilebilir olduğu sürece istediğiniz herhangi bir karakteri kullanabilirsiniz. Ancak gönderiminizde hangi karakteri kullandığınızı belirtmelisiniz.
  • Girdi, kullanılan rasyonel sayıların ondalık değerlerinden (makul hassasiyete kadar) oluşmasına izin verilir.
  • Giriş ve çıkış, standart yollardan biriyle alınabilir.
  • Standart boşluklar yasaktır.
  • Verilen tam sayıların farklı olacağını ve artan sırayla sağlandığını varsayabilirsiniz.
  • Çıktı boşluk ve yeni satırlar içerebilir.

Kazanan Kriter

Bu , bayt cinsinden en kısa kod kazanır.

Örnekler

Giriş | Olası çıkış
------------- + -----------------------------
[1,2,3] | 2 ± 0.5 ± 0.5                   
[-7, -3,1,21] | (1 ± 2) x (3 ± 4)

Şehirlerin Turnuvası'ndaki bir sorudan alınan fikir , 2015 Sonbaharında .


5
PPCG'ye Hoşgeldiniz! Güzel ilk meydan okuma! Bence bunun tersi bir yol olsaydı (ifadeyi verilen seti bul) daha fazla cevap alacağını düşünüyorum çünkü bu oldukça zor bir iştir. Yine de iyi meydan okuma!
— HyperNeutrino

Yeniden hoşgeldiniz! @HyperNeutrino’a ek olarak, bazı faktörler için muhtemelen, hangi faktörün “en iyi” olduğuna karar verirken, karar faktörü özlü olmadıkça, problem olabilecek bazı çözümler olabilir
— David Archibald

@HyperNeutrino Teşekkürler! Bunun biraz zor olabileceğinin farkındaydım, ancak buradaki golfçülerin üstün yeteneklerine tamamen inanıyorum; nasıl olduğunu görelim. :)
— Ankoganit

3
Evet. Bu sitedeki golfçülerden bazıları inanılmaz süper güçlere sahip ve hatta bazılarının golf botları olduğundan şüphelendikimiz> _>: D
— HyperNeutrino

@DavidArchibald Evet, amaçlanan çıktı çalışan herhangi bir çözümdür.
— Ankoganit,

Yanıtlar:


11

Python 2 , 56 bayt

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

Çevrimiçi deneyin!

?Açılımı ±. Örnek kullanım:

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

Fikir şu ki, bir ifade alıp bunu yaparak kendi değerlerine Eyeni bir değer hekleyebiliriz (.5±.5)*(E+-h)+h.


Neden +-hve sadece değil -h? Yapamaz İşte bu yüzden, +a -ve kaldırmak -programda şu anda var mı?
— isaacg

1
@isaacg Spesifikasyon -ifadesinde bir operatöre izin vermiyor .
— xnor

9

Haskell , 52 bayt

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

Çevrimiçi deneyin!

Kullanımları ?için ±. Örnek:

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

İşlev shows, shows a b=(show a)++bLynn'den öğrendiğim bir numara.

shows 12 "abc" ->
"12abc"

5

Haskell , 58 bayt

Bir az bayt olduğu #için kullanmak ±.

f tamsayıların bir listesini alır ve bir dize döndürür.

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

Sonuç formda olan n+(.5#.5)x(rest), nlistenin birinci eleman ve resttüm diğerlerinin temsilidir nher birinden çıkartılmaktadır.

Çevrimiçi deneyin!


5

Jöle , 29 bayt

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

Baskılar v + (0.5¤0.5) x (i 1 + (0.5¤0.5) x ((i 2 + (0.5¤0.5) x ... ((i , n ) ...))) burada v ilk sayı olduğu girdi dizisi ve i , n olup , n inci girdi dizisinin elemanları arasında artan bir fark.

Çevrimiçi deneyin!

Nasıl?

“(¤)”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))

4

05AB1E , 25 bayt

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

Çevrimiçi deneyin!

açıklama

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

İfadenin sağdan oluşturulması maalesef aynı bayt sayılır
0¸«¥¤s¨RvX;Dy"ÿ+(ÿ±ÿ)*(ÿ). Kurulum için kullanılan 8 bayt burada büyük atıktır.


3

Haskell, 54 bayt

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

+ - işaretidir '?'. örnek:

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

2

JavaScript (ES6), 56 51 bayt

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

@ JonathanAllan'ın formülüne dayanarak. @açılımı ±.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.