Widoczne twarze w kości

21

Tradycyjny Zachodnia matryca jest kostka, na której liczby całkowite od 1 do 6 są oznaczone na twarzach. Pary, które dodają do 7, są umieszczane na przeciwległych powierzchniach.

Ponieważ jest to kostka, w danym momencie możemy zobaczyć tylko od 1 do 3 ścian (włącznie) 1 . Przeciwnych twarzy nigdy nie można zobaczyć jednocześnie.

Twoim zadaniem jest napisanie programu lub funkcji, która na podstawie listy liczb całkowitych reprezentujących boki na matrycy określa, czy można zobaczyć te twarze w tym samym czasie.

1 Okay, może widzisz 4 lub 5 twarzy parą oczu, ale na potrzeby tego wyzwania obserwujemy kość z jednego punktu.


Zasady:

  • Twoje zgłoszenie może obejmować listę danych wejściowych:
    • Jest niepusty
    • Zawiera tylko wartości, które spełniają 1 ≤ n ≤ 6.
    • Nie zawiera zduplikowanych elementów.
  • Być może nie zakładać, że wejście jest posortowana.
  • Twoje zgłoszenie powinno dawać wartość prawda / fałsz : prawda jest taka, że ​​twarze można zobaczyć w tym samym czasie, a fałsz inaczej.
  • To jest , więc wygrywa najkrótsza odpowiedź (w bajtach)!
  • Standardowe luki są domyślnie zabronione.

Przypadki testowe

Prawda:

[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)
FlipTack
źródło
Związane .
FlipTack,
Wydaje się, że dwa ostatnie przypadki falsey są zbędne, ponieważ każda lista dłuższa niż 3 będzie zawierać przeciwne wartości, prawda?
Weckar E.,
@WeckarE tak, oczywiście - jeśli spojrzysz na odpowiedzi, wszyscy to wykorzystują. To było po prostu łatwiejsze wyjaśnienie do napisania.
FlipTack,
@FlipTack W rzeczywistości nie musisz wcale sprawdzać długości, każda lista dłuższa niż 3 elementy ma co najmniej jedną parę przeciwnych stron.
Erik the Outgolfer,
1
Nadal możesz zobaczyć do 5 twarzy z jednego punktu, jeśli
wygniesz

Odpowiedzi:

14

JavaScript (ES6),  38 34 30 29  28 bajtów

Pobiera dane wejściowe jako dowolną liczbę oddzielnych parametrów. Zwraca 0lub 1.

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

Przypadki testowe

W jaki sposób?

Poniżej znajdują się uproszczone wersje głównego wyrażenia zgodnie z liczbą podanych parametrów, niezdefiniowane zmienne są wymuszane na 0 lub fałsz :

# 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 : Kolejność (a, b, c) nie ma znaczenia, ponieważ zawsze są razem XOR.

Najtrudniejszy przypadek to trzeci przypadek. Oto tabela pokazująca wszystkie możliwe kombinacje:

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. wersja nr 1, 32 bajty

Pobiera dane wejściowe jako tablicę. Zwraca wartość logiczną.

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

Przypadki testowe


Alt. wersja # 2, Chrome / Firefox, 34 bajty

Ten nadużywa metod sortowania w Chrome i Firefox. Nie działa z Edge.

Pobiera dane wejściowe jako tablicę. Zwraca 0lub 1.

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

Przypadki testowe

Arnauld
źródło
8

Haskell , 24 bajty

-3 bajty dzięki H.PWiz.

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

Wypróbuj online!

Wyjaśnienie

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
całkowicie ludzki
źródło
5

APL (Dyalog) , 7 bajtów

~7∊∘.+⍨

Wypróbuj online!

∘.+⍨ - tabela dodatków (każdy element z każdym elementem)

7∊ - 7 istnieje?

~ - negować


APL (Dyalog) , 7 bajtów

⍬≡⊢∩7-⊢

Wypróbuj online!

7-⊢ - odejmij każdy element od 7

⊢∩ - przecinają się z oryginalną tablicą

⍬≡ - pusty?

Uriel
źródło
5

R , 27 bajtów

dzięki Gregorowi za naprawienie błędu

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

Wypróbuj online!

Odpowiedź Porta Chasa Browna . Operacje wektoryzacji pomagają znacznie skrócić to w R.

Giuseppe
źródło
Myślę, że potrzebujesz trochę parenów (7-d), inne d%in%dmają pierwszeństwo.
Gregor,
@Gregor masz absolutną rację.
Giuseppe,
4

Mathematica, 20 bajtów

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

jest\[Function]

-12 bajtów od Martina Endera
-7 bajtów od Miszy Ławrow

Wypróbuj online!

J42161217
źródło
3

Pyth , 5 bajtów

!@-L7

Wypróbuj tutaj.

Erik the Outgolfer
źródło
Mógłbym przysiąc, że próbowałem tego dwie minuty temu i to nie zadziałało ... Hę, zastanawiam się, co poszło nie tak
Pan Xcoder,
Pierwsza rzecz, o której myślałem? The Sandlot .
maxathousand
3

Właściwie 8 bajtów

;∙♂Σ7@cY

Wypróbuj online! (uruchamia wszystkie przypadki testowe)

Wyjaśnienie:

;∙♂Σ7@cY
;∙        Cartesian product with self
  ♂Σ      sum all pairs
    7@c   count 7s
       Y  logical negate
Mego
źródło
3

Łuska , 5 bajtów

Ëo≠7+

Wypróbuj online!

Wyjaśnienie

Ëo     Check that the following function gives a truthy value for all pairs 
       from the input.
    +    Their sum...
  ≠7     ...is not equal to 7.
Martin Ender
źródło
3

Siatkówka , 21 20 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 1 bajt dzięki @MartinEnder. Wyjaśnienie:

O`.

Posortuj dane wejściowe.

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

Sprawdź parę przeciwnych stron (sortowanie 3 i 4 obok siebie). Zwraca 1 za nieprawidłową kostkę lub 0 za prawidłową.

0

Logicznie zaneguj wynik.

Neil
źródło
2

Galaretka , 5 bajtów

7_f⁸Ṇ

Wypróbuj online!

Port Chas Browna odpowiedź .

Wyjaśnienie

7_f⁸Ṇ
7_    Subtract each element from 7
  f⁸  Filter with the original list
    Ṇ Check if empty 
Erik the Outgolfer
źródło
2

Alice , 18 bajtów

/..y1nr@ 
\iReA6o/

Wypróbuj online!

Drukuje Jabberwockyprawidłowe dane wejściowe i nic poza tym.

Wyjaśnienie

Rozwijając zygzakowaty przepływ sterowania, program jest naprawdę po prostu:

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.
Martin Ender
źródło
2

Ruby , 36 31 24 23 bajtów

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

Wypróbuj online!

To było takie proste, cały czas szukałem rozwiązania niewłaściwego problemu.

GB
źródło
1

05AB1E , 5 bajtów

7αå_P

Wypróbuj online!

Wyjaśnienie

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

Jeden z kilku sposobów, aby to zrobić w 5 bajtach w 05AB1E

Emigna
źródło
1

Perl 5 , 51 + 1 ( -a) = 52 bajty

say$F[0]+($t=$F[1])-7&&$F[0]+$t-7&&$t+$F[2]-7&&@F<4

Wypróbuj online!

Xcali
źródło
3 1 4daje prawdę, a cosay 1>grep{$x=$_;grep$_+$x==7,@F}@F
Nahuel Fouilleul,
25 + 1 (-p) zainspirowany roztworem sed
Nahuel Fouilleul,
1

Siatkówka , 20 bajtów

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

Wypróbuj online!

Alternatywa dla podejścia Neila.

Wyjaśnienie

T`_654`d

Skręć w 6, 5, 4na 1, 2, 3, odpowiednio.

M`(.).*\1

Spróbuj znaleźć powtarzające się postacie i policz liczbę dopasowań.

0

Upewnij się, że wynik był zerowy (faktycznie logiczna negacja).

Martin Ender
źródło
1

GNU sed , 37 22 + 1 = 23 bajty

+1 bajt dla -rflagi. Pobiera dane wejściowe jako cyfry; wypisuje dane wejściowe dla prawdy i 0fałszu.

-10 bajtów dzięki @MartinEnder.

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

Wypróbuj online!

Wyjaśnienie

Podobne do odpowiedzi Alicji @ MartinEndera .

y/123/654/   # Transliterate 1-3 to 6-4
/(.).*\1/c0  # If a digit appears twice, replace the pattern space with 0
Jordania
źródło
Nie drukuje dokładnie danych wejściowych dla prawdy, drukuje dane wejściowe z 1-3 zastąpionymi przez 6-4.
Andrew mówi Przywróć Monikę
1

Perl 6 , 18 bajtów

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

Wypróbuj online!

1 & 6 | 2 & 5 | 3 & 4to skrzyżowanie składające się z liczb 1 i 6, LUB liczb 2 i 5, LUB liczb 3 i 4. To połączenie jest elementem ( ) listy wejściowej, *jeśli zawiera 1 i 6 lub 2 i 5 lub 3 oraz 4. Ten wynik jest następnie negowany ( !), aby uzyskać wymaganą wartość logiczną.

Sean
źródło
0

Haskell, 46 41 37 bajtów

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

Bierze ze sobą kartezjański produkt z listy, a następnie sprawdza, czy wszystkie wynikowe listy nie sumują się do 7. (Jeśli którakolwiek z nich zsumuje się do 7, widoczne będą przeciwległe twarze, a „nie wszystkie” jest krótsze niż „nie any do ”.)

Draconis
źródło
0

Formuła IBM / Lotus Notes, 7 bajtów

!7-i*=i

Pobiera dane wejściowe z pola liczbowego o wielu wartościach i.

Rekurencyjnie odejmuje każdą wartość i od 7 i sprawdza, czy jest na oryginalnej liście. ! zmienia 1, jeśli ma wartość 0 (twarze nie są widoczne).

Przypadki testowe (brak dostępnych TIO dla Notes Formula)

wprowadź opis zdjęcia tutaj

ElPedro
źródło
0

Czysty , 49 bajtów

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

Wypróbuj online!

Obrzydliwe
źródło
1
@StephenLeppik Nie sądzę, że ta odpowiedź musi koniecznie używać nazwy pliku do przechowywania informacji .
Steadybox
@StephenLeppik No jasne, import jest wymagany, ale funkcja nie musi być deklarowana w określonym module. Dzięki.
Οurous,
0

Szybki , 46 bajtów

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

Pobiera dane wejściowe jako [Int](tablica liczb całkowitych) i zwraca wartość Bool(boolean).

Krótkie wyjaśnienie (bez golfa)

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
    })
}
Herman L.
źródło
0

Clojure , 89 80 72 bajtów

-9 bajtów, ponieważ zdałem sobie sprawę, że użycie reducedjest niepotrzebne

-8 bajtów poprzez zmianę z używania reduce na używaniesome

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

Próbowałem to napisać, nie patrząc na sztuczki, których używają inne odpowiedzi. Może uda mi się to poprawić później.

Zwraca truew prawdziwych przypadkach, falsejeśli którakolwiek ze stron sumuje się do 7, a nilliczba stron jest nielegalna.


(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])))))
Carcigenicate
źródło