Случайные чаевые


14

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

Пример желаемого результата:

1532131356

Ответы:


5

GolfScript, 26 символов

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

Немного более сжатая версия Joey 's, в основном работающая над проблемой нулевого индексирования.


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

объединить циклы путем условного увеличения внешнего значения при обнаружении значения: for (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

Bash только с одной петлей: 100 99 98 96

для ((I = 10, F = СЛУЧАЙНЫХ% 6 + 1; я -;)) делают
printf $ f
((П = СЛУЧАЙНЫЙ% 4 + 1, т = е <4 F?: 7-F, F = п <т || ++ п <7-м п: п + 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

Сильно играл в гольф от ответа Aman ZeeK Verma:

для ((я = 10, F = 0; я -;)) делаю
для ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) выполните:
сделано
printf $ f
сделано

http://ideone.com/QiuTx

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


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

Это очень круто, я слишком
груб

@ Аман, большая часть этого не зависит от bash. Это просто несколько десятков доработок с тестами после каждого и возвращениями, когда я что-то сломал. Единственный бит, который на самом деле является хитростью, - это noop, который мне пришлось искать. Если у вас есть время, чтобы прочитать 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.
Джои

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.

Хорошая мысль ">:" в конце.
Eelvex

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;}

Попробуй это здесь.

В полной программе с подробным main-методом это будет 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 Bash answer .

Объяснение:

 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

R , 67 байт

c(3,5,1,4,2,6)[(sample(1:6,1)+cumsum(sample((-2:2)[-3],9,T)))%%6+1]

Попробуйте онлайн!

Есть ответ R от Golfier, но я думаю, что этот подход отличается от ответов, представленных до сих пор.

c(3,5,1,4,2,6)                                                     #A dice and its facets
               (sample(1:6,1)                                      #Initial dice roll
                             +cumsum(sample((-2:2)[-3],9,T)))      #9 tippings in c(-2,-1,1,2)
                                                             %%6+1 #converts to values in [0,6]
              [                                                   ]#

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.