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.