Yan görünümden zar değerini belirle


52

Zarların sol ve sağ değerlerini tamsayılar (1-6) olarak alacak ve en üste geri döndürecek programı veya işlevi yazın.

Zar düzeni:

    +---+
    | 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
    | 6 |
    +---+

  ,^.
<´ 5 `>  <-- Top value
|`._,´|
.6 | 4,  <-- Side values
 `.|,´

Böylece giriş 6 4geri dönecektir 5.

Sipariş önemlidir:

2 3 -> 1
3 2 -> 6

Program geçersiz girdi değerleri ile çalışmak zorunda değildir.

Belirgin yaklaşımı engellemek için (tüm kombinasyonların bulunduğu tabloyu kullanarak), herhangi bir yerleşik metin kodlaması veya sıkıştırma rutinini veya temel kodlamayı veya boyutu küçültmeye benzer herhangi bir şeyi kullanmaya izin verilmez. Tablonun kullanılmasına hala izin verildiğine ve bazı hazır kütüphane işlevlerinin kullanılmadığı sürece, kendi dekompresyonunuza yuvarlanmaya izin verildiğini unutmayın.

Referans amacıyla, tüm kombinasyonların bir tablosu (yani, tüm olası giriş ve çıkışlar):

23, 35, 42, 54 -> 1
14, 31, 46, 63 -> 2
12, 26, 51, 65 -> 3
15, 21, 56, 62 -> 4
13, 36, 41, 64 -> 5
24, 32, 45, 53 -> 6

En kısa kod kazanır ve standart boşluklar uygulanır.


bu yüzden tüm kombinasyon ile bir tabloyu kullanabilirim - 1 ^^?
dwana

Evet, masa kullanabilirsiniz. Ancak, daha küçük hale getirmek için yerleşik sıkıştırma yordamlarını kullanamazsınız.
user694733

Yanıtlar:


59

Python, 30

lambda a,b:a^b^7*(2<a*a*b%7<5)

Arama yok, sadece biraz dayak.

Karşıt yüzler, birbirlerinin üç bitlik tamamlayıcıları olan çiftler halinde gelir;

1,6
2,5
3,4

Bir setten iki yüz verildiğinde, diğer setten bir yüz elde etmek istiyoruz. Çünkü (1,2,3)bunu XOR ( ^) ile yapabiliriz . Yani, ^üç bit tamamlayıcıya kadar doğru cevabı verir, anlam x^7. Koşullu olarak tamamlayabiliriz x^7*_.

Tamamlayıcıyı alıp almayacağınıza karar vermek için (7'li XOR), üçlünün sağ kuralı ihlal edip etmediğini kontrol ederiz. Bunun anlamı, a,bters çevrimli sırasına göre

1,6
2,5
3,4

her çizgiyi üç kategoriden biri olarak ele almak. Her satırdaki unsurlar mod 7 negatif olduğundan, bunları yaparak "karıştırabiliriz" x*x%7.

1,6 -> 1
2,5 -> 4
3,4 -> 2

Her satır 4 modülo 7 ile çarpılarak döngüsel bir önceki elde edilir, bu yüzden bu ilişkinin geçerli olup olmadığı kontrol edebilirsiniz (b,a)tamamlayacak karar vermek: a*a%7==b*b*4%7.

Bu, modulo 7'nin a**2 * b**(-2)eşit olup olmadığını kontrol etmeye eşdeğerdir 4. Yana b**6eşit 1modulo 6, bu eşdeğerdir a**2 * b**4. Diğer olası değer 2 olduğundan (durumları kontrol ederek), 3'ü karşılaştırarak 4 olup olmadığını kontrol edebiliriz.


CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
Doktor

min(a,7-a)Yaparak bir karakterden tasarruf edebilirim a^7*(a>3), ancak daha kısa bir yol olması gerektiğini hissediyorum. Herhangi bir fikir?
XNOR

Ooh, orada a/4*7^a...
XNOR

11
Zar yüz bitlerinin bu özelliğe sahip olduğunu asla anlamadım. Güzel!
user694733

1
@ user694733 Şaşırtıcı bir şekilde çalışıyor ki 6 iki gücün altında iki.
XNOR

64

A ve b iki tarafına verilen üçüncü taraf için güzel bir polinom ifade modulo 7 var .

3(a3bab3)mod7

veya faktörlü

3ab(a2b2)mod7

Modulo 7, {0,1,2,3,4,5,6} 'da bir geri kalanı eşler.

Neden bu Matematik SE cevabında işe yaradığını açıklıyorum , ancak muhtemelen eksik olan daha temiz bir argüman olduğunu düşünüyorum. Çalışan tek diğer iki dönem polinomudur.

(3a5b5a3b)mod7

başlangıçta bit bodrumumu aritmetik işlemlere dönüştürerek bulduğumda, daha güzel olanı bulmak için bu formdaki polinomlar üzerinde kaba bir kuvvet araştırması yaptı.

Lütfen bu portları favori dilinize eklemek için çekinmeyin; bu bir CW yazısıdır.

J, 9 Synthetica tarafından

7|3***+*-

Benim Bkz yazı

Dyalog APL, 9 by ngn (yazım hatası)

7|3×××+×-

J cevabından açıkça çalındı.

Tim-Tech tarafından TI-Basic, 14

7fPart((A³B-AB³)/21

Pyth, 16 FryAmTheEggman tarafından

M%*3-*H^G3*^H3G7

gİki değerin bir fonksiyonunu tanımlar .

Golfscript, 18 Peter Taylor tarafından (eski polinom)

~1$*.5?3*@.*@*- 7%

CJam, 18 Martin Büttner (Peter'in GolfScript portundan) (eski polinom)

l~1$*_5#3*@_*@*m7%

Mathematica, 20 Martin Büttner tarafından

Mod[+##(#-#2)3##,7]&

Evet, bu bir sıradan artı, ve hayır, sıradan bir artı kullanmayan daha kısa bir yol yok.

dc, 21 Toby Speight tarafından

sb7+d3^lb*rlb3^*-3*7%

aFarkın daima pozitif olmasını sağlamak için 7 eklemeliyim (dc'nin imzalı bir %operatörü var).

Julia, 24 23, Martin Büttner tarafından

f(a,b)=3a*b*(a^2-b^2)%7

CoffeeScript, 28 26 tarafından rink.attendant.6

x=(a,b)->3*a*b*(a*a-b*b)%7

JavaScript (ES6), 28 26 rink.attendant tarafından

x=(a,b)=>3*a*b*(a*a-b*b)%7

Esas olarak, CoffeeScript ile aynı.

Python 28, xnor tarafından

lambda a,b:3*a*b*(a*a-b*b)%7

Bash, 31

Özel birşey yok:

echo $[3*($1**3*$2-$1*$2**3)%7]

Veya alternatif olarak:

echo $[3*$1*$2*($1*$1-$2*$2)%7]

Başka (daha uzun ama belki de ilginç) bir yaklaşım .

Nim, 36 Sillesta tarafından

proc(x,y:int):int=3*x*y*(x*x-y*y)%%7

Java 7, 46 44 rink.attendant tarafından

int f(int a,int b){return(a*a-b*b)*a*b*3%7;}

Java 8, 25 23, Kevin Cruijssen tarafından

a->b->(a*a-b*b)*a*b*3%7

PHP, 49 47 ile rink.attendant.6

function x($a,$b){echo($a*$a-$b*$b)*3*$a*$b%7;}

Toplu, 52 unclemeat

set/aa=(3*(%1*%1*%1*%2-%1*%2*%2*%2)%%7+7)%%7
echo %a%

CMD doğal olarak gerçek modülü desteklemiyor (bu nedenle negatif sayıları kaldıramaz) - dolayısıyla %%7+7)%%7.

LESS ( parametrik bir karışım olarak ), rinkatçı tarafından 62 60

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a-@b*@b),7);content:~"'@{r}'"}

Benim Bkz aşağıda yazılan .

05AB1E, 10 8 Emigna tarafından (Kevin Cruijssen tarafından -2 bayt)

nÆs`3P7%

Çevrimiçi deneyin.

Haskell, 31 27 25 Genel Görünen Ad

a#b=3*a*b*(a*a-b*b)`mod`7

Çevrimiçi deneyin!

Excel, 27, Wernisch tarafından

=MOD(3*(A1^3*B1-A1*B1^3),7)

Excel VBA, 25 Taylor Scott tarafından

?3*[A1^3*B1-A1*B1^3]Mod 7

İleri (gforth) 41 reffu tarafından

: f 2>r 2r@ * 2r@ + 2r> - 3 * * * 7 mod ;

Çevrimiçi deneyin!

C #, 23 Kevin Cruijssen tarafından

a=>b=>(a*a-b*b)*a*b*3%7

1
FWIW, (ab)**5 % 7 == (ab)**-1 % 7 == a^b^7herkes için a, biçinde 1..6öyle ki a != bve a+b != 7.
Peter Taylor,

@PeterTaylor Gerçekten de, kullanarak bu ifade bulunan **5modulo 7. ters çevrilmesi için bir vekil olarak
XNOR

2
Bu şaşırtıcı polinomun "nedeni" yüzünden uykumu kaybediyorum. Belki matematik.SE millet yardımcı olabilir. math.stackexchange.com/questions/1101870/…
Dijital Travma

1
Matematiğe türev yazdım.SE: math.stackexchange.com/a/1101984/24654
xnor

1
APL trenini şu şekilde açık bir şekilde yeniden yazabilirsiniz 7|3×××+×-: 7 ürünün geri kalanı toplamın çarpı çarpı çarpımının iki katıdır (iki sayı arasında).
ta 17:15

9

CJam, 43 28 bayt

Tam bir masa tabanlı yaklaşımın daha kısa süreceği konusunda hiçbir fikrim yok, ama işte şöyle:

l_~^56213641532453s@S-#)g7*^

Gibi giriş

2 3

Çıktı:

1

Bu, iki yüzün doğru yüzünü ve xnor'ın xors yaklaşımını belirlemek için önceki algoritmamın bir karışımı.

Burada çevrimiçi deneyin


Bunun nasıl çalıştığını açıklayabilir misiniz? Ep1024'ün sahip olduğu fikir aynı mı?
user694733 08:15

@ user694733 hiç de değil. Açıklama eklendi.
Doktor

Evet, zamanı gördüm. Sadece bunun benzer olup olmadığını merak ediyordum, çünkü bunun hakkında bir açıklaması vardı ve CJam'ın nasıl çalıştığı hakkında hiçbir fikrim yoktu.
user694733 08:15

@Optimizer Ben de CJam'a başlamak istiyorum, bana öğreticiler vb. Bazı örnekler görüyorum ama hiçbir açıklamaları yok :(
Teun Pronk

Yukarıdaki linke bazı örnekler ve dil anahtar kelimelerinin açıklamalarını içeren ana web sitesine bir link verilmiştir. Bunun dışında, mevcut cevaplardan öğrenmek için burada cjam anahtar kelimesi ile arama yapın.
Doktor

5

Az, 62 bayt

Algoritmayı kullanır bu yazı :

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a+6*@b*@b),7);content:~"'@{r}'"}

Tamsayı değeri kullanılırsa daha kısa olabilirdi, ancak göstermesini sağlamak için değişken enterpolasyoncontent gerektiren CSS özelliğini kullanmam gerekiyordu .

Bununla birlikte, kod golfü için bir CSS önişlemci dilinin kullanılması sık sık değildir!

Bazı HTML ile kullanmak için şunu yapardınız:

p::after { .x(1, 3); }
<p>Number on top: </p>

4

Pyth, 30 bayt

K"23542 31463 12651 "h/x+K_Kz6

İki rakamı girdi olarak gerektirir, aralarında boşluk yoktur (örn. 23Değil 2 3).

Açıklama:

İçinde kalan iki basamaklı dizilim , üstteki 23542iki tarafı temsil eder 1. Aynı şekilde, 314632 kişilik, vb bu dizeyi Geri için dizilerini verir 4through 6.

Bu kod sadece dizgede bir arama yapar "23542 31463 12651 15621 36413 24532", dizini 6'ya böler ve üst kısmın ne olacağını belirlemek için artışları yapar.

Burada çevrimiçi test edin.

Bu golf ile ilgili ipuçları için @FryAmTheEggman'a teşekkürler.


Bazı pyth ile ilgili golf: J"23542 31463 12651 "h/x+J_Jscz)6Bazı kafa karıştırıcı ise beni ping. Tercih Kve Jatama değerleri için, htekli olan +1, sdizeleri listesi olduğu üzerinde jk. (Ayrıca, izin verildiyse 23, girişin en iyi olacağı şekilde sadece bir dize kullanmak )
FryAmTheEggman

3

Farklı bir arama dizesiyle es1024'e benzer bir yaklaşım izler:

JavaScript (ES6), 73 72 61 bayt

t=(l,r)=>-~('354233146312651215623641332453'.search([l]+r)/5)

JavaScript (ES5), 88 87 77 bayt

function t(l,r){return -~('354233146312651215623641332453'.indexOf([l]+r)/5)}

CoffeeScript, 71 62 bayt

Ve sadece eğlenmek için, kod parantezlerin izin verilmemesi nedeniyle ES6 olarak CoffeeScript'te 1 bayt daha kısa

-~Hile kullanımı nedeniyle , bu ES6 ile aynı sayıda karakter olduğu ortaya çıktı.

t=(l,r)->-~('354233146312651215623641332453'.indexOf([l]+r)/5)

1
1 bayttan ''+l+r[l]+r
tasarruf edin

@ edc65 Teşekkürler! Oh, farklı türler eklerken JavaScript nasıl davranır
rink.attendant.6 10

1
Evet, operatör + garip. Peki ya operatör ~? 1+Math.floor=> -~. Ayrıca indexOf yerine arama yapın.
edc65

İlginç. Ve biliyordum searchama bu sadece ES6 için.
rink.attendant.6

Aslında String.prototype.searchECMAScript 3rd Edition’dan bu yana JavaScript’in bir parçası olduğu için cevabınızı değiştirebilirsiniz. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
kamoroso94

3

J (9)

Dan algoritması kullanır bu yazı.

7|3***+*-

İşlevin ağaç grafiği (bazı şeyleri temizleyebilir):

    f=:7|3***+*-
    f
7 | 3 * * * + * -
   5 !: 4 < 'f'
  ┌─ 7            
  ├─ |            
──┤   ┌─ 3        
  │   ├─ *        
  └───┤   ┌─ *    
      │   ├─ *    
      └───┤   ┌─ +
          └───┼─ *
              └─ -

gösteri:

   3 f 5
1
   4 f 6
2
   2 f 6
3
   2 f 1
4
   1 f 2
3
   4 f 5
6

0

PHP, 81 bayt

JavaScript çözümümle aynı:

function t($l,$r){echo(int)(1+strpos('354233146312651215623641332453',$l.$r)/5);}

0

Lua 118

Bulamadığım bir hata nedeniyle son sürümü geri yüklemek zorunda kaldım, aramaya da zamanım olmadı.

z=io.read;o={"","","34","5 2","2165","46 13",""," 31064","  5612","   2 5","    43"}a=z();b=z();print(o[a+b]:sub(a,a))

Yine de bu konuda çalışıyor.


Bu test burada ve o dönmek gibi görünüyor 4ile 2 3.
user694733 08:15

Gerçekten .. garip. hasta içine bak.
Teun Pronk

@ user694733 Fixed :)
Teun Pronk

0

JavaScript (ES6), 79 bayt

En kısa değil ama cevaplarda şu anda farklı bir yaklaşım denedim.

f=(a,b)=>[a,b,7-a,7-b].reduce((p,v,i,r)=>p?p:'2312132'.indexOf([v]+r[i+1])+1,0)

0

Lua, 89 bayt

Xnor'ın Python çözümünün basit bir limanı.

x=require('bit32').bxor
function(a,b)c=a*a*b%7;return x(a,x(b,2<c and c<5 and 7 or 0))end

0

Bash, 85

Bu, @ xnor'in sihirli polinomuyla golf açısından rekabet etmez. Ancak bunun cevabı hesaplamanın başka ilginç bir yolu olduğunu düşünüyorum:

g(){
((d[$1$2]))||{
d[$1$2]=$3
g $2 $1 $[7-$3]
g $2 $3 $1
}
}
g 1 2 3
echo ${d[$1$2]}

Spesifik olarak zarlarla ilgili aşağıdakileri biliyoruz:

  • Sol yüz 1 ve sağ yüz 2 ise, üst yüz 3'tür.
  • Karşıt köşelerin etrafında 120 ° döndürmek, yüz değerlerinin üç katını verir. Örneğin, {l = 2, r = 3, t = 1} elde ettikten sonra {l = 1, r = 2, t = 3} döndürüyoruz ve tekrar döndüğümüzde {l = 3, r = 1, t = 2}
  • Karşıt yüzlerin toplamı daima 7'dir.

Yukarıdakileri özyinelemeyle birleştirerek ({1,2,3} bir başlangıç ​​noktası olarak kodlanmış kod kullanarak), tüm olası değerler için {l, r} -> t eşlemesinin tamamını oluşturabiliriz. Bu cevap, tam bir diziyi d [lr] = t olacak şekilde dolduran özyinelemeli bir g () işlevini tanımlar. Özyinelemeli fonksiyon başlangıçta {1,2,3} ile çağrılır ve ayarlanmamış başka dizi elemanı bulunmadıkça tüm küpün tamamını tekrarlar. Fonksiyon iki şekilde kendi kendine tekrarlanır:

  • l ve r değiştirilmiş ve t 7'den (zıt yüzler) çıkarılmış halde
  • {l, r, t} döndürülerek {r, t, l}

Daha sonra gereken değerlerin basit bir dizi araması yapar.


0

Dyalog APL , 9 bayt

Ɐɔıʇǝɥʇuʎs'in J çözümünün açık karakter ikamesi :

7|3×××+×-

Düzenleme: Daha sonra bu kesin çözümün 17 Ocak 15 tarihinde ngn tarafından önerildiğini fark ettim.

  the division remainder when divided by seven of
  |        three times
  |        | the product of the arguments
  |        |   times   \┌───┐
  |        |     \  ┌───┤ × 
┌────┐   ┌────┐   ┌─┴─┐ └───┘ ┌───┐
 7| ├───┤ 3× ├───┤ ×    ┌───┤ +  - the sum of the arguments
└────┘   └────┘   └─┬─┘ ┌─┴─┐ └───┘      
                    └───┤ ×  ---- times
                        └─┬─┘ ┌───┐
                          └───┤ -  - the difference between the arguments
                              └───┘

TryAPL çevrimiçi!


0

Julia, 26 bayt

f(a,b)=a$b$7*(2<a^2*b%7<5)

veya

f(a,b)=(3*a^5*b^5-a^3*b)%7

veya

f(a,b)=3*a*b*(a+b)*(a-b)%7


0

C # (Visual C # Etkileşimli Derleyici) , 49 bayt

x=>1+("3542331463126512156236413"+x).IndexOf(x)/5

Çevrimiçi deneyin!

@GB sayesinde -1 bayt!

Giriş, görünür sol ve sağ basamakları içeren 2 karakterli bir dizedir.

Aşağıda bağımsız bir şekilde bulduğum çözüm var. Arama dizgisini rink.attendant.6'nın JavaScript cevabından alarak, 5 bayt'ı tıraş etmeyi başardım (ancak şimdi cevaplarımız oldukça benzer;)

C # (Visual C # Etkileşimli Derleyici) , 55 bayt

x=>1+"42354 31463 51265 21562 41364 24532".IndexOf(x)/6

Çevrimiçi deneyin!


1
Dolu dizinin yerine ("3542331463126512156236413" + x) kullanarak 49 bayt
GB
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.