Dizim buna eşit olmalı, ama değil!


21

N tamsayı ve bir tamsayı aiçeren bir tamsayı dizisi ; toplamı eşitlemek için en az miktarda öğeyi kaldırın . Herhangi bir kombinasyonları halinde kutu şeklinde bir falsy değeri döndürür.xaaxax

Bir yorumda belirtildiği gibi, bu, toplam x ile ayarlanan maksimum değerdir, daha küçük matematik beynimden özür dilerim. Üniversiteden beri çok fazla şartları unuttum.


Örnekler (Truthy):

f([1,2,3,4,5,6,7,8,9,10], 10) = [1,2,3,4]

f([2,2,2,2,2,2,2,2,2], 10) = [2,2,2,2,2]

f([2,2,2,2,-2,-2,-2,-4,-2], -8) = [2,2,-2,-2,-2,-4,-2]

f([-2,-4,-2], -6) = [-4,-2] OR [-2,-4]

f([2,2,2,4,2,-2,-2,-2,-4,-2], 0) = [2,2,2,4,2,-2,-2,-2,-4,-2] (Değişmez)

f([], 0) = [] (Değişmeyen sıfır toplamlı durum)


Örnekler (Falsy, herhangi bir tutarlı dizi dışı değer):

Dava İmkansız: f([-2,4,6,-8], 3) = falsy (E.G. -1)

Sıfır Toplam Durum: f([], non-zero number) = falsy (E.G. -1)

  • Not: gibi herhangi bir değer [-1], potansiyel bir gerçek çıktı olduğu için sahte için geçerli olamaz.

Kurallar:

  • Girdi, en son veya ilk olmak üzere dizi biçiminde veya bir argüman listesi olarak alınabilir x.
  • Çıktı, sınırlandırılmış herhangi bir tamsayı listesi olabilir. EG 1\n2\n3\nveya [1,2,3].
  • Herhangi bir değer, bir tamsayı dizisi dışında, sahte bir gösterge olarak kullanılabilir.
  • Kodunuz, son dizinin boyutunu maksimize etmelidir, sipariş önemli değildir.
    • EG için f([3,2,3],5)hem [2,3]ve [3,2]de geçerlidir.
    • EG Çünkü f([1,1,2],2)sadece kısa [1,1]olduğu gibi geri dönebilirsiniz [2].
  • Hem toplamı ahem de değeri, xondan küçük 2^32-1ve büyük olacaktır -2^32-1.
  • Bu , en düşük bayt sayma kazançtır.
  • Geçerlidir Aynı boyutta birden Altdizilim varsa, bunun değil hepsi çıkışına kabul edilebilir. Tek bir tane seçmeli ve onu çıkarmalısınız.

Bu durum kaydedildiyse, bulamadığımı bana bildirin.

Böyle bulduğum yazılar : İlgili ama kapalı , ...


1
Sanırım "Falsy, herhangi bir tutarlı olmayan dizi değeri" hata yaratmayı içerir?
Jonathan Allan

" Herhangi bir değer, bir tamsayı dizisi dışındaki sahte bir gösterge olarak kullanılabilir. " Boş bir dizi içeriyor mu?
Shaggy

@ shaggy [] potansiyel bir hakikat değerinin göstergesi, değil mi? Bu meta kuralı kabul etmek, farklı hakikat ve sahte olmaktan daha mı önemli?
Magic Octopus Urn

@ JohnathanAllan eğer bu hata bir Truthy senaryosunda çözülemezse - sanırım. Ama bunun kasıtlı olarak spesiyali genişletmeye çalıştığını hissediyorum. İfadeyi göstergeden dönüş değerine değiştirirsem sorun olmaz mı?
Magic Octopus Urn

Tutarlı çıkış değerleri meta başına olsa bir dönüş değeri olarak sayılır inanıyoruz?
Magic Octopus Urn

Yanıtlar:


7

Brachylog , 8 bayt

h⊇.+~t?∧

Çevrimiçi deneyin!

Aylık Brachylog cevabı. false.Mümkün değilse döndürür .

açıklama

h⊇.           The output is a subset of the head of the input
  .+~t?       The sum of the elements of the output must equal the tail of the input
       ∧      (Avoid implicit unification between the output and the input)

6

Python 2 , 108 104 bayt

lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]
from itertools import*

Çevrimiçi deneyin!

-4 byte, Jonathan Allan sayesinde


Python 2 , 108 106 bayt

def f(a,n):
 q=[a]
 while q:
  x=q.pop(0);q+=[x[:i]+x[i+1:]for i in range(len(x))]
  if sum(x)==n:return x

Çevrimiçi deneyin!

-2 byte, Janathan Frech sayesinde


1
2 kazanmak range(-len(a),1)ve kullanmak -l, ancak 4 lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]kazandırır.
Jonathan Allan


1

@JonathanFrech Teşekkürler, dün yorgun
olmalıydım



4

Pyth , 8 bayt

  • 8 bayt ( Deneyin! ) - Yalnızca bir olası çözüm çıktılar. Çözülemeyen girişler için, Pyth'de teknik olarak yanlış konuşan, ancak STDERR'ye yazan boş bir dize olan STDOUT'a hiçbir şey yazmaz. Bunu önerdiği için FryAmTheEggman'a teşekkür ederiz ( STDERR'yi yok sayarak ve yalnızca STDOUT çıkışına odaklanarak), böylece 1 bayt tasarruf sağlar.

    efqz`sTy    
    
  • 9-byter ( Deneyin! ) - Varsayılan olarak izin verilen şekilde tekil bir listeye sarılmış, yalnızca bir olası çözüm çıktılar (örn. ([1...10], 10) -> [[1,2,3,4]]; ([], 0) -> [[]]). Çözülemeyen girişler []için Pyth'ta falsey olan döndürür .

    >1fqz`sTy
    
  • 10 bayt ( Deneyin! ) - Net bir çıktı için, singleton-list kuralını kullanmadan ve sahte bir değer olarak kullanmak 0yerine [].

    e+0fqz`sTy
    

açıklama

İlk olarak, kod giriş listesinin yetki setini hesaplar (tüm olası sipariş edilmiş alt koleksiyonları). Ardından, yalnızca toplamı giriş numarasına eşit olan koleksiyonları tutar. Koleksiyonların en kısa zamandan en uzun zamana kadar oluşturulduğu not edilmelidir, bu yüzden sonuncusuna odaklanıyoruz. Bunu elde etmek için:

  • 8-Byter basitçe kullanan ucunu bir hata atar yerleşik, fakat STDERR sitemizin kurallara göre, STDOUT çıktı falsy olan boş bir dize, varlık göz ardı edilebilir.
  • 9-Byter son öğe alır, ama eşdeğer Python kodunu kullanarak lst[-1:]yerine lst[-1]çözümsüz girişler için atılan olmaktan önlemek hataları.
  • 10-Byter bir başa ekler 0 filtrelenmiş alt koleksiyonların listesine, o koleksiyonu (son öğe) sonunu sürer. Girişler çözülemezse, doğal olarak 0 kullanılır.

[]sahte mi? Temiz. Pyth bunu neden yapıyor []?
Magic Octopus Urn

@MagicOctopusUrn Pyth, Python'dan gerçekten şu şeyleri devralır : Çevrimiçi deneyin .
Bay Xcoder,

@FryAmTheEggman, boş bir liste, test durumunda kayıtsız bir çıktı olmaz mıydı f([], 0) = []?
Sok

@FryAmTheEggman Öneriniz için teşekkürler! Gerekli değişiklikleri yaptım :)
Bay Xcoder


3

Perl 6 , 38 37 bayt

{*.combinations.grep(*.sum==$_).tail}

Çevrimiçi deneyin!

Kıvrımlı fonksiyon


Bekle, ;hatta gerekli mi?
Jo King,

@JoKing Daha önce yinelenen bir "hatalı biçimlendirilmiş çift kapatma" hatasını önlemek için gerekliydi. Ancak bazı nedenlerden dolayı şimdi ihmal edilebilir. (Ben bırakması sonrasında sanırım $^xile $_.)
nwellnhof

3

Brachylog , 4 bayt

⟨⊇+⟩

Çevrimiçi deneyin!

Sadece Fatalize en eşdeğer hakkında h⊇.+~t?∧bir haricinde çok daha kısa, sayesinde yüklem kompozisyon göre özelliğinin referans düzenleme geçmişi devam eden bir çalışmadır iki aydan fazla tarafından cevap postdating Ocak 8 kadar oldu. bu durumda, sandviçlerin herhangi bir şekilde kendi çizgileri üzerinde olması nedeniyle, bu durumda parantezlerin olmadığı genişleyen ⟨⊇+⟩bir sandviçtir{[I,J]∧I⊇.+J∧} .

                The input
[I,J]           is a list of two elements I and J.
        .       The output,
         +J     which sums to J
           ∧    (which we don't unify with the output),
      I⊇        is a sublist of I
     ∧          (which we don't unify with [I,J]).

Aynı değişkenleri aynı değişkenlerle kullanan, ancak farklı şekilde organize edilmekten daha kısa bir süre sonra ortaya çıkan Fatalize'in yanıtının çok daha az dramatik bir dönüşümü:

Brachylog , 7 bayt

h⊇.&t~+

Çevrimiçi deneyin!

           The input
h          's first element
 ⊇         is a superlist of
  .        the output,
   &       and the input
    t      's last item
     ~+    is the sum of the elements of
           the output.

(Ayrıca, herhangi biri garip bir şey görmek isterse, test durumlarındaki alt çizgilerin herhangi birini tireye dönüştürün.)


1
Sandviçler edildi Kasım 2018 yılında @ ais523 tarafından uygulanan ancak Ocak ayı başlarında 2019 yılında Brachylog içinde çekilen
Fatalize

1
Tabii ki, bu tarihi kazma meselelerinin hiçbiri, çünkü meydan okumayı takip eden dillere yıllarca izin verilmiştir.
pppery


2

Temiz , 89 bayt

import StdEnv,Data.List,Data.Func
$n=find((==)n o sum)o sortBy(on(>)length)o subsequences

Çevrimiçi deneyin!

Başka bir uygun öğe birleşimi yoksa $ :: Int -> [Int] -> (Maybe [Int])dönen işlevi tanımlar .Nothing(Just [elements...])


2

JavaScript (ES6), 108 bayt

Girişi olarak alır (array)(n). Bir dizi ya da döndürür false.

a=>n=>a.reduce((a,x)=>[...a,...a.map(y=>1/r[(y=[...y]).push(x)]||eval(y.join`+`)-n?y:r=y)],[[]],r=!n&&[])&&r

Çevrimiçi deneyin!


2

Bu küçük ve havalı bir şekilde başladı, ama uç vakalar beni yakaladı. Ne olursa olsun, buna koyduğum işten gurur duyuyorum.

Python 3 , 169 161 154 bayt

from itertools import*
def f(a,x):
	if sum(a)==x:return a
	try:return[c for i in range(len(a))for c in combinations(a,i)if sum(c)==x][-1]
	except:return 0

Çevrimiçi deneyin!


Bunun [kod-golf] olduğunu unutmayın, bu nedenle bayt sayınızı olabildiğince küçük tutmaya çalışmalısınız! Önde gelen bir yeni telefon hattınız ve diğer önemsiz beyaz boşluk golfleriniz var ve pitonun bunu daha da golf oynayabileceğini bilen bir başkasına bahse girerim.
Giuseppe,

@Giuseppe Önde gelen boşlukları hatırlattığın için teşekkür ederim. Bunun bazı kısımlarını birleştirmeye çalışmak için biraz zaman harcadım, ancak bu arada başkalarının düzenlemelerini önerebilecekleri durumda göndermeye karar verdim.
Gigaflop

Problem değil! Herhangi bir Python yaptığımdan beri 5 yıl geçti, fakat range(x)üretmedi (0...x-1)mi? Demek range(len(a))dizini değişmeden bırakma imkanı vermiyorsun?
Giuseppe

@Giuseppe Eureka, bu yaptı. Çalıştığım yeni malzemeye çok fazla odaklanmış olabilirim.
Gigaflop

Yerine if a==[] and x==0kullanımı if sum(a)==x. Sonra da kaldırabilirsiniz +1dan range.
Vedant Kandoi


1

Ataşesi , 28 bayt

${(y&`=@Sum\Radiations@x)@0}

Çevrimiçi deneyin!

Alternatifler

34 bayt :f[x,y]:=({y=Sum@_}\Radiations@x)@0

30 bayt :First@${y&`=@Sum\Radiations@x}

29 bayt :{(_&`=@Sum\_2)@0}#/Radiations

29 bayt :${({y=Sum@_}\Radiations@x)@0}

29 bayt :`@&0@${y&`=@Sum\Radiations@x}

29 bayt :{_}@@${y&`=@Sum\Radiations@x}

açıklama

${(y&`=@Sum\Radiations@x)@0}
${                         }    function receiving two arguments, x and y
            Radiations@x        calculate the radiations of x
                                (simulates removing all possible subslices of x)
           \                    keep those radiations
        Sum                     ...whose sum...
     `=@                        ...equals...
   y&                           ...y
  (                     )@0     select the first one (always the longest)

0

APL (NARS), 65 karakter, 130 bayt

{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

↓ kullanılır, çünkü set setinin ilk elemanı bir boşluk setinde olur (burada ⍬ Zilde).

Bulamazsanız veya hata verirse ⍬ veya basılı metinle döner:

  o←⎕fmt
  o ⍬
┌0─┐
│ 0│
└~─┘

Ölçek:

  z←{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

  o 1 z ,1
┌1─┐
│ 1│
└~─┘
  o 2 z ,1
┌0─┐
│ 0│
└~─┘
  o 10 z 1 2 3 4 5 6 7 8 9 10
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 2,2,2,2,2,2,2,2,2
┌5─────────┐
│ 2 2 2 2 2│
└~─────────┘
  o ¯8 z 2,2,2,2,¯2,¯2,¯2,¯4,¯2
┌7──────────────────┐
│ 2 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~──────────────────┘
  o ¯6 z ¯2,¯4,¯2
┌2─────┐
│ ¯4 ¯2│
└~─────┘
  o 0 z 2,2,2,4,2,¯2,¯2,¯2,¯4,¯2
┌10───────────────────────┐
│ 2 2 2 4 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~────────────────────────┘
  o 10 z 1 2 3 4
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 1 2 3
┌0─┐
│ 0│
└~─┘
  o 0 z ⍬
┌0─┐
│ 0│
└~─┘
  o +/⍬  
0
~
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.