Gambar kombinasi yang menambahkan hingga 100

13

Anda memiliki kotak dengan nomor satu digit di setiap sudut:

1|2
---
3|4

Jika kita menggabungkan angka di sepanjang baris kiri ke kanan, kita mendapatkan 12 dan 34. Jika kita menggabungkan angka di sepanjang kolom dari atas ke bawah, kita mendapatkan 13 dan 24. Jika kita menambahkan semua angka-angka ini, kita mendapatkan 12 + 34 + 13 + 24 = 83.

Tantangan

Tulis program untuk mencetak semua kotak seperti itu di mana jumlah yang dihitung seperti di atas sama dengan 100.

Dengan asumsi setiap sudut berisi angka digit tunggal antara 1 dan 9, ada 9 kombinasi: 1157, 1247, 1337, 1427, 1517, 2138, 2228, 2318, dan 3119. (Perhatikan bahwa ada 25 kombinasi jika kita memasukkan 0, tetapi kami bukan untuk tantangan ini.)

Perhatikan bahwa contoh 1234 tidak berfungsi karena 12 + 34 + 13 + 24 tidak sama dengan 100.

Memasukkan

Tidak ada

Keluaran

Kotak jawaban dalam format berikut:

A|B
---
C|D

Output harus dicetak ke STDOUT atau alternatif terdekat.

Aturan

  • AB + CD + AC + BD = 100
  • Setiap sudut hanya akan berisi bilangan bulat positif 1-9.
  • 0 dikecualikan.
  • Angka dapat digunakan lebih dari satu kali.
  • Anda perlu menggambar kotak, seperti di atas. ( A|B\n---\nC|D\n)
  • Anda perlu menampilkan semua jawaban yang valid.
  • Baris tambahan tambahan baru baik-baik saja.
  • , jadi kode terpendek dalam byte menang.
  • Celah dan T&C standar berlaku.

Ini adalah pengiriman pertama saya jadi tolong beri tahu saya jika saya perlu mengklarifikasi sesuatu.

Denham Coote
sumber
Bisakah Anda menunjukkan apa yang seharusnya menjadi output? Juga, bagaimana dengan karakter baris baru yang tertinggal?
Spikatrix
Tantangan yang bagus. Saya pikir Anda perlu secara eksplisit memberi tahu nomor apa yang perlu ditambahkan. Baris "Dua, digabung, dua angka di PLUS ditambah dua, dua angka di bawah harus sama dengan 100." tidak cukup jelas. Saya hanya tahu menggunakan contoh 1234. Juga, saya hanya mendapatkan 9 kombinasi seperti itu. Bisakah Anda menyebutkan 16 kombinasi?
Pengoptimal
1
Saya mengedit beberapa penjelasan dan format. Jika tidak sesuai dengan niat awal Anda, silakan putar kembali hasil edit.
Alex A.
1
@DenhamCoote sebenarnya, solusi semi-hardcoded saya cukup menarik untuk dilakukan, karena hanya semi-hardcoded. Ini merupakan pengecualian terhadap aturan tersebut, karena pertanyaan di mana hardcoding terang-terangan adalah pilihan terbaik / paling jelas sering tidak menghasilkan jawaban yang menarik (lihat pertanyaan cincin borromean baru-baru ini misalnya.) Terima kasih atas pertanyaannya.
Level River St
1
Menerima jawaban mungkin memberi kesan pertanyaan sudah selesai, jadi saya akan meninggalkannya sebentar. Jika Anda mendapatkan lebih banyak jawaban setelahnya, Anda dapat mengubah penerimaan, tetapi itu berarti Anda harus terus mengawasi, yang mungkin tidak sempat Anda lakukan. Kontes popularitas tidak disukai karena mereka sering ditulis dengan malas dan terlalu luas, sering kali bertipe "Lakukan X dengan cara yang paling rumit mungkin." Umumnya satu-satunya pertanyaan popularitas yang baik adalah dalam pemrosesan gambar, di mana evaluasi manusia adalah satu-satunya cara untuk memutuskan apakah algoritma tersebut baik atau tidak. Pemrosesan gambar tidak termasuk seni murni yang berada di luar topik.
Level River St

Jawaban:

8

Pyth, 42 38 34 byte

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

Jejak baris baru dalam kode itu penting. Alasan utama saya kompetitif karena saya menggunakan vektor produk titik [1, 1, 5, 7]dan [20, 11, 11, 2]dan membandingkannya dengan 100.

orlp
sumber
"|"-> \|, \n-> (linefeed literal) dan Anda tidak perlu kutipan terakhir.
Dennis
@Dennis Sedang tidur>. <
orlp
2
Jika Anda tidak keberatan, bisakah Anda menambahkan penjelasan untuk mereka (seperti saya) yang tidak dapat menguraikan jawaban Anda yang sangat pendek?
Denham Coote
6

Ruby, 71

Karena hardcoding tidak dianulir (dan dalam kasus apa pun sulit untuk menarik garis) inilah jawaban sebagian hardcoded.

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

Penjelasan

Rumus untuk solusi adalah sebagai berikut:

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

Dengan argumen aritmatika modular, kita melihat bahwa A dan D harus berbeda dengan jumlah konstan, sehingga (A*20+D*2)%11konstan. Faktanya D = A + 6. The iLoop iterates melalui tiga kemungkinan nilai A.

Nilai B dapat berupa apa saja dari 1 hingga 7-i*2dan total B dan C harus 14-A-D. Jadi kami memperoleh ungkapan berikut, yang dicetak. Ruby memungkinkan baris baru literal dalam string terlampir''

   i     |    j
------------------
8-j-2*i  |   i+6
Level River St
sumber
4

Jawa, 202 200 198

Mencoba untuk pertama kalinya: D

EDIT: menyimpan 2 byte dengan perhitungan sedikit lebih kecil ditemukan di komentar lain.

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);}}
Koekje
sumber
4

Batch - 187 byte

Paksaan.

@!! 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

Un-golfed itu sedikit kurang menjijikkan:

@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
                )
            )
        )
    )
)
hapus clemeat
sumber
3

CJam, 40 byte

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

Pendekatan untuk menemukan kombinasi berbeda dari @ Pengoptimal, tetapi kode untuk mencetaknya sama.

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

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#
Dennis
sumber
Karena saya tahu sedikit selain Jawa, saya ingin penjelasan tentang cara kerjanya, jika Anda mau ..?
Denham Coote
Itu trik yang bagus.
Pengoptimal
Wow. Saya harus banyak belajar. Terima kasih atas penjelasannya :)
Denham Coote
3

Haskell, 107 131 byte

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]

Versi kedua dari program Haskell pertama saya!

Kali ini dengan tampilan sesuai persyaratan, tanpa malu-malu dicuri diadaptasi dari nimi (well, saya melakukan riset tetapi sepertinya tidak ada cara yang efisien untuk menampilkan karakter di Haskell sehingga putStr $ unlines sulit untuk dihindari).

Dan ... terlepas dari faktorisasi rumus pada akhirnya, itu masih dapat dibaca =)

penjara bawah tanah
sumber
3

Haskell, 125 121 byte

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]

Pemakaian:

*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]]membuat daftar dengan 4 (panjang parameter 1) salinan elemen kedua, yaitu [[1..9],[1..9],[1..9],[1..9]]. mapM idmembuat daftar semua kombinasi daripadanya, yaitu [0,0,0,0]untuk [9,9,9,9]. Simpan yang meringkas 100dan membangun string dengan kotak itu. Cetak semua kotak.

Terima kasih @Mauris untuk 1 byte dan membuat saya meninjau posting saya untuk menemukan 3 lagi.

nimi
sumber
mapM idmenghemat byte vs sequence.
Lynn
2

Python 2, 145 129 Bytes

Saat ini saya bermain-main dengan beberapa metode penghitungan yang harus lebih pendek dari apa yang diuraikan, tetapi saya akan memposting apa yang saya miliki sekarang.

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
Kade
sumber
2

CJam, 43 42 byte

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

Penjelasan untuk diikuti .. hari ini EOD

Cobalah online di sini

Pengoptimal
sumber
Versi java golf saya (yang tidak repot dengan kotak, hanya daftar urutan) adalah 197 karakter. Ini melakukan semuanya dalam seperempat panjangnya! Keren :)
Denham Coote
@DenhamCoote Itulah setiap jawaban CJam, Pyth, dan GolfScript.
fase
Masih menantikan penjelasan itu ;-)
Denham Coote
1

Python 3, 159

Cepat dan kotor.

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]
Daniel Wakefield
sumber
1

R, 165 byte

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=""))

Ini akan jauh lebih singkat jika saya memilih untuk meng-hard-output dengan beberapa cara. Seperti beberapa solusi lain, ini mengambil keuntungan dari identitas 20 x 1 + 11 ( x 2 + x 3 ) + 2 x 4 = 100.

Penjelasan + tidak dikumpulkan:

# 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 = ""))

Anda mungkin bertanya-tanya mengapa pernyataan terakhir adalah tugas. Ternyata, catfungsi, yang menyatukan dan mencetak, mengembalikan nilai NULL. Ketika Anda memanggil catdari dalam fungsi seperti apply, output akan diikuti oleh NULL, yang tidak diinginkan. Ada dua cara untuk mengatasi hal ini: tetapkan ke variabel atau masukkan invisible. Di sini saya memilih yang pertama karena jauh lebih pendek.

Anda dapat mencobanya secara online .

Alex A.
sumber
1

Jawa, 450

Usaha pertamaku (ungolfed) pertamaku terlihat seperti ini:

kelas B {
  public static static utama (String [] a) {
    untuk (int i = 1; i <10; i ++)
      untuk (int j = 1; j <10; j ++)
        untuk (int k = 1; k <10; k ++)
          untuk (int l = 1; l <10; l ++)
            if (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");
            }
  }
}

Denham Coote
sumber
3
Petunjuk: 20*a + 11*(b + c) + 2*d == 100.
orlp
Ya, solusi ini adalah penggabungan string murni - upaya pertama yang sangat sederhana.
Denham Coote
1
Saya hanya menghitung 436 byte , bukan 450. Selain itu, spasi tidak diperlukan, yang akan menghemat banyak uang.
Alex A.
Selain itu, menghapus spasi yang tidak perlu, ini harus lebih dekat ke 340 byte :)
Kade
1

PowerShell, 98

formula steveverrill yang disesuaikan

:\>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
mengoceh
sumber