Tam olarak n olarak toplanacak minimum sayı sayısı


15

Buradaki ilk soru, bunun bir kopya mı yoksa kötü bir meydan okuma mı olduğunu söyleme.

Giriş

Bu meydan okumayı kendim düşündüm ve yeni başlayanlar için golfçüler için iyi bir temel bulmaca gibi görünüyor. Hangi kod-golf dilinin öğrenileceğine karar vermeme de yardımcı olabilir.

Meydan okuma

Daha küçük veya eşit bir tamsayı dizisi verildiğinde, diziden tam olarak ntoplanan minimum sayı sayısını verir veya döndürür n.

Bir işlev veya tam bir program yazmayı seçebilirsiniz.

Giriş

Güvenle kabul edebilirsiniz 0 <= n < 2^31.

Dizinin uzunluğunu belirten isteğe bağlı bir parametre ile birlikte herhangi bir tür veya liste ( vectorC ++ veya Java LinkedListiçin izin verilir) alın .nlength

Girdiyi, nvirgül veya boşlukla ayrılmış, boşlukla ayrılmış bir dize olarak da alabilirsiniz :

1 5 7 3 7 3 6 3 2 6 3,10

1 5 7 3 7 3 6 3 2 6 3 10

eğer daha kolaysa.

Çıktı

Çıktı veya diziden tam olarak toplanan minimum sayı sayısını döndürür n. Yukarıdaki örneği kullanarak:

1 5 7 3 7 3 6 3 2 6 3,10

Programınız yazdırmalıdır:

2

sayıların en az sayıda kadar toplamı çünkü 10olduğunu 2( 7ve 3).

Herhangi bir çözüm yoksa, boş bir dize dışında negatif, 0"Çözüm yok" (akıllıca olmaz), (önerildiği gibi) veya başka herhangi bir yanlış değeri yazdırın veya döndürün.

Örnek Giriş ve Çıkış

Giriş:

1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12

Çıktı:

2
3
-1

puanlama

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

En iyi cevap Noel'de kabul edilecektir.


Özelliklerinizi düzenledim, çünkü genellikle işlevler ve programlar için aynı G / Ç yöntemlerine izin veriyoruz; uzlaşma bakın burada . Kabul etmezseniz geri dönmekten çekinmeyin.
lirtosiast

falseÇözümü olmayan vakalar için çıktı alabilir miyiz ?
ETHproductions

@ETHproductions Tabii, bunu ekleyeceğiz.
TheCoffeeCup

Boş dize Pyth içinde falsey olduğundan boş çıktı falsey düşünüyor musunuz?
lirtosiast

@ThomasKwa Boş dize çıktılarını sevmiyorum, ancak cevabınıza "x'e izin verildiyse ..." olarak
ekleyebilirsiniz

Yanıtlar:


7

Pyth, 12 11 bayt

lhafqsTQyEY

Bu n, ilk girdi satırı ve ikinci satırdaki liste olarak alınır.

lhafqsTQyEY     (Implicit: Q = 1st line of input; E = 2nd line)
         E      The list
        yE      Powerset (sorted by increasing length; empty set first)
   f            Filter by lambda T:
     sT         sum(T)
    q                  ==
       Q                  Q
   fqSTQyE      Sublists that sum to Q, sorted by increasing length
  a       Y     append an empty array (in case none match)
lh              take the length of the first element (0 for empty array)

Burada deneyin .


1
Kodunuz ve açıklamanız uyuşmuyor.
isaacg

@isaacg Şimdi düzeltildi.
lirtosiast

5

Japt , 30 21 18 bayt

Çok daha verimli bir yöntem olduğu ortaya çıktı. ;)

Uà f_x ¥V} ml n- g

Çevrimiçi test edin! (Not: uyumluluk nedeniyle n-değiştirildi n@X-Y})

Bu, girdiyi boşluk veya virgülle ayrılmış bir dizi ve ardından bir sayı olarak alır. Çözümsüz undefinedtest senaryoları için çıktılar .

Uà f_  x ¥ V} ®   l} n- g
UàfmZ{Zx ==V} mZ{Zl} n- g

            // Implicit: U = input array, V = input integer
Uà fZ{   }  // Generate all possible combinations of U, then filter to only items Z where
Zx ==V      //   the sum of Z is equal to V.
mZ{Zl}      // Map each remaining combination to its length.
n-          // Sort by subtraction; smaller items end up in the front.
g           // Take the first item.
            // Implicit: output last expression

Bunu yazarken bu sürümü düşünmediğime inanamıyorum ...

O zamandan beri burada kullanışlı olan birkaç optimizasyon yapıldı:

  • UProgramın başlangıcında A genellikle dışarıda bırakılabilir.
  • Ãiçin bir kısayoldur .
  • n artık sayıları varsayılan olarak düzgün bir şekilde sıralamaktadır.

Bunların her biri toplam 15 bayt alır:

à f_x ¥VÃml n g

Çevrimiçi test edin!


Bu 25 bayt, 21 değil.
Albert Renshaw

1
@AlbertRenshaw Japt , bu karakterlerin her birinin 1 bayt olduğu IEC_8859-1 kodlamasını destekler . Bu programı IEC_8859-1 kodlu bir metin dosyası olarak kaydedebilir, ardından çevrimiçi yorumlayıcıya yükleyebilirsiniz .
ETHproductions

Ah, güzel! Beni bilgilendirdiğiniz için teşekkürler
Albert Renshaw

1

Mathematica, 73 65 bayt

Min[Length/@Select[IntegerPartitions[#2,#2,#],Sort@#==Union@#&]]&

Saf fonksiyon, çözüm yoksa geri döner .


1

Python 3, 128 bayt

Bu istediğim kadar golf değil, ama daha sonra çalışacağım.

from itertools import*
def s(a,n):
 for i in range(len(a)):
  for j in permutations(a,i+1):
   if sum(j)==n:return i+1
 return 0

1

Mathematica, 45 bayt

Min@Cases[Subsets@#,i_/;Tr@i==12:>Length@#2]&

1

CJam, 34 bayt

0q~_,2,m*\f.*{:+1$=},\;0f-{,}$0=,+

Çevrimiçi deneyin . Giriş biçimi, toplamı ve ardından değerler listesidir, örneğin:

18102 [143 1623 1646 16336 1624 983 122]

Herhangi bir çözüm bulunmazsa bunun bir istisna doğuracağını unutmayın. CJam komut satırından çalıştırıldığında istisna stderr'ye gider ve doğru sonuç ( 0) yine de stdout'a yazdırılır. Yani bu, bildirilerin bir hata ile çıkmasına izin verilmeli mi?

Kod beklediğinizden daha uzun görünebilir. Bunun ana nedeni, CJam'in kombinasyon oluşturmak için yerleşik olmamasıdır. Ya da en azından bu benim mazeretim ve ben buna bağlıyım.

Açıklama:

0       Push 0 result for exception case.
q~      Get and interpret input.
_,      Copy and get length of input value list.
2,      Push [0 1].
m*      Cartesian power. This generates all possible lists of 0/1 values with the
        same length as the input value list.
\       Swap input value list to top.
f.*     Apply element-wise product of input value list with all 0/1 lists.
        We now have all combinations of values, with 0 in place of unused values.
{       Start filter block.
  :+      Sum values.
  1$      Copy target sum to top.
  =       Compare.
},      Filter.
\;      Swap target sum to top and discard.
0f-     Remove 0 values. We now have all solution lists.
{,}$    Sort by length.
0=      Get first solution, which after sorting is the shortest.
        This will raise an exception if the list of solutions is empty, bailing
        out with the initial 0 on the stack.
,       Get length of solution.
+       Add the 0 we initially pushed for the exception case.

1

JavaScript (ES6), 84 bayt

f=(a,n,m=1e999,x)=>n&&a.map((v,i)=>(x=[...a],x.splice(i,1),x=f(x,n-v)+1)<m?m=x:0)&&m

açıklama

Bir Alır Arrayait Numbers ve bir Numberargüman olarak. InfinitySonuç yoksa bir sayı döndürür . nDiziden her öğeyi birer birer çıkartan ve kaldıran özyinelemeli bir işlevdir n == 0.

f=(a,n,m=1e999,x)=> // m and x are not passed, they are here to declare them in the local
                    //     scope instead of globally, initialise m to Infinity
  n&&               // if n == 0, return 0
  a.map((v,i)=>     // iterate over each number in a
    (x=[...a],      // x = copy of a
    x.splice(i,1),  // remove the added number from the array
    x=f(x,n-v)+1)   // x = result for the numbers in this array
      <m?m=x:0      // set m to minimum result
  )
  &&m               // return m

Ölçek

Bu test setleri miçin Infinitysonradan yerine varsayılan argüman olarak Chrome'un (yerine sadece Firefox'un) içinde çalışması için.


1

Haskell, 72 bayt

import Data.List
n#l=head$sort[length x|x<-subsequences l,sum x==n]++[0]

0Çözüm yoksa döndürür .

Kullanım örneği: 10 # [1,5,7,3,7,3,6,3,2,6,3]-> 2.

lToplamı olan giriş listesinin tüm alt listelerini bulun n. Her bir alt listenin uzunluğunu alın ve sıralayın. A öğesini ekleyin 0ve ilk öğeyi alın.

Bir tek liste örneğin çıkışı, tanınması durumunda [2], biz 7 bayt kaydedebilirsiniz: n#l=minimum[length x|x<-subsequences l,sum x==n]. Çözüm bulunmaması durumunda boş liste []döndürülür.

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.