Domino mana yang hilang?


34

Satu set domino standar memiliki 28 buah unik:

masukkan deskripsi gambar di sini

Diberikan daftar 28 atau kurang domino unik, tampilkan daftar yang diperlukan untuk membuat set lengkap.

Input dan output domino ditentukan oleh dua digit - jumlah pips pada setiap sisi domino yang, misalnya 00, 34, 40, 66.

Digit dapat diberikan dalam urutan apa pun, demikian 34juga dengan domino yang sama43

Contoh Input

00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66
00 10 11 20 21 22 30 31 32 33 40 41 42 43 44 50 51 52 53 54 55 60 61 62 63 64 65 66
00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 34 35 36 44 45 46 55 56 66
00 02 03 04 05 06 11 13 14 15 16 22 24 25 26 33 35 36 44 46 55 66
<empty list>

Keluaran Contoh yang Sesuai

<empty list>
<empty list>
33
01 12 23 34 45 56
00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66

2
Format input apa yang diizinkan? Daftar string? Daftar daftar bilangan bulat?
Martin Ender

1
@ Martin Saya berasumsi kita memiliki konsensus meta di suatu tempat di sepanjang baris "apa pun daftar, array, set, koleksi, vektor, matriks, ... Apakah sesuai untuk bahasa Anda. Anggota dapat berupa angka atau string"
Digital Trauma

Apakah itu berarti bahwa kita dapat meminta setiap kartu domino sebagai sepasang bilangan bulat, misalnya 03 16= [0, 3], [1, 6]?
FlipTack

1
@FlipTack Ya, tentu saja
Digital Trauma

Jawaban:


10

CJam, 11 byte

{:$7Ym*:$^}

Blok tanpa nama (fungsi) dengan I / O sebagai daftar pasangan bilangan bulat.

Uji di sini.

Penjelasan

:$   e# Sort each pair in the input.
7Ym* e# Get all pairs with elements in range [0 .. 6] using a Cartesian product.
:$   e# Sort each pair.
^    e# Symmetric set-difference. This will remove all pairs that are in the input
     e# and also remove duplicates, because it's a set operation.

Mengapa Anda membutuhkan {}tanda kurung?
Chromium

6

Pyth, 12 10 byte

-.CU7 2SMQ

Input dan output dalam format [[0, 0], [0, 1], ...].

   U7       generate range [0, 1, ..., 6]
 .C   2     all combinations-with-replacement of 2, generates [[0,0],[0,1],...]
         Q  get the input
       SM   sort each domino (turns ex. [1,0] into [0,1])
-           remove the map-sort'd input from the full array

Coba di sini.

Terima kasih kepada @ MartinBüttner untuk menghemat 2 byte dengan format input / output yang berbeda!


4

JavaScript (diusulkan ES7), 80 76 byte

s=>[for(n of d="0123456")for(o of d.slice(n))if(s.search(n+o+'|'+o+n)<0)n+o]

Mengambil input sebagai string yang dipisahkan spasi dan mengembalikan array string. Pemahaman array sangat menarik bagi mereka yang satu ini.


3

Ruby 74 byte

->b{a=(0..27).map{|i|"%d%d"%[i%7,(i+i/7)%7]}
b.map{|e|a-=[e,e.reverse]}
a}

Mengambil array string, mengembalikan array string.

Berkomentar dalam program uji

f=->b{a=(0..27).map{|i|"%d%d"%[i%7,(i+i/7)%7]} #generate complete set of dominos (each domino once) and store in a
b.map{|e|a-=[e,e.reverse]}                     #remove provided dominos (check both forward and reverse representations)
a}                                             #return a

p f[%w{00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66}]
p f[%w{00 10 11 20 21 22 30 31 32 33 40 41 42 43 44 50 51 52 53 54 55 60 61 62 63 64 65 66}]
p f[%w{00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 34 35 36 44 45 46 55 56 66}]
p f[%w{00 02 03 04 05 06 11 13 14 15 16 22 24 25 26 33 35 36 44 46 55 66}]
p f[[]]

Keluaran

[]
[]
["33"]
["01", "12", "23", "34", "45", "56"]
["00", "11", "22", "33", "44", "55", "66", "01", "12", "23", "34", "45", "56", "60", "02", "13", "24", "35", "46", "50", "61", "03", "14", "25","36", "40", "51", "62"]

Pada contoh terakhir (daftar kosong masukan) catat urutan pembuatan daftar lengkap domino menggunakan aritmatika modular. 7 ganda dihasilkan pertama, kemudian 7 domino dengan selisih 1 (atau 6) pip di setiap sisi, lalu 7 domino dengan selisih 2 (atau 5) pip, dan akhirnya 7 domino dengan selisih 3 (atau 4) pips.



2

Perl, 48 + 1 = 49 byte

for$=(0..6){for$.($=..6){/$=$.|$.$=/||say$=.$.}}

Membutuhkan -nbendera, dan gratis -M5.010| -E:

$ perl -nE'for$=(0..6){for$.($=..6){/$=$.|$.$=/||say$=.$.}}' <<< '00 02 03 04 05 06 11 13 14 15 16 22 24 25 26 33 35 36 44 46 55 66'                      
01
12
23
34
45
56

Jawabannya cukup membosankan secara keseluruhan, tapi ini dia versi yang tidak diserang:

# '-n' auto reads first line into `$_`:
# $_ = <>;
foreach $a (0..6) {
  foreach $b ($a..6) {
    say $a . $b unless $_ =~ /$a$b|$b$a/;
  }
}



2

R , 111 byte

function(s,p=paste0,L=lapply)setdiff(p(sequence(1:7)-1,rep(0:6,t=1:7)),L(L(strsplit(s,''),sort),p,collapse=''))

Cobalah online!

Tidak benar-benar bangga dengan ini, tetapi R tidak terlalu "golfy" dalam membelah / menggabungkan string ...


2

05AB1E , 12 11 byte

6Ýã€{JI€{KÙ

-1 byte terima kasih kepada @Emigna .

Cobalah online.

Penjelasan:

6Ý         # [0,1,2,3,4,5,6]
  ã        # Duplicate and take the cartesian product (pair up each)
   €{      # Sort each pair
     J     # Join them together to strings
I€{        # Sort each pair-string of the input
K          # Remove all pairs from the input from the cartesian list
Ù          # Only leave unique values

1

Mathematica, 49 byte

Complement[Join@@Table[{x,y},{x,0,6},{y,0,6}],#]&

Input adalah daftar daftar bilangan bulat.


3
Gagal pada test case terakhir; ingat, ini adalah himpunan tidak teratur.
LegionMammal978

Saya setuju dengan @ LegionMammal978; jawaban ini tampaknya tidak valid.
Jonathan Frech

1

Java 8, 105 byte

Void lambda menerima yang bisa berubah java.util.Set<String>.

s->{for(int i=0,a,b;i<49;)if(s.add(""+(a=i/7)+(b=i++%7))&(s.add(""+b+a)|a==b))System.out.print(" "+a+b);}

Cobalah secara Online

Tidak disatukan

s -> {
    for (int i = 0, a, b; i < 49;)
        if (
            s.add("" + (a = i / 7) + (b = i++ % 7))
            & (
                s.add("" + b + a)
                | a == b
            )
        )
            System.out.print(" " + a + b);
}

Ucapan Terima Kasih

  • -1 byte terima kasih kepada Jonathan Frech

1
int i=0,a,b;while(i<49bisa for(int i=0,a,b;i<49;.
Jonathan Frech


1

J, 26 , 24 byte

-2 byte terima kasih kepada FrownyFrog

(;(,.i.,])&.>i.7)-.\:~"1
  • (;(,.i.,])&.>i.7) menghitung set lengkap (bagian ini bisa golf lebih lanjut, saya percaya. Dan tolong lakukan jika Anda melihat caranya ...)
  • -. diatur "minus"
  • /:~"1 memesan setiap input

Cobalah online!

Asli

Cobalah online!

((#~<:/"1)>,{;~i.7)-./:~"1

(;(,.i.,])&.>i.7)menghemat 2 (membalikkan urutan)
FrownyFrog

@FrownyFrog terima kasih, diperbarui.
Jonah

1

Python 2, 89 86 byte

Disimpan beberapa byte dengan menyederhanakan pembuatan set domino.

lambda z,s="0123456":{x+y for x in s for y in s[int(x):]}-{(a+b,b+a)[a>b]for a,b in z}

Cobalah online!

Mengambil daftar string seperti ["00", "10", "02] sebagai argumen untuk kartu domino. Mengembalikan objek set python, yang merupakan daftar berbeda yang tidak berurutan.

Penjelasan

# anonymous function, s should always have its default value
lambda z,s="0123456":
                     # contents are a set
                     {                                  }
                          # iterate over characters in string
                          for x in s
                                     # for each x, iterate over x from index of current item forward
                                     for y in s[int(x):]
                     # add characters together for domino string
                     x+y
                                                         # contents are a set, return the difference between these two sets 
                                                         -{                          }
                                                             # iterate over items in input list, split strings into two characters
                                                                         for a,b in z
                                                             # sort strings in input list (so that i.e. "10" => "01")
                                                             # essentially, "ab" if a<b, otherwise "ba"
                                                             (a+b,b+a)[a>b]

0

Haskell, 65 byte

f x=[[a,b]|a<-"0123456",b<-[a..'6'],notElem[a,b]x&&notElem[b,a]x]

Contoh penggunaan:

*Main> f ["00","02","03","04","05","06","11","13","14","15","16","22","24","25","26","33","35","36","44","46","55","66"]
["01","12","23","34","45","56"]

Iterate adalam loop luar atas semua angka dari 0untuk 6dan bdalam loop batin atas semua angka dari ake 6dan menjaga mereka abdi mana tidak abjuga baditemukan dalam string masukan.


0

Serius, 16 byte

,`S`M7r;∙`εjS`M-

Mengambil input sebagai daftar string, menampilkan daftar string

Cobalah online!

Penjelasan:

,`S`M7r;∙`εjS`M-
,`S`M             map: sort each input string
     7r;∙         cartesian product of range(0,7) ([0,1,2,3,4,5,6]) with itself
         `εjS`M   map: join on empty string, sort (results in all valid dominoes with some duplicates)
               -  set difference (all values present in valid dominoes set not present in input, with duplicates removed)

Sebenarnya , 13 byte (tidak bersaing)

♂S7r;∙`εjS`M-

Ini identik dengan jawaban Serius (dengan pengecualian input implisit dan ♂Scara yang lebih pendek untuk mempersingkat setiap string input).

Cobalah online!


1
Anda memiliki duplikat dalam output
Digital Trauma

@DigitalTrauma Ini disebabkan oleh perubahan yang tidak kompatibel ke belakang yang dibuat sejak saat posting.
Mego

0

raket

(define (missing-dominoes input)
  (filter
   (lambda (n)
     (not (member n (map
                     (lambda (n)
                       (let ((x (quotient n 10)) (y (remainder n 10)))
                         (if (<= x y) n (+ (* y 10) x))))
                     input))))
   (for*/list ([i (in-range 7)] [j (in-range i 7)])
     (+ (* 10 i) j))))

2
Senang melihat orang bermain golf di raket! Ini adalah pertanyaan kode-golf sehingga Anda mungkin harus memasukkan bytecount Anda dalam jawaban Anda. Anda juga bisa menghapus spasi kosong dari jawaban ini.
Wheat Wizard

Saya setuju dengan @WW dalam jawaban ini sepertinya tidak cukup golf untuk valid.
Jonathan Frech
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.