Выберите номера 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, ⍵] и монадический ?является единым случайным числом.

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


Почти идентичны 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 за указание, что мне не нужны парены.


Вы уверены, что вам нужны скобки? Я думаю, что вы могли бы обрезать байт, отбрасывая десять и имея пробел между 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 необходимо указывать на не последний аргумент.


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

Random -ma 27может быть так же, Random 27как -Maximumсоответствует позиции 0
Мэтт

@Matt Спасибо - я забыл это.
AdmBorkBork


4

МАТЛАБ, 40

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

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


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.


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.


1
Не нужно объединять строки в части номера powerball, и вы сохраняете байты, либо кэшируете порядок делегата, либо намного больше, используя случайные числа для номера powerball
pinkfloydx33

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

4

Pyth - 13 14 13 байт

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

jb>5.SS69hO26

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


Не могли бы вы объяснить код, чтобы его можно было проверить, действительно ли он одинаков?
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

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), затем присоединиться и вернуть все это.


2

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

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

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


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]&

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


Вывод имеет фигурные скобки и запятые.
Чарльз

-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'

Вы можете использовать -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

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

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 каким-то образом продолжает тянуть одно и то же число. Вероятность того, что это произойдет, в течение любого значительного промежутка времени, вероятно, лучше, чем вероятность выиграть Пауэрбол.


Как это гарантирует, что не будет дублирующихся значений?
суперкат

@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,))

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

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


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))

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.