Kakuro Kombinasyonları


12

Kakuro Kombinasyonları

Zihinsel aritmetik yapamadığım için, genellikle , kurbanın 1 ila 9 (dahil) aralığındaki hangi farklı sayıların 1 ila 45 aralığındaki başka bir sayıya karşılık geldiğini tekrar tekrar çalışmasını gerektiren Kakuro Puzzle ile mücadele ediyorum. birçok sayı var. Örneğin, 3 sayıdan 23'ü nasıl alacağınızı bilmek isteyebilirsiniz, tek cevap 6 + 8 + 9'dur. (Bu, eğer aşina iseniz Killer Sudoku ile aynı fikirdir).

Bazen 1 numarasının bulunamaması gibi başka bilgilere sahip olursunuz , bu nedenle sadece 2 sayıda 8 elde etmek için sadece 2 + 6 ve 3 + 5 kullanabilirsiniz (4 + 4 kullanamazsınız, çünkü bunlar farklı değil). Alternatif olarak, çözümde zaten bir 3 bulmuş olabilirsiniz ve bu nedenle 3 sayıdan 19 gibi bir şey 3 + 7 + 9 olmalıdır.

Göreviniz, belirli bir soruna olası tüm çözümleri katı bir sırayla, katı bir düzende listeleyen bir program yazmaktır.

Giriş

Çözümünüz, girişleri stdin, bir komut satırı argümanı, bir işlev argümanı, yığın üzerinde kalan bir değer veya en sevdiğiniz ezoterik dilinizin çılgınlığı ne olursa olsun tek bir ASCII dizesi olarak alabilir . Dize biçimindedir

number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers

İlk 2 argüman, sırasıyla 1 ila 45 ve 1 ila 9 aralığındaki tipik baz-10 negatif olmayan sıfır olmayan tamsayılardır (ondalık nokta kullanmak geçersiz giriş olur), iki liste yalnızca tekrarlama olmadan belirli bir sipariş yok veya boş listeler ise '0'. Listeler arasında paylaşılan rakamlar olamaz (0 hariç). Sınırlayıcılar tek boşluklardır.

Çıktı

Çıktınız, olası çözümlerin sayısını içeren bir satırla başlamalıdır. Programınız, her bir basamak 1'den 9'a kadar sayıları listelediğinizde olacağı konuma yerleştirildiği, her geçen basamak için ayrılmış satır sonu sınırlandırılmış çözümleri yazdırmalıdır. Aşağıdaki örnekler umarım bunu daha açık hale getirecektir.

Geçersiz bir giriş sağlanırsa, önyükleme sektörümü sıfırlamamış olsam da programınızın ne yaptığı umurumda değil.

Örnekler

Bu örnek girdi için

19 3 0 0

Beklenen çıktı

5
 2     89
  3   7 9
   4 6  9
   4  78 
    56 8 

Her "eksik" sayının yerine boşluklar not edilmelidir, bunlar gereklidir; Onlardan sonra bir sayı olmayan boşluklar hakkında rahatsız değilim (yukarıdaki eksik 9'lar gibi). Yazdırdığınız her şeyin mono boşluk yazı tipi kullanacağını varsayabilirsiniz. Ayrıca, en küçük en küçük rakama sahip çözümlerin ve daha sonra en küçük bir sonraki en küçük rakama sahip olanların, vb.

Yukarıdakilere dayanan başka bir örnek

19 3 57 9

Beklenen çıktı

2
 2     89
   4 6  9

Her sonucun 9 ve hiçbir sonucun 5 veya 7 içermediğini unutmayın.

Çözüm yoksa, örneğin

20 2 0 0

O zaman üzerinde 0 olan tek bir satır çıkarmalısınız.

0

Bu sorunun eğlencesinin giriş kısmının ayrıştırılmasını kasten yaptım. Bu kod golf, en kısa çözüm kazanabilir.


2
+1 esp. "... önyükleme sektörümü sıfırlamamayı tercih ederim."
Michael Easter

Yanıtlar:


5

GolfScript, 88 karakter

~[[]]10,:T{{1$+}+%}/\{\0+`-!}+,\{0`+\`&!}+,\{\,=}+,\{\{+}*=}+,.,n@{1T>''*T@-{`/' '*}/n}/

GolfScript'te basit bir uygulama. STDIN veya yığıntan girdi alır.

Kod burada test edilebilir .

Bazı yorumları içeren kod:

### evaluate the input string
~                     

### build all possible combinations of 0...9
[[]]              # start with set of empty combination
10,:T             #
{                 # for 0..9
  {1$+}+%         #   copy each item of set and append current digit to this copy
}/                # end for

### only keep combination which the digits given as last argument (minus 0)
\{                # start of filter block
  \0+`            #   add zero to combination and make string out of it
  -!              #   subtract from last argument -> check argument contains any
                  #     excess characters
}+,               # end of filter block


### remove any combination which contains either 0 or any digit from 2nd last argument
\{                # start of filter block
  0`+             #   take argument and append 0
  \`              #   stringify combination
  &!              #   check if no characters are common
}+,               # end of filter block

### filter for correct length
\{                # start of filter block
  \,              #   calc length of combination
  =               #   check if equal to second argument
}+,               # end of filter block

### filter for correct sum
\{                # start of filter block
  \{+}*           #   sum all digits of combination
  =               #   compare with first argument
}+,               # end of filter block

### output
.,                # determine size of set
n                 # append newline
@{                # for each combination in set
  1T>''*          #   generate "123456789"
  T@-             #   generate anti-set of current combination  
  {`/' '*}/       #   replace (in the string) each digit within the 
                  #   anti-combination with a space characters
  n               #   append newline
}/                # end for

5

JavaScript (E6) 172180275296

1 dize bağımsız değişkeni olan ve istenen çıktıyı döndüren bir (test edilebilir) işlevi olarak. Gerçek bir çıktı değişikliği uyarı (), aynı bayt sayısı ile dönmek, ancak dikkat, uyarı yazı tipi tek boşluk değildir.

F=i=>{
  [t,d,f,m]=i.split(' ');
  for(l=0,r='',k=512;--k;!z&!h&!o&&(++l,r+=n))
    for(z=n='\n',h=d,o=t,b=i=1;i<=9;b+=b)
      z-=~(b&k?(--h,o-=i,n+=i,f):(n+=' ',m)).search(i++);
  return l+r
}

FireFox veya FireBug konsolunda test et

console.log(['19 3 0 0','19 3 57 9','19 3 57 4','20 2 0 0'].map(x=>'\n'+x+'\n' +F(x)).join('\n'))

Test çıktısı:

19 3 0 0
5
 2     89
  3   7 9
   4 6  9
   4  78 
    56 8 

19 3 57 9
2
 2     89
   4 6  9

19 3 57 4
1
   4 6  9

20 2 0 0
0

Ungolfed

F=i=>{
  [target, digits, forbidden, mandatory]=i.split(' ')

  result = '', nsol=0
  for (mask = 0b1000000000; --mask > 0;)
  {
    cdigits = digits
    ctarget = target
    bit = 1
    numbers = ''
    for (digit = 9; digit > 0; bit += bit, digit--)
    {

      if (bit & mask)
      {
        if (forbidden.search(digit)>=0) break;
        cdigits--;
        ctarget -= digit;
        numbers = digit + numbers;
      }
      else
      {
        if (mandatory.search(digit)>=0) break;
        numbers = ' '+numbers;
      }
    }
    if (ctarget==0 && cdigits == 0)
    {
        result += '\n'+numbers
        nsol++
    }
  }
  return nsol + result
}

4

Mathematica, 239 bayt

(Hala sandbox'tayken bunun üzerinde çalışmaya başladığımı itiraf ediyorum.)

{t,n,a,b}=FromDigits/@StringSplit@i;Riffle[c=Cases[Union/@IntegerPartitions[t,n,Complement[r=Range@9,(d=IntegerDigits)@a]],k_/;(l=Length)@k==n&&(b==0||l[k⋂d@b]>0)];{(s=ToString)@l@c}~Join~((m=#;If[m~MemberQ~#,s@#," "]&/@r)&/@c),"\n"]<>""

Ungolfed

{t, n, a, b} = FromDigits /@ StringSplit@i;
Riffle[
  c = Cases[
    Union /@ IntegerPartitions[
      t, n, Complement[r = Range@9, (d = IntegerDigits)@a
       ]
      ],
    k_ /; (l = Length)@k == 
       n && (b == 0 || l[k ⋂ d@b] > 0)
    ];
  {(s = ToString)@l@c}~
   Join~((m = #; If[m~MemberQ~#, s@#, " "] & /@ r) & /@ c),
  "\n"] <> ""

Girdi dizesinin saklanmasını bekler i.

Oldukça açık. İlk olarak, girdi ayrıştırma. Sonra IntegerPartitionsilk sayıyı izin verilen sayılara nasıl bölebileceğimi bulmak için kullanıyorum. Sonra yinelenenleri kullanan veya gerekli sayıları içermeyen tüm bölümleri filtreliyorum. Ve sonra her çözüm için ben bir liste oluşturmak 1için 9ve boşluk içine kendi dize gösterimine içine mevcut numaraları ve diğerlerini dönüştürün. Ve sonra her şeyi birleştiriyorum.


1

Harika - 494 karakter

Büyük, yalın olmayan bir cevap, ancak "güç seti" oluşturmak için Google Guava kullanıyor.

golfed:

@Grab(group='com.google.guava', module='guava', version='17.0')
m=(args.join(" ")=~/(\d+) (\d+) (\d+) (\d+)/)[0]
i={it as int}
n=i(m[1])
r=i(m[2])
j=[]
m[3].each{if(i(it))j<<i(it)}
q=[]
m[4].each{if(i(it))q<<i(it)}
d=1..9 as Set<Integer>
t=[]
com.google.common.collect.Sets.powerSet(d).each{x->
if(x.sum()==n&&x.size()==r&&x.disjoint(j)&&x.containsAll(q)) {
s="";for(i in 0..8){if(x.contains(i+1)){s+=(i+1) as String}else{s+=" "}};t<<s}
}
p={println it}
p t.size()
t.sort().reverse().each{p it}

Örnek çalışmalar:

$ groovy K.groovy 19 3 0 0 
5
 2     89
  3   7 9
   4 6  9
   4  78 
    56 8 
$ groovy K.groovy 19 3 5 0 
4
 2     89
  3   7 9
   4 6  9
   4  78 
$ groovy K.groovy 19 3 5 9
3
 2     89
  3   7 9
   4 6  9
$ groovy K.groovy 20 2 0 0 
0

Ungolfed:

@Grab(group='com.google.guava', module='guava', version='17.0')

m=(args.join(" ")=~/(\d+) (\d+) (\d+) (\d+)/)[0]
i={it as int}
n=i(m[1])
r=i(m[2])

j=[]
m[3].each{if(i(it))j<<i(it)}
q=[]
m[4].each{if(i(it))q<<i(it)}

d=1..9 as Set<Integer>
t=[]

com.google.common.collect.Sets.powerSet(d).each{ x ->
    if(x.sum()==n && x.size()==r && x.disjoint(j) && x.containsAll(q)) {
        s=""
        for(i in 0..8) {
            if(x.contains(i+1)){s+=(i+1) as String}else{s+=" "}
        }
        t<<s
    }
}

p={println it}
p t.size()
t.sort().reverse().each{p it}
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.