Випадкові наконечники кісток


14

У стандартних кубиках (гинуть) числа розташовані так, що протилежні грані додають до семи. Напишіть найкоротшу можливу програму на бажаній мові, яка виводить випадковий кидок з наступним 9 випадковими накидами. Перекидання - це чверть обороту кісток, наприклад, якщо кістка стоїть перед 5, усі можливі відливи 1,3,4 та 6.

Приклад бажаного виходу:

1532131356

Відповіді:


5

GolfScript, 26 символів

0{(.6,5@--\-.,rand=).}10*;

Трохи більш стислий варіант Джої , в основному, вирішує проблему з нульовою індексацією.


9

Рубі, 44

c=0;10.times{$><<c=([*1..6]-[c,7-c]).sample}

Я знайшов фокус [* 1..6] вдалим експериментом.


1
Деякі приємні трюки тут, чудові речі. Ударив себе по голові за відсутність зразка методу Array #.
Ларс Хагсет

4

JavaScript (71 символ)

Ви , можливо , запитаєте замінити printз alertабо що - то іншим, в залежності від середовища JavaScript.

for(C=L=T=0;C++<10;print(L=T))while(!(T-L&&T+L-7))T=Math.random()*6+1|0

об'єднайте петлі, умовно збільшуючи зовнішню, коли знайдено значення: для (b = n = 10; n; ab && a + b-7 && print (b = a, n -)) a = Math.random () * 6 + 1 | 0
imma


3

Баш

#/!bin/bash
f=`expr $RANDOM % 6` 
f=`expr $f + 1`
printf "$f"
for ((i=0; i<9; i++))
do
   ((bad=7-$f))
   next=`expr $RANDOM % 6`
   next=`expr $next + 1`
   while [ $next -eq $bad ] || [ $next -eq $f ]
   do
      next=`expr $RANDOM % 6`
      next=`expr $next + 1`
   done
printf "$next"
f=$next
done

зразок коду: http://ideone.com/CCfro


Використання ((var=expression))дуже приємне - я думав, що найкоротший шлях: var=$((expression))Але чому ти використовуєш це колись і витрачаєш тонни символів на expr на задній план?
Пітер Тейлор

Я не роблю багато сценаріїв оболонок, але чомусь ((var = expr)) у деяких місцях вийшов з ладу (так дивно: P) Оскільки я почав цей сценарій, я просто якось завершив. :)
Aman ZeeK Verma


2

Пасмо з однією петлею: 100 99 98 96

for ((i = 10, f = RANDOM% 6 + 1; i -;)) do
printf $ f
((n = RANDOM% 4 + 1, m = f <4? f: 7-f, f = n <m || ++ n <7-m? n: n + 1))
зроблено

http://ideone.com/XrZO7

Ключова ідея полягає в тому, що для вибору випадкового числа в [1, x], яке не дорівнює y, ви можете вибрати випадкове число в [1, x-1], а потім збільшити, якщо це> = y. Для цієї проблеми ми хочемо випадкове число в [1,6], яке не дорівнює f або 7-f. Ми повинні зробити два тести в порядку min (f, 7-f), max (f, 7-f).

Якщо припустити, що спочатку порожнє середовище може зберегти 2 символи, не ініціалізуючи i та змінивши стан циклу на i++<10


2

Баш: 97 94 92 90 89 87

Сильно гольфували з відповіді Амана ЗееК Верми:

для ((i = 10, f = 0; i -;)) робити
для ((n = f; n == f || n + f == 7; f = СЧАСТЬ% 6 + 1)) зробіть:
зроблено
printf $ f
зроблено

http://ideone.com/QiuTx

NB, певно, його можна зменшити на 5 символів, змінивши перший рядок на, for((;i++<10;))але це робить припущення, які не завжди є дійсними. Він би працював нормально в ideone, але хтось, який працює з оболонки, міг мати iабо fекспортувати щось не нульове.


Я хотів би зробити версію без внутрішнього циклу, але я боюся, що вона буде довшою.
Пітер Тейлор

Це надзвичайно приголомшливо, я думаю, що я занадто сирий для
удару

@Aman, більшість із них не є базовими. Це лише кілька десятків уточнень з тестами після кожного і перетворень, коли я щось порушив. Єдиний біт, який насправді баш-трюк, - це петля, яку мені довелося шукати. Якщо у вас є час для читання man bash, я рекомендую. Одного разу я прочитав його обкладинку, щоб обкладати, і просто розпливчасте уявлення про те, що можна і чого варто шукати, мені добре послужило.
Пітер Тейлор

2

Windows PowerShell, 45

-join(0..9|%{($d=1..6-ne(7-$d)-ne$d|random)})

Насправді тривіально. Я генерую список можливих рулонів з кістки, 1..6а потім вибираю лише ті, які не дорівнюють семи мінусам останнього, а потім лише ті, що не дорівнюють останньому. З решти списку я вибираю випадковий предмет і присвоюю його $d. Оскільки $dспочатку трактується так, як 0він котиться нормальним вмирати перший раз.

Тестовий сценарій:

for($i=0;$i-lt20;$i++){
    $o=@(./tipping.ps1)
    if ($i-gt0-and$o-eq$o2) { throw "Must have random output" }
    if ($o.count-ne1) { throw "Must only have one line of output" }
    if ($o[0]-match'[^1-6]'){ throw "Invalid characters" }
    if($o[0].length-ne10){ throw "Wrong length: $($o[0].length)" }
    $r=[char[]]($o[0])|%{$_-48}
    for ($x=1;$x-lt$r.count;$x++){
        if ($r[$x-1]+$r[$x]-eq7) { throw "Not a tipping: $($r[$x-1]) and $($r[$x])" }
    }
    $o2=$o
}

Історія:

  • 2011-02-18 11:57 (61) Перша спроба.
  • 2011-02-18 11:58 (45) Мені не потрібно генерувати перше число окремо.

Я отримуюThe term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Пітер Тейлор

@ Peter: PowerShell v2, будь ласка. Get-RandomКомандлет не існує в v1.
Joey

2

J

Це має працювати, але, на жаль, випадковий генератор J застрягає після 3-ї ітерації:

a=:>:i.6
f=:a#~1-(+&(a=])7&-)
((,(?4)&{@f@(_1&{))^:9)>:?6

6 4 5 4 5 4 5 4 5 4


Я ні в якому разі не експерт з J, але мені здається, що я страждав, коли я складав свою відповідь J на ​​цю тему, яка, (?4)як правило, прокручується один раз і трактується як константа для наступних ітерацій, якщо ви не обережні навколо цього. Я працював навколо цього за допомогою (?@4:)подібної конструкції.
JB


2

J, 30 символів

>:(?@4:{(i.6)-.],5&-)^:(<10)?6

6 2 3 5 4 2 4 1 3 6

Пояснення (читати справа наліво):

  • ?6 повертає випадкове число між 0 і 5
  • ^:(<10)застосовує функцію 9 разів, накопичуючи результати по дорозі. Функція:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- повертає масив вхідного числа та його доповнення до 5 (ми обробляємо числа на основі 0, тож сума протилежних граней дорівнює 5)
    • (i. 6) -. видаляє їх з повного набору цілих чисел 0 до 5. Залишилися всі дійсні позиції після однієї операції перекидання з позиції введення.
    • ?@4: { підбирає одного з тих, хто навмання.
  • >: збільшує всю послідовність, щоб повернути фігури до інтервалу від 1 до 6.

Приємна думка ">:" в кінці.
Вісімнадцять

1
@Eelvex Я поняття не маю, чому кістки в реальному світі - від 1 до 6, коли всі розумні міркування про них використовують від 0 до 5.: D
JB

2

GS2, 16 байт

16 2f 25 08 41 20 17 30 16 2f 31 31 25 09 19 32

Ось як це працює

16 2f 25     # make range from 1 to 6 and push random element
08           # start block
    41       # duplicate top of stack twice
    20 17 30 # negate top of stack and add 7
    16 2f    # push range from 1 to 6
    31 31    # do set-wise difference with each of the two previous numbers
    25       # push a random element from the list
09           # end block
19 32        # repeat block 9 times

Я думаю, що gs2 є новішим, ніж ця проблема.
lirtosiast

1

QBasic (71 символ)

Два нових рядки необхідні і включаються в число символів як один символ кожен.

RANDOMIZE:FOR I=0TO 9
1N=INT(RND*6)+1:IF L=N OR L+N=7THEN 1
?N:L=N:NEXT

1

TI-BASIC, 38 34

For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End

Нудне рішення, але воно коротше попереднього перегляду. Я скористаюсь тим, що на свіжому калькуляторі Ansініціалізується до нуля.


Я не знаю, чи можливо, але я дам 50 повторень кожному, хто може знайти коротше рішення.
lirtosiast

Як ви обчислюєте 34?
рекурсивна

Кожен маркер тут - один байт в пам'яті ; стандарт TI-BASIC оцінюється таким чином. Якщо у вас є калькулятор, введіть програму, подивіться на екран управління пам'яттю, потім відніміть 9 і відніміть довжину імені програми, щоб отримати розмір коду.
lirtosiast

1

Java 8, 130 байт

v->{int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));return r;}

Спробуйте тут.

Як повна програма з багатослівним основним методом, це буде 178 байт :

interface M{static void main(String[]a){int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));System.out.print(r);}}

Спробуйте тут.

Пол-порт @AmanZeeKVerma Баш відповіді «s .

Пояснення:

 v->{              // Method with empty unused parameter and String return-type
   int d=(int)(Math.random()*6+1),
                   //  Random dice-roll 1-6
       i=10,       //  Counter-integer, starting at 10
       p;          //  Temp integer to store new side
   String r=""+d;  //  Result-String, starting at the first dice-roll
   for(;i-->0;     //  Loop (1) 10 times:
       r+=d)       //    After every iteration, append the result with a random side
     for(p=d;      //   Set the new side to the current side
         p==d      //   Loop (2) as long as the new side and current side are the same
         |p+d==7;  //   or as long as both combined are exactly 7:
       d=(int)(Math.random()*6+1)
                   //    Set the new side to a random side 1-6
     );            //   End of loop (2)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result-String
}                  // End of method


0

> <> , 71 байт

Я радий, що я міг продемонструвати xрандомізацію кодового вказівника <<>, оскільки не пам'ятаю, як бачив це тут.

a&0 v
 /2v
1x3v 
>x< <<
6x4v
 \5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n

Ви можете спробувати його на цьому інтерпретаторі (вставити код, надіслати, запустити).


Як тільки ви виправите рішення, ви отримаєте мою пропозицію.
lirtosiast

@ThomasKwa Виконано, я можу трохи полегшити його, але, принаймні, тепер це функціонально.
Аарон


0

05AB1E , 23 байти

6LΩUTFX?6LʒDXÊsX+7Ê*}ΩU

Однозначно можна пограти в гольф, але наразі я цього не бачу ..

Спробуйте в Інтернеті.

Пояснення:

6LΩ              # Pick a random value from the range [1,6]
                 #  i.e. [1,2,3,4,5,6] → 3
   U             # Save this random value in variable `X`
TF               # Loop 10 times:
  X?             #  Print `X` without newline to STDOUT
  6Lʒ     }      #  Create a range [1,6] again, and filter it by:
     DXÊ         #   Check if the current value is not equal to `X`
                 #    i.e. 1 and 3 → 1 (truthy)
                 #    i.e. 3 and 3 → 0 (falsey)
     sX+         #   Sum the current value with `X`
                 #    i.e. 1 and 3 → 4
                 #    i.e. 3 and 3 → 6
        7Ê       #   And check if it's not equal to 7
                 #    i.e. 4 and 7 → 1 (truthy)
                 #    i.e. 6 and 7 → 1 (truthy)
     *           #   If both checks are truthy, keep it in the filtered list
                 #    i.e. 1 and 1 → 1 (truthy)
                 #    i.e. 0 and 1 → 0 (falsey)
           Ω     #  Pick a random value from the filtered list
                 #   i.e. [1,2,5,6] → 1
            U    #  And save it in variable `X` for the next iteration of the loop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.