ASCII'de zar sonuçlarını çizme


25

ASCII'de küp şeklinde bir kalıpla yapılırsa zar atmanın rastgele sonucunu gösterin.

$ dice

biriyle sonuçlanmalı

-----
|   |
| o |
|   |
-----

-----
|o  |
|   |
|  o|
-----

-----
|o  |
| o |
|  o|
-----

-----
|o o|
|   |
|o o|
-----

-----
|o o|
| o |
|o o|
-----

-----
|o o|
|o o|
|o o|
-----

4
Metriği burada tanımlamamışsınız. Bunun bir kod golfü olması mı gerekiyor? Yapılmadan önce bu tür soruları ele alabilmeniz için bulmaca laboratuarı sohbetindeki veya meta'daki kum kutusundaki olası görevleri tartışmaya değer .
dmckee

Maalesef, metriğin her zaman karakter sayısı olduğunu düşündüm. Beni sohbete yönlendirdiğin için teşekkür ederim, sonra da meta'yu zımparala. Bu soru üzerine düz düşerse o zaman onu silerim. Şu anda yapmaktan nefret ediyorum, sadece birisi üzerinde çalışmaya başlamış olması durumunda.
Jonas Elfström

Ah ... "Programming puzzles ve code golf" site adını not edin (ve evet, ben de tam tersi şekilde daha iyi tarandığını düşündüm). Ayrıca birincileri , tepenin kralı turnuvalarını ve kod zorluklarını da bulacaksınız (diğer her şey, ama yine de kazanmak için nesnel bir metrik oluşturmanız gerekiyor ), bu nedenle uygun olanı söylemeniz ve uygulamanız gerekir. etiket.
dmckee

13
Göre XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');doğru bir programdır.
JiminP

9
Ascii-art etiketini kaldırırsanız, 39char-solution print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art) ürünümü sunabilirim .
kullanıcı bilinmeyen

Yanıtlar:


7

Golf Betiği, 56 karakter

"-"5*n"|":|"o "1/:&6rand:§1<=" "&§3<=|n|&§5<=]&§2%=1$-1%

Çözüm burada test edilebilir .


25

Python, 112 karakter

from random import*
r=randrange(6)
C='o '
s='-----\n|'+C[r<1]+' '+C[r<3]+'|\n|'+C[r<5]
print s+C[r&1]+s[::-1]

6
Dizi indeksleyicideki karşılaştırmalar tamamen etkileyici!
Jonas Elfström

2
Aynen! Kalıbın simetrisini de nasıl kullandığınız hoşuma gidiyor :)
System Down

Gibi bir şey kullanır id(0)%7%6mısın? Tekdüze bir dağıtım olmayacak, fakat çok daha kısa ...
Nabb

@ Nabb: Bu çok rastgele değil. Özellikle, genellikle koşmadan koşuya aynıdır, bu nedenle rastgele zar atmak için çok faydalı olmaz.
Keith Randall

11

Yakut 1.9, 80 84 karakter

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse

+s.reverse
Jonas Elfström

7

Windows PowerShell, 89 93 96 97 101 119 karakter

-join('-----
|{0} {1}|
|{2}{3}'-f'o '[$(!($x=random 6);$x-lt3;$x-ne5;$x%2)])[0..14+13..0]

5

Python, 109 unicode karakter

#coding:u8
print u"鱸헓ȅ᪮ԅ᪅餠☏汁끝鐸즪聗K糉툜㣹뫡燳闣≆뤀⩚".encode("u16")[2:].decode("zlib").split("\n\n")[id(list())%7-1]

Not: Bu rasgele işlev kullanmaz, bu yüzden diğerlerinin yaptığı kadar rasgele olmayacaktır.


5

Perl, 74 karakter

İle koş perl -M5.010.

$-=rand 6;$_="-----
|0 2|
|4";s/\d/$->$&?o:$"/ge;say$_,$-&1?$":o,~~reverse

(Listedeki yeni satırların dizenin bir parçası olduğunu ve yalnızca okunabilirlik için eklenmemiş olduğunu unutmayın.)

$->$İşlemin ne yaptığını merak ediyorsanız , aşağıdaki okuma notları yardımcı olabilir:

  • Değişken $-otomatik olarak atanmış değerini bir tamsayıya keser.

  • Değişken $", tek bir boşluğa önceden ayarlanmıştır.

  • obir korkaktır (temsil eder "o").


4

İlk kez golfçü

Python, 161 karakter

from random import*
n=randint(1,7)    
o,x='o '
a='-'*5
b=(x,o)[n>3]
d=(x,o)[n>5]
c=(x,o)[n>1]    
print a+'\n|'+c+x+b+'|\n|'+d+(x,o)[n%2]+d+'|\n|'+b+x+c+'|\n'+a

4

Ortak Lisp 170

(let*((r(random 6))(a "-----
|")(c "o")(d " ")(e "|
|")(f(concatenate 'string a(if(< r 1)d c)d(if(< r 3)d c)e(if(> r 4)c ))))(concatenate 'string f(if(evenp r)c d)(reverse f)))

Yeni satırların önemli olduğunu unutmayın. Bu aptalca "modern" dillerin aksine, Common Lisp özlü olma konusunda okunabilirliği destekliyor, bu yüzden hantal bir "birleştirilmiş" string ... "yapısına sahibiz ve bir karakterdeki karaktere referans vermenin özlü bir yolu yok.


4

JavaScript ( 169 168 141 137)

r=Math.random()*6|0;s='-----\n|'+(r>0?'o ':'  ')+(r>2?'o':' ')+'|\n|'+(r-5?' ':'o');alert(s+(r%2?' ':'o')+s.split('').reverse().join(''))

alertSabit genişlikli bir yazı tipi olmadığı için pek doğru görünmüyor , ancak doğru olduğundan emin olabilirsiniz veya bir <pre>etiket yayarak ve writeln:-) yaparak test edin

İspat: http://jsfiddle.net/d4YTn/3/ (yalnızca FF2 + gibi JS 1.7 uyumlu tarayıcılarda çalışır)

Kredi: Math@ minitech'ten kesilmiş numara ve @Keith'ten gelen baskı mantığı.

Düzenleme : Mathhile @minitech kaldır çünkü aslında daha uzun yaptı :-)

Düzenleme 2 : 17 karakter kaydedin. Zar simetrisinden yararlanmak için @ Keith'den ödünç al. Rasgele sayının int'ye dönüştürülmesini basitleştirmek için hile kullanın.

Düzenleme 3 : 1+Rasgele sayıyı 1-6'dan 0-5'e kaydırmak için kaldırın ve 2 karakter kaydedin. Sonuç olarak, ben de değiştirebilir r%2-1için r%2ve başka 2 karakter kaydedin.

Düzenleme 4 : jsfiddle tekrar çalışıyor. Güncellenmiş :-)


E4X! Ve Chrome'un desteklemeyeceğine inanamıyorum!
Ry

Heh, nihayet seni
yenerim

İki karakter, şimdi |0
hilenizi

Benim için Chrome'da çalışıyor.
pimvdb

4

JavaScript, 215 213 212 145 135

r=Math.random()*6|0;alert('-----\n|'+[r>2?'o o':r?'o  ':'   ',r%2?r>3?'o o':'   ':' o ',r>2?'o o':r?'  o':'   '].join('|\n|')+'|\n-----');

Beat mellamokb, ama orijinal çözümümü tamamen değiştirdim. Eğer iyi bakmak için bu istiyorsanız, Google Chrome ya da bir şey, değişim kullanmak alertiçin console.log, ve voilà.

Düzenleme: ödünç mellamokb'ın | 0 numara bazı karakterleri kurtarmak için.


@minitech: BTW, M=Mathçalmaya çalıştığım numara, aslında bir karakterden daha uzun
mellamokb

@ mellamokb: Biliyorum, aslen daha fazla kullanacağımı düşündüm ...
Ry

@minitech: İki karakterden tasarruf edebilirsiniz[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

1
@mellamokb: Hayır; sbir dizi. Yeniden başlatıp tekrar deneyeceğim.
Ry

@ minitech: İşte yine başlıyoruz :-) Rekabetin en iyi cevabının evrimi. Şimdi 137'ye düştüm, fakat numaralarımdan birini ödünç alabilir ve muhtemelen 10 karakter kazanabilirsiniz.
mellamokb

3

PHP 119 126 128 131 188 201 213 234 239

<?$c=($r=rand()%6)%2?$r>4?'o ':'  ':' o';$b=$r>0?$r<3?'o  ':'o o':'   ';echo$a="-----\n|$b|\n|$c",substr(strrev($a),1);

Kapanma ?>2 karakterden tasarruf edilerek ihmal edilebilir.
Ry

İçin bildirimi satır içi, $rbaşka bir karakter kaydederek yapabilirsiniz . Sonra echoda boşluk bırakılabilir. Siz de başlangıç $adurumuna getirerek sizi 128'e getirebilirsiniz. Satır koymak, onlardan kaçmak yerine doğrudan dizgeye kesilir \n, sonra iki karakter daha kaydedilir.
Joey,

3

C - 215

#include <time.h>
#include <stdlib.h>
main(){char a[]=A,b[]=B,c=3,d=(srand(time(0)),rand()%6+1),e=d-2;if(d==1)a[5]=C;else{while(--e>-1)a[b[D[d-3]-48+e]-48]=C;a[0]=a[10]=C;}p(E);while(--c>-1)p("|%s|\n",a+c*4);p(E);}

İle derler:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c

1
Bu sorta komut satırındaki bütün bayraklarla hile yapıyor mu? Anlamıyorum / DA / DB / DC .. şey.
mellamokb

Derleyicim /Danahtarı anlamıyor ... Lütfen derleme komutuna rasgele tanımları koyarak hile yapmayın.
FUZxxl

3

Python 133

import random as R
i=R.randint(1,6)
a='   ';b='0 0'
A='-----\n|'+((a,'0  ')[i>1],b)[i>3]+'|\n|'
print A+((a,' 0 ')[i%2],b)[i>5]+A[::-1]

3

F # - 165 161 karakter

(System.Random()).Next 6|>fun x->[for y in[x>0;x%2=0;x>2;x=5]->if y then"o"else" "]|>fun[a;b;c;d]->printf"-----\n|%s %s|\n|%s%s%s|\n|%s %s|\n-----"a c d b d c a

3

Python 108 114 119 121 122 129

o ne lan! 1. çözüm gibi görünüyor? ama ben değilim ... dolandırıcı

108

import random as R
i=R.randint(1,6)
X=' 0'
A='-----\n|%s %s|\n|'%(X[i>1],X[i>3])+X[i>5]
print A+X[i%2]+A[::-1]

119

import random as R
i=R.randint(1,6)
X=' 0';a=X[i>5]
A='-----\n|%s %s|\n|%s|'%(X[i>1],X[i>3],a+X[i%2]+a)
print A+A[-6::-1]

3

Perl - 111 103 101

$n=int rand 6;
($t="-----\n|0 1|\n|232|\n|1 0|\n-----\n")=~s/(\d)/5639742>>6*$1>>$n&1?o:$"/eg;
die$t;

1
/dieprintsay
mbx

3

APL (69)

5 5⍴(5⍴'-'),{⊃⍵↓' o|'}¨2,(⌽M),2,2,(N∊¨6(1 3 5)6),2,2,2,⍨M←3 6 1>⍨N←?6

3

Haskell, 154 162 167 172 karakter

import System.Random
main=randomRIO(1::Int,6)>>=putStrLn. \x->let{h="-----\n|"++c(>1):' ':c(>3):"|\n|"++[c(>5)];c f|f x='o'|True=' '}in h++c odd:reverse h

Python ile kabaca aynı fikri kullanıyor.

Okunabilir sürüm:

import System.Random

main = do
    x <- randomRIO (1 :: Int, 6)
    putStrLn (render x)

render x = str ++ check odd ++ reverse str
  where
    str = concat
        [ "-----\n|"
        , check (> 1)
        , " "
        , check (> 3)
        , "|\n|"
        , check (> 5)
        ]
    check f = if f x then "o" else " "


2

PHP 126 127 179

<?$x=($r=rand(1,6))>3?"o o":($r<2?"   ":"o  ");$z=$r>5?"o o":($r%2==0?"   ":" o ");$v="-----\n|$x|\n";echo"$v|$z|".strrev($v);

Başka bir PHP çözümü. Oleg tarafından neredeyse aynı çözüme geldim.


2

Python (153)

Bu şu ana kadarki en küçük gönderim değil, sadece güzel göründüğünü düşündüm :)

import random as r
print"""-----
|%c %c|
|%c%c%c|
|%c %c|
-----"""%tuple(
r.choice([
"   o   ",
"o     o",
"o  o  o",
"oo   oo",
"oo o oo",
"ooo ooo"]))

2

S (120 karakter)

dice:{(`t`e`l`c`r`w!5 cut"-----|   ||o  || o ||  o||o o|")(,/)(`t;(`e`c`e;`l`e`r;`l`c`r;`w`e`w;`w`c`w;`w`w`w)(*)1?6;`t)}

Kullanımı:

dice[]

2

C 168 164 163 karakter

Partiye biraz geç kaldığım için üzgünüm, ancak henüz bir cevap alınmadığından ve diğer tek C çözümü biraz daha uzun sürdüğü için, işte bu ...

#include<stdio.h>
main(){srand(time(0));char*o="O ",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf("-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n",i,j,k,o[r&1],k,j,i);}

İçeriği kaldırabilir ve başka 18 karakter kaydedebilirsiniz, ancak sonra uyarılar olmadan derlenmez.

Düzenleme : user23241 komut satırı hilesi
kullanarak , sonuç üreten en kısa C kodu (derleyici uyarıları olmadan) sadece 12 karakterdir:

#include I
M

En azından aldatmak ve derlemek için aşağıdaki komut satırını kullanırsanız:

gcc -DI="<stdio.h>" -DM="main(){srand(time(0));char*o=\"O \",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf(\"-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n\",i,j,k,o[r&1],k,j,i);}" dice.c -o dice

2

c, 140 karakter

r,i,s;main(){srand(time(i=0));r=rand()%6;for(s=-1;i-=s;)putchar("\n|   |-o"[i>5?i==8&&r||i==10&&2<r||i==14&&4<r||i==15&&(s=1)&~r?7:i%6:6]);}

1

PHP: 1284

Bu benim ikinci CodeGolf'um ve kod mutabilitesi kadar kıskançlığı hedef alıp oyun kriterleri ile eşleştirmiyordum.

4 taraflı zarın yanı sıra 6 taraflı da oluşturabilirsiniz.

Belki daha sonra onu kısaltacağım ve biraz daha dinamik hale getireceğim.

function draw_dice($numdice=1,$sides=4)
{
/* Verify acceptable parameters. */
if($sides<4){die("You must choose 4 sides or greater.");}
if($numdice<1){die("You must have at least one dice.");}
/* End verification */
$a=' ';
$b=' ';
$c=' ';
$d=' ';
$e=' ';
$f=' ';
$g=' ';
$h=' ';
$i=' ';
$j=' ';

switch($sides)
{
case $sides%2==0:
if($sides==4)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$j="o";
break;
case 3:
$b="o";
$g="o";
$j="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$j="o";
break;
}
echo "<div style='text-align:center;display:inline-block;'>";
echo " - <br/>";
echo "| |<br/>";
echo "|$a$b$c|<br/>";
echo "| $d$e$f |<br/>";
echo "|  $g$h$i$j  |<br/>";
echo "---------<br/>";
echo "</div>";

}

if($sides==6)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$i="o";
break;
case 3:
$a="o";
$i="o";
$e="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$i="o";
break;
case 5:
$a="o";
$c="o";
$g="o";
$i="o";
$e="o";
break;
case 6:
$a="o";
$c="o";
$d="o";
$f="o";
$g="o";
$i="o";
break;
}
echo "-----<br/>";
echo "|$a$b$c|<br/>";
echo "|$d$e$f|<br/>";
echo "|$g$h$i|<br/>";
echo "-----<br/>";
}

if($sides!==4&&$sides!==6)
{
die("Only 4 and 6 sided are supported at this time.");
}

break;

case $sides%2==1:
die("Must have even number of sides.");
break;
}

}

draw_dice(1,4);

Çıktı 4 taraflı:

    - 
   | |
  |o o|
 |     |
|  o  o  |
---------

Çıktı 6 taraflı:

-----
|o  |
| o |
|  o|
-----

1

JavaScript 220 bayt

r=(1+Math.random()*6|0).toString(2).split("").reverse();b=r[1];c=r[2];s=[[b|c,0,c],[b&c,1&r[0],b&c],[c,0,b|c]];"-----\n|"+s.map(function(v){return v.map(function(w){return w?"o":" "}).join("")}).join("|\n|")+"|\n-----";

1

Ruby, 134 132 119 118 117 112 111 karakter,

Hayattaki ikinci golfüm. Sihir numaralarını kullandım. Herhangi bir tavsiye lütfen?

r=?-*5+"
|"+((a=:ghklm[rand 6])?a.to_i(36).to_s(2).tr("10","o "):"    o").insert(3,"|
|")
$><<r+r[0,14].reverse

Çıktılar:

ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|   |
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|o o|
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|   |
| o |
|   |
-----
ice@distantstar ~/virt % 

1

VimScript - 169 karakter

Vim'in yerleşik rasgele sayı üreteci olmadığından, bunun saf Vim olmadığını unutmayın. Elbette indirilebilecek uzantılar var, ama Linux gibi bir adam olduğum için, neden sadece kabuk ortamına güvenmediğini düşündüm.

kod

norm5a-^[YPo|   |^[YPP
let x=system('echo $RANDOM')%6+1
if x<2
norm jllro
el
norm lrolljj.k
if x>3
norm k.hjj
en
if x>2
norm h.k
en
if x>5
norm .l
en
if x>4
norm l.
en
en

açıklama

  • İlk satır jeneratörleri, kalıbı temsil eden "kutu" yu oluşturur.
  • İkinci satır çevreden rastgele bir sayı alır ve modüler aritmetik kullanarak onu zar için geçerli bir sayı olarak zorlar.
  • Kalan çizgiler, kalıp yüzü çevresinde hareket ederek kalıpları doldurur o. Bunun en az sayıda hareket için değil, en az sayıda hareket için değil, en az sayıda hareket için değil, yani el ile yapıyor olsaydım ( ifkafamın içinde hepsini yapmam durumunda) tuş vuruşlarında daha hızlı yollar olacağını unutmayın ).
  • Her zaman ^olduğu gibi, değişmez ^değil, bir kaçış dizisinin bir göstergesidir.

Test yapmak

Değişim RANDOMiçin DICEVALUE, içine VimScript kodu kaydetme dice.vim, o zaman testine istediğiniz her türlü numaralar argüman olarak vererek, üzerinde bu kabuk komut dosyasını çalıştırın:

#!/bin/sh
for DICEVALUE in $@; do
    export DICEVALUE
    vim -S dice.vim
done

1

Mathematica 166 161 146 143 karakter

a="O  ";b=" O ";c="  O";d="   ";e="O O";RandomInteger@{1, 6}/.Thread@Rule[Range@6,{{d,b,d},{a,d,c},{a,b,c},{e,d,e},{e,b,e}, {e,e,e}}]//MatrixForm

Örnek çıktı:

beş


Matris parantez rencide varsa, yerine geçebilir MatrixFormile TableFormkodunda.


1

PHP 5.4, 107 bayt

<?$r=rand(1,6);$d=[' ','o'];$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

102 bayt *

<?$r=rand(1,6);$d=' o';$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

** Ne yazık ki, 102 bayt versiyonu sorunları nedeniyle dökümüne fark booletmek intdize dizine eklerken $d. Bunun dışında iyi çalışıyor. *


Bayt sayısı sırasıyla 105 ve 100 gibi görünüyor.
12

Ah, yeni hatları hesaplamış olmalıyım.
Dan Lugg,
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.