ASCII kalıbı döndür


16

Bu meydan okuma, rastgele bir die rulo bir ascii-sanat çıktı gerekir.

bunun gibi:

   ________
  /\       \
 /  \   6   \
{ 4  }-------}
 \  /   5   /
  \/_______/

Lütfen bunu not al:

   ________
  /\       \
 /  \   3   \
{ 4  }-------}
 \  /   5   /
  \/_______/

geçersiz çıktıdır, çünkü bu bir kalıpta olası bir sonuç değildir

6(faces that could be up)*4(faces that could be the left face after the top is determined)*1(faces that could be the right face after the other two are determined)Kalıp rulolarının = 24 olasılığı vardır .

Programınız, bu kalıp rulolarından birini, aşağıdaki gibi bir ascii sanatı biçiminde (aşağıdaki gibi modellenmiştir, xy ve zs sayılarla değiştirilmiştir) çıktılamalıdır, her çıktıda> 0 olma olasılığı vardır, ancak olasılıklar eşit olmak zorunda (gerçek hayatta aksine, hile zar olmalarına izin verilir). Programınız geçersiz bir kalıp rulosu veya kalıp olmayan rulo çıktısı alamaz. Programınız 1 geçerli bir rulo çıkarma olasılığına sahip olmalıdır

Lütfen kalıbınızın ilk resimde gösterildiği gibi sağ elle kullanılan bir kalıp olması gerekmediğini unutmayın. (sağ ve sol elle kalıbın ağını tanımlar)

right-handed die
   ________
  /\       \    net
 /  \   z   \     _|4|_ _
{ x  }-------}   |6|2|1|5|
 \  /   y   /      |3|
  \/_______/


left handed die
   ________
  /\       \    net
 /  \   y   \     _|3|_ _
{ x  }-------}   |6|2|1|5|
 \  /   z   /      |4|
  \/_______/

Kalıbınız solaksa, aşağıdakiler geçerli çıktıdır, ancak kalıbınız sağ elle ise:

   ________
  /\       \
 /  \   2   \
{ 1  }-------}
 \  /   3   /
  \/_______/

Sol elle veya sağ elle seçebilmenize rağmen, kalıbınızın tutarlı olması gerekir: soldan sağa veya tam tersi değişemez

aşağıda kalıp için geçerli çıktıların bir listesi bulunmaktadır. XYZ konumları için yukarıdaki resimlere bakın:

X-Y-Z
-----
5-4-1
1-5-4
4-1-5

5-6-4
4-5-6
6-4-5

5-3-6
6-5-3
3-6-5

5-1-3
3-5-1
1-3-5

2-6-3
3-2-6
6-3-2

2-4-6
6-2-4
4-6-2

2-1-4
4-2-1
1-4-2

2-3-1
1-2-3
3-1-2

yine bu , bu yüzden daha az bayt daha iyidir


4
Çözücüler , diğer ikisi verilen üçüncü kalıp yüzü için bir formülle ilgilenebilirler .
xnor

@xnor ve bu yüzden bu sorunun yinelenen güçlü bir argüman olduğunu düşünüyorum
Digital Trauma

1
Bu projeksiyonda bir küp çizmek için herhangi bir ASCII sanatı olduğunu bilmiyorum. Küçük boyutu ile, bir Python gibi dillerde kodlama daha iyi olup olmadığını bilmiyorum.
xnor


@xnor, içinde 7 ve 8 karakter dizisi olsa bile.
Jonathan Allan

Yanıtlar:


8

Python 3, 197196192 bayt

from random import*;c=choice;r=range(1,7);u=c(r);l=c(list(set(r)-{u,u^7}));print(r'''   ________
  /\       \
 /  \%4d   \
{ %d  }-------}
 \  /%4d   /
  \/_______/'''%(u,l,3*u*l*(u*u-l*l)%7))

İdeone üzerinde test edin

Sağ elimi (değiştirerek solak geçin u*uile l*lson satırında)

Yenmek için bağlı - ama zar iç çekelim olsun - özellikle çiğ ve eski okul biçimlendirme kullanmak dışında ASCII golf için tüm girişimler bayt kurtarmak başarısız oldu;
- memnuniyetle takdir n00b için başka golf ipuçları.


1
Sen kullanarak 1 byte kaydedebilirsiniz from random import*ve c=choice.
acrolith

@daHugLenny - şimdi daha önce beyaz boşluk özledim vermedi *; ta!
Jonathan Allan

1
PPCG'ye Hoşgeldiniz! Güzel ilk gönderi!
GamrCorps

Thanks @GamrCorps - Bir süredir bir şeyler yapmak için anlam taşıyordum ... şimdi temsilcim Korunan bir soruya anlamlı bir çözüm gönderebilirim ...: D
Jonathan Allan

2
Bunun yerine 3 boşluk olan ve daha sonra %dkullanmak %4dyerine ve sizin için düzgün ped bunu olacak. Kalıbın diğer kısımları için de kullanabilirsiniz.
Değer Mürekkebi

5

C 177

f(r){r=rand()%24;r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

Test programında

f(r){r=rand()%24;
r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;
printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

j;
main(){
    for(j=99;j--;puts(""))f();
}

açıklama

r=                    \\after calculation, assign to r (in order to use only one variable.)
(5545>>r%4*3&63       \\5545 is 12651 in octal. Select 2 digts for the equator
^256-(r*2&8))         \\if 4's bit of r is 0, prepend 4=256/64. Else prepend 3 and reverse one of the faces by xoring with 7. 256-8 = 248 = 3*64+7*8.
*513                  \\now we have a 3 digit octal number. duplicate all digits by multiplying by 1001 octal.
>>r/8*3               \\rightshift 0,1 or 2 digits to rotate. 

5

JavaScript 238 232 207 201 bayt

var r=24*Math.random()|0,o=r%3,b=r-o,v="123513653263154214624564";console.log(`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,v[r],v[b+(o+1)%3],v[b+(o+2)%3])

ki golf dinlenmediğinde:

var r = 24 * Math.random() | 0,
    o = r % 3,
    b = r - o,
    v = "123513653263154214624564";
console.log(
`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,

    v[r],
    v[b+(o+1)%3]
    ,v[b+(o+2)%3]
)

Algoritma

Bir kalıbın 8 köşe kesişiminin her birinde, kesişen kalıp yüzü değerlerinin sabit olduğunu, ancak 3 rotasyondan herhangi birinde görülebileceğini düşünün. Örneğin, "1", "2", "3" köşesine bakarken, kalıp "1", "2" veya "3" değerini göstermek için köşeden ve karşı köşeden bir eksen etrafında döndürülebilir. ASCII sanatının üstünde.

vsert, her köşede kesişen kalıp yüzlerini kodlar, brastgele bir köşenin başlangıcına bir ofsettir ve oköşe verileri içindeki dönüşün başlangıcıdır. ASCII resmi bir console.logbiçim dizesi kullanılarak konsola yazılır .


Muhtemelen `sürekli yazmak zorunda kalmadan yeni satır karakterlerinin kullanılmasına izin veren tırnak işaretlerini kullanarak birkaç bayt tıraş edebilirsiniz \n.
Neil

@Neil en takdir, iyi çalıştı. Ayrıca sondaki ';'
traktor53

4

TSQL 308 bayt

DECLARE @ char(87)=(SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x)PRINT @

280 bayt (Server Management Studio'da: Sorgu - metne sonuç)

SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x

Not: baskıyı ve deklarasyon parçasını çıkararak - ve sonucu doğrudan SELECT'ten çıkarın. Ancak bu kemanda işe yaramaz

Vaktini boşa harcamak


Belki ABS(a^3*b-a*b^3)4 bayt kaydetmek için değiştirebilirsiniz ? (Emin değilim - kemanda çalışıyor gibi görünüyor, ama bana sadece a, b, c = 5,1,3'lük tek bir rulo veriyor, bu yüzden yanlış olabilirim)
Jonathan Allan

@JonathanAllan yorumunuz için teşekkür ederiz. Üstel TSQL'de POWER (a, 3) olarak yazılmıştır. ^ Farklı bir anlamı var
t-clausen.dk

4

Javascript, 251 bayt

r="replace";a=()=>(0|Math.random()*6)+1;b=(x,y)=>3*x*y*(x*x+6*y*y)%7;u=()=>{x=a(),y=a();z=b(x,y);if(z==0)u();return"   ________\r\n  \/\\       \\\r\n \/  \\   1   \\\r\n{ 2  }-------}\r\n \\  \/   3   \/\r\n  \\\/_______\/"[r](1,x)[r](2,y)[r](3,z);}

u();
Bunu kullanarak arayın Uzun ama bu bir cevap ve ben uzun zamandır cevap vermedim.


İdeone'de çıktı testinin sol üst kısmında bir boşluk eksik .
Jonathan Allan

a=()=>(0|Math.random()*6)+1;8 kaydetmelidir
traktor53

3

Yakut, 150 bayt

Tüm dize biçimlendirme kötüye !!!

Son sayıyı elde eden formülün kredisi burada @xnor'a gider .

u=1+rand(6)
l=([*1..6]-[u,u^7]).sample
$><<'%11s
  /\%8s
 /  \%4d%4s
{ %d  }%s}
 \  /%4d%4s
  \/%s/'%[?_*8,?\\,u,?\\,l,?-*7,3*u*l*(u*u-l*l)%7,?/,?_*7]

Hayır - formül için kredi xnor'a gider
Jonathan Allan

@JonathanAllan beni uygun krediye yönlendirdiğin için teşekkürler. Her halükarda, bu cevabı nasıl biçimlendirdiğim, muhtemelen bayt kaydetmek için avantajınıza göre dize biçimlendirmesinden daha fazla yararlanabileceğinizi düşündüğümde daha çok aklımdaydı.
Değer Mürekkebi
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.