Khuôn mặt súc sắc có thể nhìn thấy


21

Một khuôn phương Tây truyền thống là một khối lập phương, trên đó các số nguyên 1 đến 6 được đánh dấu trên các mặt. Các cặp thêm vào 7 được đặt trên các mặt đối diện.

Vì nó là khối lập phương, chúng ta chỉ có thể nhìn thấy từ 1 đến 3 khuôn mặt (bao gồm) 1 tại bất kỳ thời điểm nào. Khuôn mặt đối diện không bao giờ có thể được nhìn thấy cùng một lúc.

Nhiệm vụ của bạn là viết một chương trình hoặc hàm, đưa ra một danh sách các số nguyên đại diện cho các mặt trên khuôn, xác định xem có thể nhìn thấy các mặt này cùng một lúc không.

1 Được rồi, có thể bạn có thể nhìn thấy 4 hoặc 5 khuôn mặt với một đôi mắt, nhưng với mục đích của thử thách này, chúng tôi quan sát cái chết từ một điểm duy nhất.


Quy tắc:

  • Trình của bạn có thể giả sử danh sách đầu vào:
    • Là không trống rỗng.
    • Chỉ chứa các giá trị thỏa mãn 1 ≤ n ≤ 6.
    • Không chứa các yếu tố trùng lặp.
  • Bạn không thể cho rằng đầu vào được sắp xếp.
  • Trình của bạn nên xuất ra một giá trị trung thực / giả mạo : sự thật là khuôn mặt có thể được nhìn thấy cùng một lúc, giả mạo khác.
  • Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng!
  • Các sơ hở tiêu chuẩn bị cấm theo mặc định.

Các trường hợp thử nghiệm

Sự thật:

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

Giả mạo:

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


Có vẻ như hai trường hợp falsey cuối cùng là thừa vì bất kỳ danh sách nào dài hơn 3 sẽ chứa các giá trị đối lập, phải không?
Weckar E.

@WeckarE có, rõ ràng - nếu bạn có một cái nhìn vào câu trả lời tất cả họ khai thác điều này. Nó chỉ là một lời giải thích dễ dàng hơn để viết.
FlipTack

@FlipTack Trên thực tế, bạn hoàn toàn không phải kiểm tra độ dài, mỗi danh sách dài hơn 3 phần tử có ít nhất một cặp mặt đối diện.
Erik the Outgolfer

1
Bạn vẫn có thể nhìn thấy tối đa 5 khuôn mặt từ một điểm duy nhất nếu bạn bẻ cong các sóng ánh sáng với thứ gì đó nặng như lỗ đen
Ferrybig

Câu trả lời:



14

JavaScript (ES6),  38 34 30 29  28 byte

Lấy đầu vào là bất kỳ số lượng tham số riêng biệt. Trả về 0hoặc 1.

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

Các trường hợp thử nghiệm

Làm sao?

Dưới đây là các phiên bản đơn giản hóa của biểu thức chính theo số lượng tham số được cung cấp, các biến không xác định được ép buộc thành 0 hoặc sai :

# 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

Lưu ý : Thứ tự của (a, b, c) không quan trọng vì chúng luôn XOR với nhau.

Trường hợp khó nhất là trường hợp thứ 3. Dưới đây là bảng hiển thị tất cả các kết hợp có thể:

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. phiên bản # 1, 32 byte

Đưa đầu vào như một mảng. Trả về một boolean.

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

Các trường hợp thử nghiệm


Alt. phiên bản # 2, Chrome / Firefox, 34 byte

Điều này lạm dụng các phương pháp sắp xếp của Chrome và Firefox. Nó không hoạt động với Edge.

Đưa đầu vào như một mảng. Trả về 0hoặc 1.

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

Các trường hợp thử nghiệm


8

Haskell , 24 byte

-3 byte nhờ H.PWiz.

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

Hãy thử trực tuyến!

Giải trình

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








3

Võng mạc , 21 20 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Chỉnh sửa: Đã lưu 1 byte nhờ @MartinEnder. Giải trình:

O`.

Sắp xếp đầu vào.

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

Kiểm tra một cặp cạnh đối diện (sắp xếp 3 và 4 cạnh nhau). Điều này trả về 1 cho một chết không hợp lệ hoặc 0 cho một hợp lệ.

0

Logic phủ nhận kết quả.



2

Alice , 18 byte

/..y1nr@ 
\iReA6o/

Hãy thử trực tuyến!

Bản in Jabberwocky cho đầu vào hợp lệ và không có gì khác.

Giải trình

Mở ra luồng điều khiển ngoằn ngoèo, chương trình thực sự chỉ là:

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.



1

05AB1E , 5 byte

7αå_P

Hãy thử trực tuyến!

Giải trình

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

Một trong nhiều cách để làm điều này trong 5 byte trong 05AB1E



1

Võng mạc , 20 byte

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

Hãy thử trực tuyến!

Một cách khác để tiếp cận Neil.

Giải trình

T`_654`d

Rẽ 6, 5, 4vào 1, 2, 3, tương ứng.

M`(.).*\1

Cố gắng tìm các ký tự lặp đi lặp lại và đếm số lượng trận đấu.

0

Hãy chắc chắn rằng kết quả bằng không (hiệu quả là phủ định logic).



1

GNU sed , 37 22 + 1 = 23 byte

+1 byte cho -rcờ. Lấy đầu vào dưới dạng chữ số; in đầu vào cho trung thực và giả 0.

-10 byte nhờ @MartinEnder.

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

Hãy thử trực tuyến!

Giải trình

Tương tự như câu trả lời Alice của @ MartinEnder .

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

Nó không in chính xác đầu vào cho sự thật, nó in đầu vào bằng 1-3 được thay thế bằng 6-4.
Andrew nói Phục hồi Monica

1

Perl 6 , 18 byte

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

Hãy thử trực tuyến!

1 & 6 | 2 & 5 | 3 & 4là một điểm nối bao gồm các số 1 và 6, HOẶC các số 2 và 5, HOẶC các số 3 và 4. Ngã ba này là một phần tử của ( ) danh sách đầu vào *nếu nó chứa 1 và 6, hoặc 2 và 5, hoặc 3 và 4. Kết quả đó sau đó được phủ định ( !) để lấy giá trị boolean cần thiết.


0

Haskell, 46 41 37 byte

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

Đưa sản phẩm của Cartesian vào danh sách, sau đó kiểm tra xem tất cả các danh sách kết quả có tổng bằng 7. (Nếu bất kỳ trong số chúng được tổng hợp thành 7, các mặt đối diện sẽ hiển thị và "tất cả không" ngắn hơn "không bat ki lam".)



0

Công thức ghi chú IBM / Lotus, 7 byte

!7-i*=i

Lấy đầu vào từ trường số nhiều giá trị i.

Đệ quy trừ từng giá trị của i từ 7 và kiểm tra xem nó có trong danh sách ban đầu không. ! thay đổi 1 nếu là 0 (tất cả các mặt không thể nhìn thấy).

Các trường hợp thử nghiệm (không có TIO cho Công thức ghi chú)

nhập mô tả hình ảnh ở đây


0

Sạch , 49 byte

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

Hãy thử trực tuyến!


1
@StephenLeppik Tôi không nghĩ câu trả lời này nhất thiết phải sử dụng tên tệp để lưu trữ thông tin .
Steadybox

@StephenLeppik Ôi điểm công bằng ở đó, việc nhập là bắt buộc nhưng chức năng không cần phải khai báo trong một mô-đun cụ thể. Cảm ơn.
Οurous

0

Swift , 46 byte

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

Lấy đầu vào là [Int](mảng số nguyên) và trả về một Bool(boolean).

Giải thích ngắn gọn

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 vì tôi nhận ra việc sử dụng reduced là không cần thiết

-8 byte bằng cách thay đổi từ sử dụng reducesang sử dụngsome

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

Tôi đã thử viết điều này mà không nhìn vào bất kỳ thủ thuật nào mà các câu trả lời khác sử dụng. Tôi có thể cải thiện điều này sau.

Trả về truecho các trường hợp thực sự, falsenếu bất kỳ bên nào tổng hợp thành 7 và nilnếu số lượng bên là bất hợp pháp.


(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])))))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.