どのドミノが欠落していますか?


34

標準のドミノセットは 28点のユニークな作品があります。

ここに画像の説明を入力してください

28個以下の一意のドミノのリストを指定して、完全なセットを作成するために必要なリストを出力します。

入力と出力のドミノが2桁で指定されている-ドミノの各側のピップの数、例えば00344066

数字は任意の順序で指定できるため、34同じドミノと同じです43

入力例

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>

対応する出力例

<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
どの入力形式が許可されていますか?文字列のリスト?整数のリストのリスト?
マーティンエンダー

1
私が想定した@Martin我々はの線に沿ってメタコンセンサスどこかに持っている「何でもリスト、配列、セット、コレクション、ベクトル、行列、...あなたの言語に適したメンバーは、数値や文字列かもしれません。」
デジタルトラウマ

それは、各ドミノを整数のペアとして要求できることを意味しますか、例えば03 16= [0, 3], [1, 6]
FlipTack

1
@FlipTackはい、もちろん
デジタル外傷

回答:


10

CJam、11バイト

{:$7Ym*:$^}

整数のペアのリストとしてI / Oを使用した名前のないブロック(関数)。

ここでテストしてください。

説明

:$   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.

なぜ{}ブラケットが必要なのですか?
クロム

6

Pyth、12 10バイト

-.CU7 2SMQ

形式での入出力[[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

ここで試してみてください。

異なる入力/出力形式で2バイトを保存してくれた@MartinBüttnerに感謝します!


4

JavaScript(ES7提案)、80 76バイト

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

スペースで区切られた文字列として入力を受け取り、文字列の配列を返します。配列の内包表記は、この配列の重みを実際に引きます。


3

ルビー74バイト

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

文字列の配列を受け取り、文字列の配列を返します。

テストプログラムでコメント

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[[]]

出力

[]
[]
["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"]

最後の例(入力空リスト)では、モジュラー演算を使用したドミノの完全なリストの生成順序に注意してください。最初に7つのダブルが生成され、次に各側で1(または6)ピップの差がある7つのドミノ、次に2(または5)ピップの差がある7つのドミノ、最後に3(または4)の違いを持つ7つのドミノが生成されますピップ。


3

ジュリア0.6、47バイト

A->setdiff([[i,j]for i=0:6 for j=i:6],sort.(A))

オンラインでお試しください!

(JayCeのおかげで、範囲の開始が修正されました。)


48バイト

A->[(i,j)for i=0:6 for j=i:6 if[i,j]∉sort.(A)]

オンラインでお試しください!


3番目のTIOテストケースでは、ゼロドミノが欠落しているようです。i = 0:6の場合は?
JayCe

それは、午前3時に半眠状態で投稿しようとすると得られるものです。はい、今修正されました(うまくいけば)、ありがとう。
スンダ

2

Perl、48 + 1 = 49バイト

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

-nフラグと無料が必要です-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

全体的にかなり退屈な答えですが、ここでは、未使用のバージョンについて説明します。

# '-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バイト

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

オンラインでお試しください!

これを本当に誇りに思っているわけではありませんが、Rは文字列の分割/連結においてあまり「ゴルフ」ではありません...



1

Mathematica、49バイト

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

入力は整数のリストのリストです。


3
最後のテストケースで失敗します。覚えておいてください、これらは順序付けられていないセットです。
LegionMammal978

@ LegionMammal978に同意します。この答えは無効のようです。
ジョナサンフレッチ

1

Java 8、105バイト

mutableを受け入れるvoidラムダ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);}

オンラインで試す

非ゴルフ

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);
}

謝辞

  • ジョナサン・フレッシュのおかげで-1バイト

1
int i=0,a,b;while(i<49することができますfor(int i=0,a,b;i<49;
ジョナサンフレッチ


1

J、26、24のバイト

-FrownyFrogのおかげで2バイト

(;(,.i.,])&.>i.7)-.\:~"1
  • (;(,.i.,])&.>i.7) 完全なセットを計算します(この部分はさらにゴルフすることができます。
  • -. 「マイナス設定」
  • /:~"1 各入力を注文します

オンラインでお試しください!

元の

オンラインでお試しください!

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

(;(,.i.,])&.>i.7)保存2(順序を逆にします)
FrownyFrog

@FrownyFrogありがとう、更新しました。
ジョナ

1

Python 2、89 86バイト

ドミノセットの生成を簡素化して、数バイトを節約しました。

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}

オンラインでお試しください!

["00"、 "10"、 "02]などの文字列のリストをドミノの引数として受け取り、順序付けられていない個別のリストであるpythonセットオブジェクトを返します。

説明

# 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バイト

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

使用例:

*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"]

反復aからの全ての桁を超える外側のループ内06bからすべての数字上インナーループ内a6と、それらを保持するab場合もabba入力文字列に見出されます。


0

真剣に、16バイト

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

入力を文字列のリストとして受け取り、文字列のリストを出力します

オンラインでお試しください!

説明:

,`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)

実際には、13バイト(非競合)

♂S7r;∙`εjS`M-

これは、真剣に答えるのと同じです(暗黙の入力と♂S、各入力文字列を短くするより短い方法であることを除いて)。

オンラインでお試しください!


1
出力に重複がある
デジタルトラウマ

@DigitalTraumaこれは、投稿時以降に行われた後方互換性のない変更によるものです。
メゴ

0

ラケット

(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
ラケットでゴルフをしている人々を見るのは素晴らしいことです!これはコードゴルフの質問なので、おそらく回答にバイトカウントを含めるべきです。この回答からかなりの空白を確実に削除することもできます。
小麦ウィザード

この答えが有効であるほど十分にゴルフされていないように見えるという点で、@ WWに同意します。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.