100'e kadar olan kombinasyonları çizin


13

Her köşede tek basamaklı bir kutunuz var:

1|2
---
3|4

Rakamları soldan sağa doğru sıralar halinde birleştirirsek 12 ve 34 alırız. Rakamları yukarıdan aşağıya sütunlar boyunca birleştirirsek, 13 ve 24'ü alırsak. Bu sayıların hepsini eklersek 12 + 34 + 13 + 24 = 83.

Meydan okuma

Yukarıdaki gibi hesaplanan toplamın 100'e eşit olduğu tüm kutuları yazdırmak için bir program yazın.

Her köşenin 1 ile 9 arasında tek haneli bir sayı içerdiği varsayılarak, 9 kombinasyon vardır: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318 ve 3119. (0 eklersek 25 kombinasyon olduğunu unutmayın, ancak bu meydan okuma için değiliz.)

Örnek 1234'ün, 12 + 34 + 13 + 24'ün 100'e eşit olmadığı için çalışmadığını unutmayın.

Giriş

Yok

Çıktı

Aşağıdaki formattaki cevap kutuları:

A|B
---
C|D

Çıktı STDOUT veya en yakın alternatife yazdırılmalıdır.

kurallar

  • AB + CD + AC + BD = 100
  • Her köşe yalnızca 1-9 arasındaki pozitif tam sayıları içerecektir.
  • 0 hariç tutulur.
  • Sayılar bir defadan fazla kullanılabilir.
  • Yukarıdaki gibi kutuları çizmeniz gerekir. ( A|B\n---\nC|D\n)
  • Geçerli tüm cevapları vermeniz gerekir.
  • Ek bir satırsonu iyi.
  • , bayt çok kısa kod kazanır.
  • Standart boşluklar ve T & C'ler geçerlidir.

Bu benim ilk sunumum, bu yüzden bir şeyi netleştirmem gerekirse lütfen bana bildirin.


Çıktının ne olması gerektiğini gösterebilir misiniz? Ayrıca, sondaki yeni satır karakteri ne olacak?
Spikatrix

Güzel bir meydan okuma. Hangi sayıların eklenmesi gerektiğini açıkça söylemeniz gerektiğini düşünüyorum. "PLUS boyunca iki, birleştirilmiş, iki basamaklı sayı iki, iki basamaklı sayı aşağı 100'e eşit olmalıdır." yeterince açık değil. Sadece 1234 örneğini kullanarak anladım. Ayrıca, sadece bu tür kombinasyonları alıyorum. Lütfen 16 kombinasyondan bahseder misiniz?
Doktor

1
Açıklama ve biçimlendirmede birkaç düzenleme yaptım. Orijinal amacınızla eşleşmiyorsa, lütfen düzenlemeyi geri alın.
Alex

1
@DenhamCoote aslında, yarı sabit kodlanmış çözümüm oldukça ilginçti, çünkü sadece yarı sabit kodlanmış. Bu kuralın bir istisnasıdır, çünkü açık kodlamanın en iyi / en belirgin seçenek olduğu sorular genellikle ilginç cevaplar üretmez (örneğin son borrom halkaları sorusuna bakın.) Soru için teşekkür ederim.
Level River St

1
Bir yanıtı kabul etmek sorunun bittiği izlenimini verebilir, bu yüzden bir süre daha bırakacağım. Daha sonra daha fazla cevap alırsanız, kabulü değiştirebilirsiniz, ancak bu, yapmak için zamanınız olmayabilecek bir gözetleme tutmanız gerektiği anlamına gelir. Popülerlik yarışmaları genellikle tembel bir şekilde yazıldığından ve genellikle "X'i mümkün olan en karmaşık şekilde yap" türünde aşırı geniş bir şekilde yazıldığından beğenilmez. Genel olarak tek iyi popülerlik sorusu, algoritmanın iyi olup olmadığına karar vermenin tek yolunun insan değerlendirmesinin olduğu görüntü işlemedir. Görüntü işleme, konu dışı saf sanatı kapsamaz.
Level River St

Yanıtlar:


8

Pyth, 42 38 34 bayt

V ^ ST4IqC \ ds * VNsM ^, T1 2Xj \ | N3 "
---

Koddaki son satırsonu önemlidir. Ben vektör nokta ürünü kullanmak çünkü rekabetçi olduğum ana nedeni olduğunu [1, 1, 5, 7]ve [20, 11, 11, 2]ve 100 ile karşılaştırın.


"|"-> \|, \n-> (gerçek satır besleme) ve son teklife ihtiyacınız yok.
Dennis

@Dennis uyuyordu>. <
orlp

2
Eğer sakıncası yoksa, inanılmaz kısa cevabınızı deşifre edemeyenler (benim gibi) için bir açıklama ekler misiniz?
Denham Coote

6

Ruby, 71

Sabit kodlamaya izin verilmediğinden (ve her durumda bir çizgi çizmek zor olduğundan) kısmi bir sabit kodlu cevap.

1.upto(3){|i|1.upto(7-i*2){|j|print i,?|,j,'
---
',8-j-2*i,?|,i+6,'
'}}

açıklama

Bir çözümün formülü aşağıdaki gibidir:

A*20+(B+C)*11+D*2=100

Modüler aritmetik argümanlarla, A ve D'nin sabit bir miktarda farklı olması gerektiğini görüyoruz, öyle ki (A*20+D*2)%11sabit. Aslında D = A + 6. iA. üç olası değerleri döngü dolaşır

B'nin değeri 1'den 1'e kadar herhangi bir şey olabilir 7-i*2ve B ve C'nin toplamı olmalıdır 14-A-D. Böylece basılan aşağıdaki ifadeleri elde ederiz. Ruby, içine alınmış dizelerde gerçek satırsonlarına izin verir''

   i     |    j
------------------
8-j-2*i  |   i+6

4

Java, 202 200 198

İlk denemede: D

EDIT: başka bir yorumda bulunan biraz daha küçük hesaplama ile 2 bayt kaydedildi.

class C{public static void main(String[]c){for(int i=0;++i<5;)for(int j=0;++j<7;)for(int k=0;++k<10;)for(int l=0;++l<10;)if(20*i+11*(j+k)+2*l==100)System.out.printf("%s|%s%n---%n%s|%s%n",i,j,k,l);}}

4

Toplu - 187 bayt

Kaba kuvvet.

@!! 2>nul||cmd/q/v/c%0&&exit/b
set y=for /l &set z= in (1,1,9)do 
%y%%%a%z%%y%%%b%z%%y%%%c%z%%y%%%d%z%set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d&if !a!==100 echo %%a^|%%b&echo ---&echo %%c^|%%d

Golf oynaması biraz daha az iğrenç:

@echo off
setLocal enableDelayedExpansion
for /l %%a in (1,1,9) do (
    for /l %%b in (1,1,9) do (
        for /l %%c in (1,1,9) do (
            for /l %%d in (1,1,9) do (
                set/aa=%%a%%b+%%c%%d+%%a%%c+%%b%%d
                if !a!==100 (
                    echo %%a^|%%b
                    echo ---
                    echo %%c^|%%d
                )
            )
        )
    )
)

3

CJam, 40 bayt

A4m*{[KBBY].*:+56=},{:)2/'|f*"
---
"*N}/

Kombinasyonları bulma yaklaşımı @ Optimizer'dan farklıdır, ancak bunları yazdırma kodu aynıdır.

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

A4m*     e# Push all vectors of length 4 with coordinates in [0 ... 9].
         e# We'd normally use [0 ... 8] here, but "9 4m*" is 1 byte longer and
         e# "A4m*" doesn't produce any false positives.

{        e# Filter the vectors:
[KBBY].* e#   Multiply the elements of the vector by 20, 11, 11 and 2.
:+       e#   Add all four products.
56=      e#   Check if the sum is 56. 56 is used instead of 100 since all elements
         e#   of the vector will be incremented and 56 + 20 + 11 + 11 + 2 == 100.
},       e# Keep only vectors for which = pushed a truthy value.

{        e# For each vector:
:)       e#   Increment each coordinate.
2/       e#   Split into pair.
'|f*     e#   Join each pair, delimiting by '|'.
"
---
"*       e#   Join the two pairs, delimiting by "\n---\n".
N        e#   Push "\n".
}/       e#

Bazı Java dışında çok az şey bildiğim için, eğer istersen bunun nasıl çalıştığına dair bir açıklama isterim ..?
Denham Coote

Güzel bir numara.
Doktor

Vay. Öğrenecek çok şeyim var. Açıklama için teşekkürler :)
Denham Coote

3

Haskell, 107 131 bayt

s=show
r=[1..9]
v=putStr$unlines[s a++"|"++s b++"\n---\n"++s c++"|"++s d++"\n"|a<-r,b<-r,c<-r,d<-r,(2*a+b+c)*10+b+2*d+c==100]

İlk Haskell programımın ikinci versiyonu!

Bu kez gereksinimlere göre ekran ile, utanmazca çalıntı nimi's adapte (bazı araştırma yaptım ama haskell karakterleri görüntülemek için etkili yollar olmayabilir böylece putStr $ unlines kaçınmak zor olabilir gibi görünüyor).

Ve ... sonunda formülün çarpanlarına ayrılmasının dışında, hala okunabilir =)


3

Haskell'in 125 121 bayt

s=show
f=putStr$unlines[s a++'|':s b++"\n---\n"++s c++'|':s d|[a,b,c,d]<-mapM id$"abcd">>[[1..9]],20*a+11*(b+c)+2*d==100]

Kullanımı:

*Main> f
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9

>>in "abcd">>[[1..9]], ikinci öğenin 4 (1. parametrenin uzunluğu) kopyasını içeren bir liste yapar, yani [[1..9],[1..9],[1..9],[1..9]]. mapM idbunların bütün kombinasyonları, örneğin, bir listesini yapar [0,0,0,0]için [9,9,9,9]. Özetleyenleri saklayın 100ve kutusuyla bir dize oluşturun. Tüm kutuları yazdırın.

@Mauris 1 bayt için teşekkürler ve bana 3 daha bulmak için yazıma gözden beni.


mapM idbayt vs kaydeder sequence.
Lynn

2

Python 2, 145129 Bayt

Şu anda, özetlenenlerden daha kısa olması gereken birkaç farklı hesaplama yöntemiyle oynuyorum, ancak şimdi sahip olduğum şeyi göndereceğim.

i=int
for k in range(1000,9999):
 a,b,c,d=`k`
 if i(a+b)+i(c+d)+i(a+c)+i(b+d)==100and not'0'in`k`:print a+'|'+b+'\n---\n'+c+'|'+d

2

CJam, 43 42 bayt

A,1>4m*{2/_z+Afb:+100=},{2/'|f*"
---
"*N}/

Takip edilecek açıklama .. bugün EOD

Buradan çevrimiçi deneyin


Benim golf java sürümü (hangi kutuları ile rahatsız etmiyor, sadece dizileri listeler) 197 karakter oldu. Bu uzunluğun dörtte birinde yapar! Cool :)
Denham Coote

@DenhamCoote Bu her CJam, Pyth ve GolfScript yanıtıdır.
faz

Hala bu açıklamayı dört gözle bekliyoruz ;-)
Denham Coote

1

Python 3, 159

Hızlı ve kirli.

N='123456789'
D='%s|%s\n'
O=D+'---\n'+D
I=int
[print(O%(a,b,c,d)if I(a+b)+I(c+d)+I(a+c)+I(b+d)==100 else'',end='')for a in N for b in N for c in N for d in N]

1

R, 165 bayt

e=expand.grid(d<-1:9,d,d,d)
a=apply
o=a(e[a(e,1,function(x)20*x[1]+11*(x[2]+x[3])+2*x[4]==100),],1,function(x)cat(x[1],"|",x[2],"\n---\n",x[3],"|",x[4],"\n",sep=""))

Çıktıyı bir şekilde sabit kodlamayı seçmiş olsaydım bu çok daha kısa olurdu. Diğer birkaç çözüm gibi, bu da 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100 kimliğinden yararlanır .

Ungolfed + açıklaması:

# Create a matrix where each row is a combination of the digits 1-9
e <- expand.grid(1:9, 1:9, 1:9, 1:9)

# Filter the rows of the matrix using the aforementioned identity
e <- e[apply(e, 1, function(x) 20*x[1] + 11*(x[2]+x[3]) + 2*x[4] == 100), ]

# Print each row formatted into boxes
o <- apply(e, 1, function(x) cat(x[1], "|", x[2], "\n---\n", x[3], "|", x[4], sep = ""))

Son ifadenin neden bir ödev olduğunu merak ediyor olabilirsiniz. Sonuç olarak cat, bir araya gelen ve yazdırılan işlev bir değer döndürür NULL. catGibi bir işlev içinden aradığınızda apply, çıkış takip edilir NULL, bu istenmeyen bir durumdur. Bunun iki yolu vardır: bir değişkene atayın veya içine alın invisible. Burada önemli ölçüde daha kısa olduğu için ilkini seçtim.

Şunları yapabilirsiniz çevrimiçi denemek .


1

Java, 450

İlk (ungolfed) girişimim şöyle görünüyordu:

B sınıfı {
  public static void main (Dize [] a) {
    için (int i = 1; i <10; i ++)
      için (int j = 1; j <10; j ++)
        için (int k = 1; k <10; k ++)
          için (int l = 1; l <10; l ++)
            Eğer (Integer.parseInt (i + "" + j) + Integer.parseInt (k + "" + l) +: Integer.parseInt (i + "" + K) + Integer.parseInt (j + "" + l) == 100) {
              System.out.println (i + "|" + j);
              System.out.println ( "---");
              System.out.println (k + "|" + l + "\ n");
            }
  }
}


3
İpucu: 20*a + 11*(b + c) + 2*d == 100.
orlp

Evet, bu çözüm tamamen ip birleştirme idi - çok mütevazi bir ilk girişim.
Denham Coote

1
Ben 450 değil sadece 436 bayt sayıyorum . Ayrıca, boşluk önemli değildir, bu da size önemli miktarda tasarruf sağlar.
Alex

Ayrıca, gereksiz boşluk kaldırıldığında, bu 340 bayt daha yakın olmalıdır :)
Kade

1

PowerShell, 98

uyarlanmış steveverrill'in formülü

:\>cat printbox.ps1

1..9|%{for($j=1;$j-lt10;$j++){if(($k=(8-$j-2*$_))-gt0){"{0}|{1}`n---`n{2}|{3}"-f$_,$j,$k,
($_+6)}}}

:\>powershell -f printbox.ps1
1|1
---
5|7
1|2
---
4|7
1|3
---
3|7
1|4
---
2|7
1|5
---
1|7
2|1
---
3|8
2|2
---
2|8
2|3
---
1|8
3|1
---
1|9
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.