Wajah Dadu Terlihat


21

Sebuah die Barat tradisional adalah sebuah kubus, di mana bilangan bulat 1 sampai 6 ditandai pada wajah. Pasangan yang menambah 7 ditempatkan pada wajah yang berlawanan.

Karena ini adalah kubus, kita hanya dapat melihat antara 1 dan 3 wajah (inklusif) 1 pada waktu tertentu. Wajah yang berseberangan tidak pernah bisa dilihat pada saat yang bersamaan.

Tugas Anda adalah menulis sebuah program atau fungsi yang, mengingat daftar bilangan bulat yang mewakili sisi-sisi pada cetakan, menentukan apakah mungkin untuk melihat wajah-wajah ini secara bersamaan.

1 Oke, mungkin Anda bisa melihat 4 atau 5 wajah dengan sepasang mata, tetapi untuk tujuan tantangan ini, kami mengamati dadu dari satu titik.


Aturan:

  • Kiriman Anda dapat mengasumsikan daftar input:
    • Tidak kosong.
    • Hanya berisi nilai-nilai yang memuaskan 1 ≤ n ≤ 6.
    • Tidak mengandung elemen duplikat.
  • Anda mungkin tidak berasumsi bahwa input diurutkan.
  • Kiriman Anda harus menampilkan nilai kebenaran / kepalsuan : kebenaran adalah wajah dapat dilihat pada saat yang sama, kepalsuan sebaliknya.
  • Ini adalah , jadi jawaban tersingkat (dalam byte) menang!
  • Celah standar dilarang secara default.

Uji Kasus

Benar:

[6]                 (One face)
[6, 2]              (Share a side)
[1, 3]              (Share a side)
[2, 1, 3]           (Share a vertex)
[3, 2, 6]           (Share a vertex)

Falsy:

[1, 6]              (1 and 6 are opposite)
[5, 4, 2]           (2 and 5 are opposite)
[3, 1, 4]           (3 and 4 are opposite)
[5, 4, 6, 2]        (Cannot see 4 faces)
[1, 2, 3, 4, 5, 6]  (Cannot see 6 faces)


Tampaknya dua kasus falsey terakhir berlebihan karena setiap daftar yang lebih panjang dari 3 akan berisi nilai yang berlawanan, bukan?
Weckar E.

@ Perhatikan ya, jelas - jika Anda melihat jawaban mereka semua mengeksploitasi ini. Itu hanya penjelasan yang lebih mudah untuk ditulis.
FlipTack

@FlipTack Sebenarnya Anda tidak perlu memeriksa panjangnya sama sekali, setiap daftar yang lebih panjang dari 3 elemen memiliki setidaknya satu pasang sisi yang berlawanan.
Erik the Outgolfer

1
Anda masih dapat melihat hingga 5 wajah dari satu titik jika Anda membengkokkan gelombang cahaya dengan sesuatu yang berat seperti lubang hitam
Ferrybig

Jawaban:



14

JavaScript (ES6),  38 34 30 29  28 byte

Mengambil input sebagai sejumlah parameter terpisah. Pengembalian 0atau 1.

(a,b,c,d)=>!(d|(a^b^c)%7)^!c

Uji kasus

Bagaimana?

Di bawah ini adalah versi sederhana dari ekspresi utama sesuai dengan jumlah parameter yang disediakan, variabel tidak terdefinisi dipaksa menjadi 0 atau salah :

# of param. | simplified expression        | comment
------------+------------------------------+---------------------------------------------
     1      | !(a % 7) ^ 1                 | always true
     2      | !((a ^ b) % 7) ^ 1           | false for (1,6), (2,5) and (3,4)
     3      | !((a ^ b ^ c) % 7)           | see the table below
     4+     | !(d | (a ^ b ^ c) % 7)       | always false

NB : Urutan (a, b, c) tidak masalah karena mereka selalu bersama-sama XOR.

Kasing paling sulit adalah yang ke-3. Berikut adalah tabel yang menunjukkan semua kemungkinan kombinasi:

a | b | c | a^b^c | %7 | =0? | faces that sum to 7
--+---+---+-------+----+-----+--------------------
1 | 2 | 3 |   0   |  0 | Yes | none
1 | 2 | 4 |   7   |  0 | Yes | none
1 | 2 | 5 |   6   |  6 | No  | 2 + 5
1 | 2 | 6 |   5   |  5 | No  | 1 + 6
1 | 3 | 4 |   6   |  6 | No  | 3 + 4
1 | 3 | 5 |   7   |  0 | Yes | none
1 | 3 | 6 |   4   |  4 | No  | 1 + 6
1 | 4 | 5 |   0   |  0 | Yes | none
1 | 4 | 6 |   3   |  3 | No  | 1 + 6
1 | 5 | 6 |   2   |  2 | No  | 1 + 6
2 | 3 | 4 |   5   |  5 | No  | 3 + 4
2 | 3 | 5 |   4   |  4 | No  | 2 + 5
2 | 3 | 6 |   7   |  0 | Yes | none
2 | 4 | 5 |   3   |  3 | No  | 2 + 5
2 | 4 | 6 |   0   |  0 | Yes | none
2 | 5 | 6 |   1   |  1 | No  | 2 + 5
3 | 4 | 5 |   2   |  2 | No  | 3 + 4
3 | 4 | 6 |   1   |  1 | No  | 3 + 4
3 | 5 | 6 |   0   |  0 | Yes | none
4 | 5 | 6 |   7   |  0 | Yes | none

Alt. versi # 1, 32 byte

Mengambil input sebagai array. Mengembalikan boolean.

a=>a.every(x=>a.every(y=>x+y-7))

Uji kasus


Alt. versi # 2, Chrome / Firefox, 34 byte

Yang ini menyalahgunakan metode semacam Chrome dan Firefox. Itu tidak bekerja dengan Edge.

Mengambil input sebagai array. Pengembalian 0atau 1.

a=>a.sort((a,b)=>k&=a+b!=7,k=1)&&k

Uji kasus


8

Haskell , 24 byte

-3 byte terima kasih kepada H.PWiz.

f l=all(/=7)$(+)<$>l<*>l

Cobalah online!

Penjelasan

f l=all(/=7)$(+)<$>l<*>l

f l=                      -- make a function f that takes a single argument l
             (+)<$>l<*>l  -- take the sum of each pair in the cartesian product...
    all(/=7)$             -- ...and check if they're all inequal to 7


5

R , 27 byte

terima kasih kepada Gregor untuk memperbaiki bug

function(d)!any((7-d)%in%d)

Cobalah online!

Jawaban Port of Chas Brown . Memiliki operasi vektor membantu membuat ini lebih pendek di R.


Saya pikir Anda perlu beberapa orang tua di sekitar (7-d), orang bijak lain d%in%ddiutamakan.
Gregor

@ Gregor Anda benar sekali.
Giuseppe

4

Mathematica, 20 byte

xFreeQ[#+x&/@x,7]

The adalah\[Function]

-12 byte dari Martin Ender
-7 byte dari Misha Lavrov

Cobalah online!




3

Sebenarnya , 8 byte

;∙♂Σ7@cY

Cobalah online! (menjalankan semua kasus uji)

Penjelasan:

;∙♂Σ7@cY
;∙        Cartesian product with self
  ♂Σ      sum all pairs
    7@c   count 7s
       Y  logical negate

3

Sekam , 5 byte

Ëo≠7+

Cobalah online!

Penjelasan

Ëo     Check that the following function gives a truthy value for all pairs 
       from the input.
    +    Their sum...
  ≠7     ...is not equal to 7.

3

Retina , 21 20 byte

O`.
M`1.*6|2.*5|34
0

Cobalah online! Tautan termasuk kasus uji. Sunting: Disimpan 1 byte berkat @MartinEnder. Penjelasan:

O`.

Sortir input.

M`1.*6|2.*5|34

Periksa sepasang sisi yang berlawanan (urutan 3 dan 4 bersebelahan). Ini mengembalikan 1 untuk mati tidak valid atau 0 untuk yang valid.

0

Meniadakan secara logis hasilnya.



2

Alice , 18 byte

/..y1nr@ 
\iReA6o/

Cobalah online!

Mencetak Jabberwockyuntuk input yang valid dan tidak ada yang sebaliknya.

Penjelasan

Membuka alur kontrol zigzag, program ini benar-benar adil:

i.e16r.RyAno

i.  Read all input and duplicate it.
e16 Push "16".
r   Range expansion to get "123456".
.R  Duplicate and reverse.
y   Transliterate, replaces each face with its opposite.
A   Intersection with input.
n   Logical NOT, turns empty strings into "Jabberwocky"
    and everything else into an empty string.


2

Ruby , 36 31 24 23 byte

->l{l-l.map{|x|7-x}==l}

Cobalah online!

Itu sangat sederhana, saya mencari solusi untuk masalah yang salah sepanjang waktu.


1

05AB1E , 5 byte

7αå_P

Cobalah online!

Penjelasan

7α      # absolute difference between 7 an each in input list
  å     # check each element if it exist in input
   _    # logical negate
    P   # product of list

Salah satu dari beberapa cara untuk melakukan ini dalam 5 byte di 05AB1E



1

Retina , 20 byte

T`_654`d
M`(.).*\1
0

Cobalah online!

Alternatif pendekatan Neil.

Penjelasan

T`_654`d

Berubah 6, 5, 4menjadi 1, 2, 3, masing-masing.

M`(.).*\1

Cobalah untuk menemukan karakter yang berulang dan hitung jumlah kecocokan.

0

Pastikan hasilnya nol (efektif negasi logis).



1

GNU sed , 37 22 + 1 = 23 byte

+1 byte untuk -rbendera. Mengambil input sebagai digit; mencetak input untuk truey dan 0for falsy.

-10 byte terima kasih kepada @MartinEnder.

y/123/654/
/(.).*\1/c0

Cobalah online!

Penjelasan

Mirip dengan jawaban Alice @ MartinEnder .

y/123/654/   # Transliterate 1-3 to 6-4
/(.).*\1/c0  # If a digit appears twice, replace the pattern space with 0

Itu tidak benar-benar mencetak input untuk yang benar, ia mencetak input dengan 1-3 diganti dengan 6-4.
Andrew mengatakan Reinstate Monica

1

Perl 6 , 18 byte

!(1&6|2&5|3&4∈*)

Cobalah online!

1 & 6 | 2 & 5 | 3 & 4adalah persimpangan yang terdiri dari angka 1 dan 6, ATAU angka 2 dan 5, ATAU angka 3 dan 4. Persimpangan ini adalah elemen dari ( ) daftar input *jika mengandung 1 dan 6, atau 2 dan 5, atau 3 dan 4. Hasil itu kemudian dinegasikan ( !) untuk mendapatkan nilai boolean yang diperlukan.


0

Haskell, 46 41 37 byte

f z=all ((/=7).sum) [[x,y]|x<-z,y<-z]

Membawa produk Cartesian dari daftar dengan sendirinya, lalu memeriksa apakah semua daftar yang dihasilkan tidak berjumlah 7. (Jika salah satu dari mereka dijumlahkan ke 7, wajah yang berlawanan akan terlihat, dan "semua tidak" lebih pendek dari "tidak apapun yang dilakukan ".)



0

Formula IBM / Lotus Notes, 7 byte

!7-i*=i

Mengambil input dari bidang angka multi-nilai i.

Secara rekursif mengurangi setiap nilai i dari 7 dan memeriksa untuk melihat apakah itu ada dalam daftar asli. ! mengubah angka 1 menjadi 0 (semua wajah tidak bisa dilihat).

Uji Kasus (tidak tersedia TIO untuk Formula Catatan)

masukkan deskripsi gambar di sini


0

Bersihkan , 49 byte

import StdEnv
f l=and[(a+b)<>7\\(a,b)<-diag2 l l]

Cobalah online!


1
@StephenLeppik Saya tidak berpikir jawaban ini perlu menggunakan nama file untuk menyimpan informasi .
Steadybox

@StephenLeppik Oh titik adil di sana, impor diperlukan tetapi fungsi tidak perlu dideklarasikan dalam modul tertentu. Terima kasih.
Surous

0

Swift , 46 byte

f(a:Int)->[Int]{!a.contains{a.contains(7-$0)}}

Mengambil input sebagai [Int](array integer) dan mengembalikan Bool(boolean).

Penjelasan Singkat (ungolfed)

f(a:Int)->[Int]{
    !a.contains (where: {n in    // The input doesn't have an element where
        a.contains(7 - n)        //    the opposite side is in the input
    })
}

0

Clojure , 89 80 72 byte

-9 byte karena saya menyadari penggunaan reducedtidak perlu

-8 byte dengan mengubah dari menggunakan reduceke menggunakansome

#(if(< 0(count %)4)(not(some(fn[[a b]](=(+ a b)7))(for[a % b %][a b]))))

Saya mencoba menulis ini tanpa melihat trik apa pun yang digunakan jawaban lain. Saya mungkin bisa memperbaiki ini nanti.

Pengembalian trueuntuk kasus yang sebenarnya, falsejika ada pihak yang berjumlah 7, dan niljika jumlah pihak adalah ilegal.


(defn can-see? [dice-sides]
  ; Ensure its a valid length
  (if (< 0 (count dice-sides) 4)

    ; Then check if any of the permutations sum to 7
    (not (some (fn [[a b]]
                 (= (+ a b) 7))

               ; Generate all permutations
               (for [a dice-sides, b dice-sides] [a b])))))
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.