Google Code Jam – Новая Лотерея

  • Автор темы Danielgecy
  • Обновлено
  • 23, Oct 2024
  • #1

Я порылся в Интернете и нашел эту головоломку Google Code Jam. Мне оно очень понравилось, поэтому я решил опубликовать его здесь.

Новая лотерея

Лотерея меняется! Раньше в лотерее был автомат,

сгенерировать случайное выигрышное число. Но из-за проблем с мошенничеством, Лотерея решила добавить еще один автомат. Новый выигрышный номер будет результатом побитовой операции И между двумя случайными числа, сгенерированные двумя машинами. Чтобы найти побитовое И из Х и Да.

, запишите их оба в двоичном формате; тогда 7 = 0111 11 = 1011бит в двоичном результате имеет 1, если соответствующие биты Х.

и Y были как 1, так и 0 в противном случае. В большинстве языков программирования .

побитовое И из Х.

и Да, написано X&Y Например: старая машина генерирует число.

новая машина генерирует номер

. Выигрышный номер будет

быть

(7 И 11) = (0111 И 1011) = 0011 = 3

1 ≤ Благодаря этой мере лотерея рассчитывает сократить случаи

1 ≤ мошеннические претензии, но, к сожалению, сотрудник лотереи ≤ 1000. 1 ≤ ≤ 1000. 1 ≤ компания слила следующую информацию: старая машина будет

1 ≤ всегда генерировать неотрицательное целое число меньше, чем ≤ 109. 1 ≤ А ≤ 109. 1 ≤ и новый

 Input                 Output
5                     Case #1: 10
3 4 2                 Case #2: 16
4 5 2                 Case #3: 52
7 8 5                 Case #4: 2411
45 56 35              Case #5: 14377
103 143 88
 

всегда будет генерировать неотрицательное целое число меньше, чем Б Каталина хочет выиграть в эту лотерею и решила попробовать.

https://code.google.com/codejam/contest/2994486/dashboard#s=p1

купить все неотрицательные целые числа меньше

К

Danielgecy


Рег
28 Jul, 2014

Тем
61

Постов
202

Баллов
537
  • 26, Oct 2024
  • #2

Руби, 107

Я ожидал, что это будет гораздо более короткая программа.

 
 
 
 
 
 
 
 
 
 
 
 
 Case #1: 10
Case #2: 16
Case #3: 52
Case #4: 2411
Case #5: 14377
 

Объяснение

  • Первую строку ввода можно игнорировать.
  • 0 acts as a counter for the case # li{ accepts the first line of input as integer/opens block ) iterates counter "Case #"\':S adds "Case #X: " to stack (though in 4 parts) l~:K;L\ takes next line of input, assign K, add null array { (2$, decrease B and generate list of number <A { 1$& Copy the current value of B, do & with current n<A @+\ Add the new possible lottery number to array }%~ loop for each element if the list of numbers <A }h loop which repeats for all numbers less than B ;/;{K<},, trim and count the possible numbers less than K N4$ add new line and copy the counter back in place }\* runs the block T times ; removes the counter so it doesn't print is the last read line number.
  • 0li{)"Case #"\':Sl~:K;L\{(2$,{1$&@+\}%~}h;\;{K<},,N4$}\*; is a quick way to turn the +/@,@(>`(17 b./&i.)/@|.)&.". в 'Test #',"1(":@#,{:)\}.': ',"1+/@,@(>`(17 b./&i.)/@|.)&.".;._2 stdin'' . It uses the splat operator ( ,&LF@('Test #'&,)"1@(":@#,{:)\@:}.@:(': '&,"1)@(+/@,@(>`(17 b./&i.)/@|.)&.".;._2)&.stdin'' ). Обратите внимание, что ( 1 .. gets.to_i ).each{ | _ | a, b, k = gets.split.map{ | x | x.to_i } x = 0 ( 0 ... k ).each{ | i | ( 0 ... a ).each{ | j | ( 0 ... b ).each{ | k | x += 1 if j & k == i } } } p "Case ##{_}: #{x}" } is an exclusive one ( (1..gets.to_i).each{|_|a,b,k=gets.split.map{|x|x.to_i};x=0;(0...k).each{|i|(0...a).each{|j|(0...b).each{|k|x+=1 if j&k==i}}};p"Case ##{_}: #{x}"} вместо qN/(;{[~0_{{_2$&3$<V+:V;)}4$*;)0}5$*];"Case #"T):T": "V0:V;N}% ).
  • Split string at newlines Get rid of first element (this is not needed, as I am looping through each element anyway) Let m=0 (case #) For each group of 3 numbers A, B, and K: Let w=0 (number of winning combinations) For(C,0,A-1) For(D,0,B-1) If (A&B)<K Let w=w+1 (one more winning combination) End End End Let m=m+1 (case # incremented) Output("Case #",m,": ",w,"/n") End takes a block. It will only count the elements for which the block returns a truthy value.
 

Jamhooh


Рег
07 Apr, 2006

Тем
82

Постов
203

Баллов
643
  • 26, Oct 2024
  • #3

АПЛ (63)

Это ввод-вывод, который стоит много.

n/(;0:m;{[~0:w.{{.2$&3$<w+:w;)}4$*;)0}5$*];'Case #'m):m': 'w n}%

Объяснение:

  • ↑{a b k←¯1+⍳¨⎕⋄'Case #',(⍕⍵),': ',⍕+/∊k∊⍨a∘.{2⊥∧/⍺⍵⊤⍨10/2}b}¨⍳⎕ ⎕: 5 ⎕: 3 4 2 ⎕: 4 5 2 ⎕: 7 8 5 ⎕: 45 56 35 ⎕: 103 143 88 Case #1: 10 Case #2: 16 Case #3: 52 Case #4: 2411 Case #5: 14377 ... : прочитайте число N с клавиатуры и запустите следующую функцию для каждого числа от 1 до N.
  • 'Case #',(⍕⍵),': ',⍕ : read three numbers from the keyboard, generate a list from 0..n-1 for each, and store these in +/ , k , and k∊⍨ .
  • 2⊤ ... ∧/ : для каждой комбинации значений из ⍺⍵⊤⍨10/2 and b :
    • a : get the 10-bit binary representation for both values (this is enough given the limits)
    • }b : и вместе все пары битов
    • a∘.{ : turn it back into a number
  • k : for each of these values, test if it is in b
  • a : sum the result
  • a b k←¯1+⍳¨⎕ : generate the output string for this case
  • }¨⍳⎕ : turn the result into a matrix, so each string ends up on a separate line.

Тест:

{ ||answer||

Гольфскрипт - 74 64

Вот мое решение Golfscript (вероятно, его можно улучшить):

↑{a b k←¯1+⍳¨⎕⋄'Case #',(⍕⍵),': ',⍕+/∊k∊⍨a∘.{2⊥∧/⍺⍵⊤⍨10/2}b}¨⍳⎕

Вот псевдокод, который я использовал для этого:

Array#count

Предполагается действительный ввод.

 

Plusuadmili41


Рег
13 May, 2006

Тем
74

Постов
192

Баллов
602
  • 26, Oct 2024
  • #4

СиДжем - 62

Вероятно, можно было бы улучшить; это всего лишь порт моего ответа на Golfscript.

.. ||answer||

Рубин - 145

Я все еще изучаю Ruby, поэтому, вероятно, есть более короткий способ сделать это.

...

Негольфед:

Range ||answer||

Дж, 90 (70)

Ввод-вывод на стандартный ввод/вывод, работает как скрипт (90).

*

Ввод на стандартный ввод, вывод неявно в REPL (полагаю, это похоже на APL) (70).

Array

Э-э, Джей не очень хорошо разбирается в таких требованиях к вводу-выводу.

Для любопытных: часть, выполняющая тяжелую работу, Range , which solves a single line of the problem (taking and returning a string).

 

Mishak181


Рег
16 Nov, 2011

Тем
79

Постов
204

Баллов
629
  • 26, Oct 2024
  • #5

СЖАМ - 57

[*0...x]

Я думаю, что в этом можно играть и дальше.

$.

Выход:

gets loop{a,b,k=gets.split.map &:to_i puts"Case ##{$.-1}: #{[*0...a].product([*0...b]).count{|x,y|x&y<k}}"}
 

Supassess


Рег
15 Feb, 2014

Тем
68

Постов
206

Баллов
556
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно