Видимые Лица Кости


21

Традиционный западный штамп представляет собой куб, на котором целые числа от 1 до 6, отмечены на лицах. Пары, которые добавляют к 7, размещаются на противоположных гранях.

Поскольку это куб, мы можем видеть только от 1 до 3 граней (включительно) 1 в любой момент времени. Противоположные лица никогда не видны одновременно.

Ваша задача - написать программу или функцию, которая, учитывая список целых чисел, представляющих стороны на матрице, определяет, можно ли увидеть эти грани одновременно.

1 Хорошо, может быть, вы можете увидеть 4 или 5 лиц с парой глаз, но с целью этого испытания мы наблюдаем за штампом из одной точки.


Правила:

  • Ваша заявка может принять входной список:
    • Не пусто
    • Содержит только те значения, которые удовлетворяют 1 ≤ n ≤ 6.
    • Не содержит повторяющихся элементов.
  • Вы не можете предполагать, что вход отсортирован.
  • Ваше представление должно вывести истинное / ложное значение : правда - это то, что лица могут быть видны одновременно, иначе ложь.
  • Это , поэтому выигрывает самый короткий ответ (в байтах)!
  • Стандартные лазейки по умолчанию запрещены.

Тестовые случаи

Truthy:

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


Кажется, что последние два ложных случая излишни, так как любой список длиннее 3 будет содержать противоположные значения, не так ли?
Weckar E.

@ WeckarE да, очевидно - если вы посмотрите на ответы, они все используют это. Это было просто более простое объяснение.
FlipTack

@FlipTack На самом деле вам вообще не нужно проверять длину, каждый список длиннее 3-х элементов имеет хотя бы одну пару противоположных сторон.
Эрик Outgolfer

1
Вы все еще можете увидеть до 5 лиц из одной точки, если
изогните

Ответы:



14

JavaScript (ES6),  38 34 30 29  28 байт

Принимает ввод как любое количество отдельных параметров. Возвращает 0или 1.

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

Контрольные примеры

Как?

Ниже приведены упрощенные версии основного выражения в соответствии с количеством предоставленных параметров, неопределенные переменные приводятся к 0 или false :

# 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 : порядок (a, b, c) не имеет значения, потому что они всегда XOR вместе.

Самый сложный случай - третий. Вот таблица, показывающая все возможные комбинации:

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

Чередующийся версия №1, 32 байта

Принимает ввод в виде массива. Возвращает логическое значение.

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

Контрольные примеры


Чередующийся версия № 2, Chrome / Firefox, 34 байта

Этот злоупотребляет методами сортировки Chrome и Firefox. Это не работает с Edge.

Принимает ввод в виде массива. Возвращает 0или 1.

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

Контрольные примеры


8

Haskell , 24 байта

-3 байта благодаря H.PWiz.

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

Попробуйте онлайн!

объяснение

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

APL (Дьялог) , 7 байт

~7∊∘.+⍨

Попробуйте онлайн!

∘.+⍨ - таблица сложений (каждый элемент с каждым элементом)

7∊ - 7 существует?

~ - отрицать


APL (Дьялог) , 7 байт

⍬≡⊢∩7-⊢

Попробуйте онлайн!

7-⊢ - вычесть каждый элемент из 7

⊢∩ - пересекаются с исходным массивом

⍬≡ - пусто?


5

R , 27 байт

спасибо Грегору за исправление ошибки

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

Попробуйте онлайн!

Порт Часов Брауна ответ . Наличие векторизованных операций помогает сделать это намного короче в R.


Я думаю, что вам нужно немного прощаться (7-d), другие мудрые d%in%dимеют приоритет.
Грегор

@ Грегор, ты абсолютно прав.
Джузеппе






3

Сетчатка , 21 20 байт

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

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Редактировать: 1 байт сохранен благодаря @MartinEnder. Объяснение:

O`.

Сортировка ввода.

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

Проверьте наличие пары противоположных сторон (3 и 4 сортируют рядом друг с другом). Возвращает 1 для недействительного кубика или 0 для правильного.

0

Логически отрицать результат.



2

Алиса , 18 байт

/..y1nr@ 
\iReA6o/

Попробуйте онлайн!

Печать Jabberwocky для действительных входных данных и ничего другого.

объяснение

Развернув зигзагообразный поток управления, программа действительно просто:

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 байтов

7αå_P

Попробуйте онлайн!

объяснение

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

Один из нескольких способов сделать это в 5 байтов в 05AB1E



1

Сетчатка , 20 байт

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

Попробуйте онлайн!

Альтернатива подходу Нейла.

объяснение

T`_654`d

Включите 6, 5, 4в 1, 2, 3соответственно.

M`(.).*\1

Попробуйте найти повторяющиеся символы и посчитайте количество совпадений.

0

Убедитесь, что результат был нулевым (фактически логическое отрицание).



1

GNU sed , 37 22 + 1 = 23 байта

+1 байт за -rфлаг. Вводит в виде цифр; печатает ввод для правдивых и 0ложных.

-10 байт благодаря @MartinEnder.

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

Попробуйте онлайн!

объяснение

Похоже на ответ Алисы @ MartinEnder .

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

Он точно не печатает ввод для истинного, он печатает ввод с 1-3, замененным на 6-4.
Эндрю говорит восстановить Монику

1

Perl 6 , 18 байт

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

Попробуйте онлайн!

1 & 6 | 2 & 5 | 3 & 4является соединением, состоящим из чисел 1 и 6, ИЛИ чисел 2 и 5, ИЛИ чисел 3 и 4. Это соединение является элементом ( ) списка ввода, *если оно содержит 1 и 6, или 2 и 5, или 3 и 4. Затем этот результат отменяется ( !), чтобы получить требуемое логическое значение.


0

Haskell, 46 41 37 байт

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

Принимает декартово произведение списка с собой, затем проверяет, все ли результирующие списки не суммируются с 7. (Если любой из них суммируется с 7, будут видны противоположные грани, и «все нет» короче, чем «нет» любой делает ".)



0

IBM / Lotus Notes Formula, 7 байтов

!7-i*=i

Принимает данные из многозначного числового поля i.

Рекурсивно вычитает каждое значение i из 7 и проверяет, находится ли оно в исходном списке. ! изменяет 1, если оно равно 0 (не все лица видны).

Тестовые случаи (нет TIO для формулы Notes)

введите описание изображения здесь


0

Чисто , 49 байт

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

Попробуйте онлайн!


1
@ StefhenLeppik Я не думаю, что этот ответ обязательно использует имя файла для хранения информации .
Steadybox

@StephenLeppik Честно говоря, импорт необходим, но функцию не нужно объявлять в определенном модуле. Спасибо.
Οurous

0

Swift , 46 байт

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

Принимает ввод как [Int](целочисленный массив) и возвращает Bool(логическое).

Краткое объяснение (без гольфа)

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 байта

-9 байт, потому что я понял, что использование reducedненужно

-8 байт, переходя от использования reduceк использованиюsome

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

Я попытался написать это, не обращая внимания ни на какие хитрости, которые используют другие ответы. Возможно, я смогу улучшить это позже.

Возвращает trueдля истинных случаев, falseесли какие-либо стороны составляют 7, и nilесли число сторон недопустимо.


(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])))))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.