Görünür Zar Yüzleri


21

Bir geleneksel Batılı kalıp 1'den 6'ya kadar tamsayılar yüzlerine seçilmiş olduğuna bir küp vardır. 7'ye ekleyen çiftler karşıt yüzlere yerleştirilir.

Küp olduğundan, herhangi bir zamanda yalnızca 1 ile 3 yüz (dahil) 1 arasında görebilirsiniz . Karşıt yüzler aynı anda asla görülemez.

Senin görevin, ölümü temsil eden tam sayıların bir listesi verildiğinde, bu yüzleri aynı anda görmenin mümkün olup olmadığını belirleyen bir program veya işlev yazmaktır.

1 Tamam, belki bir çift gözle 4 veya 5 yüz görebilirsin, ama bu mücadelenin amacı için kalıbı tek bir noktadan gözlemliyoruz.


Kurallar:

  • Gönderiminiz giriş listesini alabilir:
    • Boş değil.
    • Sadece tatmin edici değerler içeriyor 1 ≤ n ≤ 6.
    • Hiçbir yinelenen öğe içermiyor.
  • Sen olabilir değil girişi sıralandığını varsayalım.
  • Başvurunuz bir truthy / falsy değeri vermelidir : truthy aynı zamanda yüzleri görülebilir, aksi takdirde sahte olabilir.
  • Bu , yani en kısa cevap (bayt cinsinden) kazanır!
  • Standart boşluklar varsayılan olarak yasaktır.

Test Kılıfları

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)


Son iki falsey vakasının gereksiz olduğu söyleniyor, çünkü üçten daha uzun bir liste karşıt değerler içerecek, değil mi?
Weckar E.

@WeckarE evet, açıkçası - cevaplara bakarsanız hepsi bundan yararlanır. Yazması daha kolay bir açıklamaydı.
FlipTack

@FlipTack Aslında uzunluğu kontrol etmeniz gerekmez, 3 öğeden daha uzun olan her listenin en az bir çift zıt kenarı vardır.
Outgolfer Erik

1
Işık dalgalarını kara delik gibi ağır bir
şeyle büktüyseniz

Yanıtlar:



14

JavaScript (ES6),  38 34 30 29  28 bayt

Herhangi bir sayıda ayrı parametre girişi alır. 0Veya döndürür 1.

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

Test durumları

Nasıl?

Aşağıda verilen parametrelerin sayılarına göre ana ifadenin versiyonlarını basitleştirilmiş, tanımlanmamış değişkenler birine coerced 0 veya yanlış :

# 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

Not : (a, b, c) sırasının önemi yoktur, çünkü her zaman birlikte XOR'lar.

En zor vaka 3'dür. Tüm olası kombinasyonları gösteren bir tablo:

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. sürüm # 1, 32 bayt

Diziyi girdi olarak alır. Bir boole döndürür.

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

Test durumları


Alt. sürüm # 2, Chrome / Firefox, 34 bayt

Bu, Chrome ve Firefox'un sıralama yöntemlerini kötüye kullanıyor. Edge ile çalışmıyor.

Dizi olarak girdi alır. 0Veya döndürür 1.

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

Test durumları


8

Haskell , 24 bayt

H.PWiz sayesinde -3 bayt.

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

Çevrimiçi deneyin!

açıklama

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

Aslında 8 bayt

;∙♂Σ7@cY

Çevrimiçi deneyin! (tüm test durumlarını çalıştırır)

Açıklama:

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


3

Retina , 21 20 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Düzenleme: @MartinEnder sayesinde 1 bayt kaydedildi. Açıklama:

O`.

Girişi sıralayın.

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

Bir çift karşı taraf olup olmadığını kontrol edin (yan yana 3 ve 4 sıralama). Bu geçersiz bir kalıp için 1, geçerli bir tane için 0 döndürür.

0

Mantıksal sonucu reddetmek.



2

Alice , 18 bayt

/..y1nr@ 
\iReA6o/

Çevrimiçi deneyin!

JabberwockyGeçerli girişleri yazdırır , başka bir şey yapmaz.

açıklama

Zikzak kontrol akışının açılması, program gerçekten sadece:

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 bayt

7αå_P

Çevrimiçi deneyin!

açıklama

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

Bunu 05AB1E'deki 5 baytta yapmanın çeşitli yollarından biri



1

Retina , 20 bayt

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

Çevrimiçi deneyin!

Neil'in yaklaşımına bir alternatif.

açıklama

T`_654`d

Çevirin 6, 5, 4içine 1, 2, 3sırasıyla.

M`(.).*\1

Tekrarlanan karakterleri bulmaya ve eşleşme sayısını saymaya çalış.

0

Sonucun sıfır olduğundan emin olun (etkili bir mantıksal olumsuzlama).



1

GNU sed , 37 22 + 1 = 23 bayt

-rBayrak için +1 bayt . Girdiyi basamak olarak alır; gerçeği için girdiyi basar ve0 .

@ Martininder sayesinde -10 bayt.

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

Çevrimiçi deneyin!

açıklama

@ MartinEnder'in Alice cevabı gibi .

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

Doğruluk için girişi tam olarak yazdırmaz, girişi 6-4 ile değiştirilen 1-3 ile yazdırır.
Andrew, Monica 19

1

Perl 6 , 18 bayt

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

Çevrimiçi deneyin!

1 & 6 | 2 & 5 | 3 & 4bir bağlantı sayı 1 ve 6, ya da sayı 2 ve 5 ya da numaraları 3 ve 4 Bu bağlantı (bir elemandır ibarettir ) giriş listesi *, içerdiği, 1 ile 6 ya da 2 ve 5 veya 3 ve 4. Bu sonuç !gerekli boolean değerini elde etmek için ( ) ile negatiflenir.


0

Haskell, 46 41 37 bayt

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

Listenin Kartezyen ürününü kendisi ile birlikte alır, daha sonra sonuçta elde edilen listelerin toplamının 7'ye toplanıp toplanmadığını kontrol eder. Herhangi biri "



0

IBM / Lotus Notes Formülü, 7 bayt

!7-i*=i

Çok değerli bir sayı alanından girdi alır i.

Tekrarlı olarak i'nin her bir değerini 7'den çıkarır ve orijinal listede olup olmadığını kontrol eder. ! 0 ise 1 değerini değiştirir (yüzlerin tümü görünemez).

Test Durumları (Notes Formülü için TIO mevcut değildir)

enter image description here


0

Temiz , 49 bayt

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

Çevrimiçi deneyin!


1
@StephenLeppik Bu cevabın mutlaka bilgi depolamak için dosya adını kullandığını sanmıyorum .
Steadybox

@StephenLeppik Ah orada adil nokta, ithalat gereklidir, ancak fonksiyonun belirli bir modülde bildirilmesi gerekmez. Teşekkürler.
Büyük

0

Swift , 46 bayt

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

Girişi [Int](integer array) olarak alır ve bir Bool(boolean) döndürür .

Kısa Açıklama (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 bayt

-9 baytlık kullanımın farkına vardım çünkü reduced gereksiz

-8 bayt kullanarak değiştirerek reduce kullanaraksome

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

Bunu diğer cevapların kullandığı numaralara bakmadan yazmayı denedim. Bunu daha sonra geliştirebilirim.

İade truegerçek vakalar için, falseherhangi bir tarafın 7 Özetle eğer ve nilkenar sayısı yasadışı olup olmadığını.


(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])))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.