Выберите номера Powerball!

34

Powerball - американская лотерея, которая недавно привлекла внимание, потому что текущий джекпот (по состоянию на 11 января 2016 года) является крупнейшим лотерейным призом в истории , около 1,5 миллиардов долларов США .

Игроки в Powerball выбирают 5 различных чисел из 69 пронумерованных белых шаров и 1 одно число «Powerball» из 26 пронумерованных красных шаров. Они выигрывают джекпот, если их выбор из пяти белых шаров совпадает с выбранным в любом порядке, и если они выбрали правильное число «Powerball».

Таким образом, шансы на выигрыш джекпота равны 1 в (69 choose 5)*(26 choose 1)или ((69*68*67*66*65)/(5*4*3*2*1))*26, что составляет 1 в 292,201,338.

Никто не выиграл джекпот в самом последнем розыгрыше 9 января 2016 года, но, возможно, кто-то выиграет следующий розыгрыш 13 января 2016 года, 22:59 по восточному времени.

Вызов

Напишите программу или функцию, которая имитирует рисунок Powerball, не требуя ввода, а выводя 5 различных случайных чисел от 1 до 69 включительно, а затем одно случайное число «Powerball» от 1 до 26 включительно (которое может быть повторением одного из 5 начальные номера).

Число «Powerball» всегда должно быть последним числом в выходных данных, но в противном случае порядок первых 5 чисел не имеет значения.

6 чисел должны быть выведены в десятичном виде , либо через пробел, либо через новую строку, с необязательным одиночным завершающим переводом строки. Запятые, скобки и другие символы не допускаются в выводе.

Таким образом, это будут действительные результаты (с использованием чисел из последнего рисунка ):

32 16 19 57 34 13
32
16
19
57
34
13

Все 292201338 возможных результатов должны быть возможны с одинаковой вероятностью. Вы можете использовать встроенные генераторы псевдослучайных чисел и предполагать, что они соответствуют этому стандарту.

Вот нерегламентированная эталонная реализация, которая работает в Python 2 или 3:

import random
print(' '.join(map(str, random.sample(range(1,70), 5) + [random.randint(1, 26)])))

Самый короткий код в байтах побеждает.


Обратите внимание, что я не связан с Powerball и не советую вам играть. Но если вы выиграете что-нибудь из чисел, сгенерированных одной из программ здесь, я уверен, что мы хотели бы услышать об этом. : D

Кальвин Хобби
источник
12
Упущенная возможность потребовать долю выигрыша, если кто-то здесь получит джекпот.
Алекс А.
Должны ли 5 ​​номеров быть в порядке?
Нил
@Neil "Число" Powerball "всегда должно быть последним числом в выходных данных, но в противном случае порядок первых 5 чисел не имеет значения."
Увлечения Кэлвина
3
Я уверен, что никто не смущен, но вы на самом деле имеете в виду целые числа в задаче.
jpmc26
1
@CanadianLuke Порядок первых 5 чисел не имеет значения. Есть 5! = 5*4*3*2*1способы обустроить 5 вещей, так что учтите это.
Увлечения Кельвина

Ответы:

29

Dyalog APL, 10 байт

(5?69),?26

Диадический ?являются ⍺ различных случайными чисел в [1, ⍵] и монадический ?является единым случайным числом.

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

lirtosiast
источник
Почти идентичны J , за исключением вы должны добавить 1 из - за индексации на основе 0: 1+(5?69),?26.
рандома
13

CJam, 16 байтов

69,mr5<26mr+:)S*
69,   range(69)
mr    shuffle the generated array
5<    first 5 elements
26mr  random number 0..25
+     concat to array
:)    increment each array element
S*    join with spaces

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

Дверная ручка
источник
1
Мне нравится, как :)все становится немного больше, например, как улыбка незнакомца может сделать вас немного счастливее.
Фонд Моника иск
1
Я думаю, я был бы хорош, :)если бы выиграл в лотерею. +1
Арктур
9

MATL , 10 байт

69 5Zr26Yr

Использует текущую версию (9.2.0) языка / компилятора.

пример

С компилятором, запущенным на Matlab:

>> matl
 > 69 5Zr26Yr
 > 
66
59
64
56
29
12

С компилятором, запущенным в Octave:

>> matl
 > 69 5Zr26Yr
 >
2 69 41 44 23
22

Первые пять чисел разделены пробелом, а не переводом строки. Это связано с тем, что основная randsampleфункция Octave ведет себя не так, как в Matlab (и была исправлена ​​в новой версии компилятора). Во всяком случае, новая строка и пробел разрешены вызовом.

Изменить (4 апреля 2016 г.) : попробуйте онлайн!

объяснение

69 5Zr    % randsample(69,5), without replacement by default. Gives a 5x1 column vector
26Yr      % randi(26). Gives single number
          % implicit display

Смотрите соответствующие функции Matlab: randsampleи randi.

Луис Мендо
источник
7

Руби, 33 32

p *[*1..69].sample(5),rand(26)+1

В Ruby есть встроенный метод sample, который выбирает случайные значения из массива без замены. Спасибо QPaysTaxes за указание, что мне не нужны парены.

histocrat
источник
Вы уверены, что вам нужны скобки? Я думаю, что вы могли бы обрезать байт, отбрасывая десять и имея пробел между p и *. Я проверяю сейчас. РЕДАКТИРОВАТЬ: проверено и AFAICT это работает.
Фонд Моника иск
Ха, спасибо. Я проводил тестирование в экземпляре irb, в который я был назначен pв какой-то момент, что фактически нарушает синтаксический анализ этой версии.
гистократ
6

R, 30 29 байт

cat((s=sample)(69,5),s(26,1))

sampleФункция выполняет простую случайную выборку из входных данных. Если в качестве первого аргумента указано одно целое число, выборка выполняется от 1 до аргумента. Размер выборки является вторым аргументом. Мы используем опцию выборки по умолчанию без замены.

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

Алекс А.
источник
Вы можете сохранить два целых байта, используя cвместоcat
Дин МакГрегор
@DeanMacGregor Спасибо за предложение, но здесь должны быть либо полные программы, которые пишут в STDOUT, либо функции, которые возвращают значение. В этом случае я выбрал первое. Если бы я использовал c, это был бы только фрагмент, который не разрешен по умолчанию.
Алекс А.
А, понятно. Я не заядлый игрок в гольф, поэтому я не был знаком с этим.
Дин МакГрегор
@DeanMacGregor Нет проблем. В любом случае, спасибо за предложение. :)
Алекс А.
6

Python 3.5, 63 байта

from random import*
print(*sample(range(1,70),5),randint(1,26))

Это в основном эталонная реализация гольфа. Обратите внимание, что 3.5 необходимо указывать на не последний аргумент.

Sp3000
источник
6

Октава, 35 32 байта

Хобби Кельвина подтвердили, что ans =это нормально при использовании функции, поэтому:

@()[randperm(69)(1:5),randi(26)]

Он имеет сходство с Memming в ответ , но он использует прямую индексацию , что это возможно только в октаве, и это - 7 байт короче, так что я решил, что стоит размещения в любом случае.

randperm(69)создает список со случайной перестановкой чисел 1-69. Можно напрямую проиндексировать список (это невозможно в MATLAB), чтобы получить только первые 5 чисел, как это (1;5). За этим следует список, randi(26)который возвращает одно число от 1 до 26.

Старый:

disp([randperm(69)(1:5),randi(26)])

Полученный список отображается с помощью disp.

Стьюи Гриффин
источник
6

PowerShell v2 +, 31 27 байт

1..69|Random -c 5;Random 27

Требуется версия 2 или новее, так как Get-Randomне было в v1 ( Get-подразумевается и -Maximumпозиционно). Выход разделен новой строкой.

Ungolfed:

Get-Random -InputObject (1..69) -Count 5
Get-Random -Maximum 27
AdmBorkBork
источник
Random -ma 27может быть так же, Random 27как -Maximumсоответствует позиции 0
Мэтт
@Matt Спасибо - я забыл это.
AdmBorkBork
5

Shell + coreutils, 31

shuf -i1-69 -n5
shuf -i1-26 -n1
Цифровая травма
источник
4

МАТЛАБ, 40

x=randperm(69);disp([x(1:5) randi(26)])

Я знаю. Это скучное решение.

Memming
источник
4

PHP, 69 байт

<?foreach(array_rand(range(1,69),5)as$k)echo$k+1," ";echo rand(1,26);

Довольно прямой ответ. Сгенерируйте 1-69 range, затем используйте, array_randчтобы получить 5 случайных ключей из массива, и вывести $k+1значение (индексированное 0), а затем вывести случайное int из 1-26.

Samsquanch
источник
4

C #, 153 байта 140 байтов

Благодаря "Маккей":

string.Join(" ",Enumerable.Range(1,69).OrderBy(e=>Guid.NewGuid()).Take(5).Concat(Enumerable.Range(1,26).OrderBy(e=>Guid.NewGuid()).Take(1)))

153 байта решения:

string.Join(" ",Enumerable.Range(1,69).OrderBy(e=>Guid.NewGuid()).Take(5))+" "+string.Join(" ",Enumerable.Range(1,26).OrderBy(e=>Guid.NewGuid()).Take(1))

Простое решение с использованием Linq и тасование с использованием GUID.

ivaan
источник
1
Не нужно объединять строки в части номера powerball, и вы сохраняете байты, либо кэшируете порядок делегата, либо намного больше, используя случайные числа для номера powerball
pinkfloydx33
И если вы объединяете последовательности вместо конкатенации строк, вам не нужно указывать пробел3 раза, это также будет более эффективным. напримерstring.Join(" ", ....take(5).Concat(....Take(1)))
Маккей
4

Pyth - 13 14 13 байт

Возможна крупная игра в гольф, это был просто FGITW.

jb>5.SS69hO26

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

Maltysen
источник
Не могли бы вы объяснить код, чтобы его можно было проверить, действительно ли он одинаков?
Masclins
Вы можете изменить <... 5To >5.... Финальный кодjb>5.SS69hO26
Blue
2

Брахилог , 40 байт

1:5e,68{I`random(I)+1=Z`Z=w,"
"w}\;25:1&

объяснение

Brachylog не имеет встроенный случайные числа (пока ...) , поэтому мы должны использовать предикат SWI-Prolog для этого: random/1. Мы можем ввести код SWI-Prolog в Brachylog, используя обратные кавычки.

1:5e,                             \  § Enumerate from 1 to 5 using \ (backtrack), which
                                     § evaluates to false and thus constructs a loop

     68{                         }   § Declare sub-predicate 1 and call it with 68 as input

        I`random(I)+1=Z`             § Z is the arithmetic expression 'random(I) + 1' where
                                     § I is the input of the sub-predicate

                        Z=w,         § Evaluate Z and write it
                            "\n"w    § Write a new line

;                                    § Else (we will reach this after the 5th iteration of
                                     § the enumeration, since \ is always false)

25:1&                                § Call the sub-predicate 1 with 25 as input
Fatalize
источник
2

JavaScript (ES6), 106 86 84 байта

F=(s=new Set,r=Math.random)=>s.size<5?F(s.add(r()*69+1|0)):[...s,r()*26|0+1].join` `

Поскольку мы не можем однозначно выбирать случайные числа в JavaScript, это работает путем создания набора (который содержит только уникальные значения), рекурсивного добавления случайных чисел (1-69), пока не будет 5 уникальных, добавление случайного числа (1-26), затем присоединиться и вернуть все это.

Mwr247
источник
2

Эликсир , 83 байта

Enum.reduce Enum.take_random(1..69,5)++[Enum.random(1..26)],fn(x,a)->"#{a} #{x}"end

При IO.putsиспользовании массива целых чисел, Elixir будет интерпретировать целые числа как символы и, следовательно, выводить некоторую строку вместо нужных чисел powerball. Итак, мы должны уменьшить целочисленный массив до строки.

srecnig
источник
2

Рубин, 47 43 39 байт

puts *(1..69).to_a.sample(5),rand(26)+1

Я думаю, что это может быть больше в гольфе, но я поработаю над этим, как только закончу, восхищаясь тем, как хорош этот код, учитывая.

Он работает почти так же, как и все остальное: возьмите массив чисел от 1 до 69, перемешайте их, получите первые пять, выведите их, а затем выведите случайное число от 1 до 26.

Я прошел несколько итераций, прежде чем опубликовать это:

puts (1..69).to_a.shuffle.first(5).join(' ')+" #{rand(26)+1}"  #61
puts (1..69).to_a.shuffle[0..5].join(' ')+" #{rand(26)+1}"     #58
puts (1..69).to_a.shuffle[0..5].join('<newline>'),rand(26)+1   #52
puts *('1'..'69').to_a.shuffle[0..5],rand(26)+1                #47
puts *('1'..'69').to_a.sample(5),rand(26)+1                    #43

(где <newline>заменяется фактическим переводом строки)

РЕДАКТИРОВАТЬ: Ой, не видел ранее существовавший ответ Ruby. Я наткнулся на sampleи прокручивал вниз, чтобы отредактировать свой ответ, но потом я увидел его ... Ну, хорошо. Мой итоговый результат - 43 байта, но я немного поиграю в гольф, чтобы посмотреть, насколько хорошо я справлюсь.

Фонд Моники Иск
источник
2

Mathematica, 64 байта

StringRiffle@Append[Range@69~RandomSample~5,RandomInteger@25+1]&

Довольно просто.

LegionMammal978
источник
Вывод имеет фигурные скобки и запятые.
Чарльз
-1 недействительно по вышеуказанной причине
CalculatorFeline
StringJoin=""<>##&
CalculatorFeline
@CatsAreFluffy На самом деле исправлено на этот раз. Просто перепутал мои функции ...
LegionMammal978
Я думаю, что вы могли бы сократить его, если вы используете только Range / RandomSample и перемещаете его по двум спискам вместо использования RandomInteger. Что-то вроде RandomSample [Range [# 1], # 2] & @@@ {{69,5}, {26,1}}]
Ксандерхолл,
1

Perl 5, 59 байт

{say for(sort{-1+2*int rand 2}1..69)[0..5];say$==1+rand 25}

Это подпрограмма; используйте это как:

perl -M5.010 -e'sub f{...}f'
msh210
источник
Вы можете использовать -Eвместо-M5.010 -e
andlrc
Cant вы можете заменить -1+2*int rand 2с rand>.5?1:-1?
andlrc
И разве вы не сможете сохранить еще несколько, заменив ;say$==на,$==
andlrc
@ dev-null Спасибо! В -M5.010любом случае, это не считается, поэтому я не стал сокращать его. Я думаю, что попробовал запятую вместо другой, sayи это не сработало. Но новое правило сортировки - хорошая идея, спасибо. Я протестирую его, когда у меня будет возможность, и отредактирую его.
msh210
1

PHP, 65 байт

<?=join(' ',array_rand(array_flip(range(1,69)),5))." ".rand()%26;

Благодаря другому ответу PHP на этой странице. Я написал программу самостоятельно, и это оказалось точно таким же ответом, что и Samsquanch, что заставило меня сделать еще один шаг, чтобы сэкономить несколько байтов.

Если кто-нибудь может найти способ добавить один массив к другому здесь, это меньше, чем 5 байтов, которые требуются мне, чтобы присоединиться к числу powerball после, я был бы очень признателен, потому что это сводит меня с ума! Лучшее, что я мог придумать, было бы после array_randи до того join, чтобы иметь что-то вроде заявления +[5=>rand()%25], но это лишний байт по сравнению с конкатенацией после.

<?=                                                              // This represents an inline 'echo' statement
                                  range(1,69)                    // Get an array of all numbers from 1 to 69 inclusive
                       array_flip(           )                   // Swap the keys and values.
            array_rand(                       ,5)                // Get a random subset of five keys.
   join(' ',                                     ).rand()%26     // Concatenate the array with spaces, along with the powerball number

Запустите его через командную строку. Образец:

C:\(filepath)>php powerball.php

Выход:

 12 24 33 67 69 4
Xanderhall
источник
1

PARI / GP, 71 70 байт

apply(n->print(n),numtoperm(69,random(69!))[1..5]);print(random(26)+1)

Он генерирует случайную перестановку [1..69], затем принимает первые 5.

К сожалению, это неэффективный пользователь случайности, потребляющий в среднем 87 байтов энтропии по сравнению с теоретико-информационным идеалом в 3,5. Это происходит главным образом потому, что генерируется вся перестановка, а не только первые 5 членов, а также потому, что заказы упорядочены (потеря lg 5! = ~ 7 бит). Кроме того, randomиспользуется стратегия отклонения, а не арифметическое кодирование. (Это потому, что PARI использует Xorgen Брента, который достаточно быстр, чтобы издержки от более сложных стратегий редко стоили.)

Есть три «очевидных» изменения, которые не работают в текущей (2.8.0) версии gp. randomи printможет храниться в переменных и printвызываться напрямую, а не через анонимную ->функцию:

r=random;apply(p=print,numtoperm(69,r(69!))[1..5]);p(r(26)+1)

Вместе они сэкономят 9 байтов. К сожалению, обе функции действительны без аргументов и, следовательно, оцениваются сразу, а не сохраняются, поэтому они не вычисляют желаемый результат.

Чарльз
источник
0

Машинный код Intel x86, 85 байт

¿I ±‰ø1Ò»E ÷óB‰Ðè+ ‰þÑç÷ƒÇþÉ„Éuâ‰ø1Ò» ÷óB‰Ðè
 0ä͸ ͱëÆÔ
00†Äˆã´ÍˆØÍ° ÍÃ

Ну, иногда он печатает одни и те же цифры, просто попробуйте еще раз, нажав клавишу.

Компилировать с:

nasm file.asm -o file.bin

Убедитесь, что выровняли его по размеру дискеты (добавьте нули в конце), чтобы подключить его к виртуальной машине (для этого не требуется операционная система).

Разборка:

BITS 16
ORG 0x7c00

mov di,73 ;starting seed
mov cl,5 ;we need five numbers

loop:

mov ax,di

xor dx,dx
mov bx,69
div bx
inc dx
mov ax,dx

call print_rnd_number

mov si,di
shl di,1
add di,si
add di,7

dec cl

test cl,cl
jne loop

mov ax,di

xor dx,dx
mov bx,26
div bx
inc dx
mov ax,dx

call print_rnd_number

xor ah,ah
int 0x16
mov ax,0x0002
int 0x10
mov cl,5
jmp loop

print_rnd_number:
aam
add ax,0x3030
xchg al,ah
mov bl,ah
mov ah,0x0E
int 0x10
mov al,bl
int 0x10
mov al,' '
int 0x10
ret
ByteBit
источник
6
Добро пожаловать в Программирование Пазлов и Code Golf! Увидеть машинный код всегда впечатляет, но если он печатает повторяющиеся цифры в некоторых случаях, я боюсь, что ваше представление является недействительным.
Деннис
1
Да, но я просто хотел поделиться этим :)
ByteBit
2
Я понимаю, но мы недавно обсуждали это , и единодушное мнение сообщества состояло в том, что неверные ответы должны быть либо исправлены, либо удалены.
Деннис
Я откажусь от голосования, если вы исправите; пожалуйста, пинг меня.
lirtosiast
0

C, 142 байта

i,x[6],n;main(j){for(srand(time(0));i<6;n-i?0:printf("%d ",x[i]),i++)for(x[n=j=i]=(69-i/5*43)*(rand()/2147483647.)+1;i<6&&j--;)i-=x[i]==x[j];}

Не очень доволен этим решением, так как кажется, что должно быть больше возможностей для игры в гольф. Я посмотрю на это снова завтра свежими глазами. Попробуй это здесь .

Коул Камерон
источник
0

Swift, 165 байт

import UIKit;var a=[Int]();for i in 0...5{func z()->Int{return Int(arc4random_uniform(i<5 ?68:25)+1)};var n=z();while i<5&&a.contains(n){n=z()};a.append(n);print(n)}

Можно быстро запустить на игровой площадке Xcode.

РЕДАКТИРОВАТЬ: Текущая проблема здесь заключается в том, что теоретически возможно, чтобы это продолжалось вечно в цикле while, если arc4random_uniform каким-то образом продолжает тянуть одно и то же число. Вероятность того, что это произойдет, в течение любого значительного промежутка времени, вероятно, лучше, чем вероятность выиграть Пауэрбол.

timgcarlson
источник
Как это гарантирует, что не будет дублирующихся значений?
суперкат
@supercat, раньше не было, но теперь так и есть.
Тимгкарлсон
0

Perl 6 ,  32   31 байт

# space is necessary so that the parens denote a list
# rather than being part of the call to `put`
put (pick(5,1..69),(1..26).pick) # 32 bytes
# 25 35 57 67 62 24␤

Превратив его в функцию, которая возвращает строку, я могу удалить 4 байта ( put␠), добавив только 3 ( {~ })

{~(pick(5,1..69),(1..26).pick)} # 31 bytes

Использование:

say {...}().perl; # use .perl to prove it returns a string
# "25 35 57 67 62 24"

Если бы функции было разрешено возвращать список значений, следующее также сработало бы.

(В противном случае это будет так же, как указано выше, но внутри { })

  • функция, которая возвращает один плоский список

    {|pick(5,1..69),(1..26).pick} # 29 bytes
    # (25,35,57,67,62,24)
  • функция, которая возвращает список с первыми 5 числами в подсписке

    {pick(5,1..69),(1..26).pick} # 28 bytes
    # ((25,35,57,67,62),24)
  • функция, которая возвращает список с первыми 5 в подсписке и Powerball в другом подсписке

    {pick(5,1..69),pick 1,1..26} # 28 bytes
    # ((25,35,57,67,62),(24,))
Брэд Гилберт b2gills
источник
0

Серьезно, 35 байтов

Моя первая попытка ответа на языке игры в гольф.

Чувствуется дольше, чем должно быть.
Повторение, вероятно, может быть удалено с помощью W , но, похоже, он поврежден в онлайн-интерпретаторе, и я не хочу публиковать непроверенный код.

Очень плохо { не работает в списках.

Код:

:70:1xi J{. J{. J{. J{. J{.:26:Ju.

Шестнадцатеричный дамп:

3a37303a317869204a7b2e204a7b2e204a7b2e204a7b2e204a7b2e3a32363a4a752e7f

Объяснение:

:70:1x                       # Push a list of the numbers 1-69
i                            # Explode list
 J{.                         # rotate stack random(len(stack)) times and pop/print
 J{. J{. J{. J{.             # same thing 4 more times
:26:Ju.                      # print random number in 1-26
                             # (7F) unprintable, terminate without explicit printing

Онлайн переводчик

Emigna
источник
0

Луа, 96 байт

Простое решение, использующее таблицу как набор, помещая значение в нее, table[value]=truthy/falsyчтобы иметь возможность проверить, находятся ли они внутри нее или нет.

Я теряю 5 байтов, потому что мне нужно установить первое значение в моей таблице, иначе я не буду входить в while(o[n])цикл и просто выведу nперед использованием случайной функции. Поскольку Lua использует таблицы, основанные на 1, я также должен заставить его поместить первое значение в ячейку [0], иначе я не смог бы вывести a 1.

m,n,o=math.random,0,{[0]=0}for i=1,5 do while(o[n])do n=m(69)end o[n]=0 print(n)end print(m(26))

Ungolfed:

m,n,o=math.random,0,{[0]=0}
for i=1,5
do
  while(o[n])
  do
    n=m(69)
  end
  o[n]=0
  print(n)
end
print(m(26))
Katenkyo
источник
0

C ++, 252 байта

Golfed:

#include<iostream>
#include <random>

int main(){std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(1,69);for(int c=0;c<=5;c++){std::cout<<dis(gen)<<" ";}int x=dis(gen);while(x>26||x<1){x=dis(gen);}std::cout<<x;return 0;}

Ungolfed:

#include<iostream>
#include <random>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 69);
    for(int c = 0; c <= 5; c++){
        std::cout<<dis(gen)<<" ";
    }
    int x = dis(gen);
    while (x > 26 || x < 1){
        x = dis(gen);
    }
    std::cout<<x;
    return 0;
}
Мишельфрансис Бустильос
источник