Гра Пікоміно


10

У грі Pickomino є кілька плиток, що лежать посередині столу, кожна з яких має різне ціле число. З кожним кроком гравці певним чином перекидають кубики і отримують рахунок, який є неотримним цілим числом.

Тепер гравець бере плитку з найбільшою кількістю, яка все ще нижча або дорівнює їх балу, виймаючи плитку з середини і додаючи її до своєї стопки. Якщо це неможливо, оскільки всі номери в середині перевищують бал гравця, гравець втрачає верхню плитку зі своєї стеки (яка була додана останньою), яка повертається до середини. Якщо у гравця не залишилося плиток, нічого не відбувається.

Змагання

Симулюйте гравця, який грає проти себе. Ви отримуєте список плиток в середині та список результатів, які отримав гравець. Поверніть список плиток плеєра після того, як всі повороти були оцінені.

Правила виклику

  • Ви можете припустити, що список із плитками впорядкований і не містить жодного цілого числа двічі.
  • Ви можете взяти обидва списки введення в будь-якому бажаному порядку
  • Вихід повинен підтримувати порядок плиток на стеку, але ви можете вирішити, чи сортується список зверху вниз чи знизу вгору.

Загальні правила

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Додавання пояснення для вашої відповіді рекомендується.

Приклад

(взято з 6-ї тестової шкали)

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]

Перший бал - 22, тому візьміть найвищу плитку посередині <= 22, яка сама 22.

Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [22, 22, 23, 21, 24, 0, 22] 

Наступний бал - 22, тому візьміть найвищу плитку посередині <= 22. Оскільки 22 вже взято, гравець повинен взяти 21.

Middle: [23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 21]
Remaining scores: [22, 23, 21, 24, 0, 22]

Наступний бал - 22, але всі числа <= 22 вже взяті. Тому гравець втрачає верхню плитку на стеку (21), яка повертається в середину.

Middle: [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22]
Remaining scores: [23, 21, 24, 0, 22]

Наступні результати - 23, 21 і 24, тому гравець бере ці плитки з середини.

Middle: [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21, 24]
Remaining scores: [0, 22]

Гравець розбивається і забиває нуль. Тому плитка з номером 24 (верхній на стеку) повертається в середину.

Middle: [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Stack: [22, 23, 21]
Remaining scores: [22]

Останній бал - 22, але всі плитки <= 22 вже взяті, тому гравець втрачає верхню плитку на стеку (21).

Middle: [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Final Stack and Output: [22, 23]

Тестові справи

(з останньою верхньою плиткою, останньою у списку вихідних даних)

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [26, 30, 21]
Output: [26, 30, 21]

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [35, 35, 36, 36]
Output: [35, 34, 36, 33]

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23]
Output: [23]

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: []
Output: []

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 17, 23, 19, 23, 0]
Output: []

Tiles: [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
Scores: [22, 22, 22, 23, 21, 24, 0, 22]
Output: [22, 23]

Tiles: [1, 5, 9, 13, 17, 21, 26]
Scores: [6, 10, 23, 23, 23, 1, 0, 15]
Output: [5, 9, 21, 17, 13, 1]

Tiles: []
Scores: [4, 6, 1, 6]
Output: []

Пісочниця


Чи можемо ми припустити, що в середині немає плитки зі значенням нуля?
Втілення

@EmbodimentofIgnorance У ньому написано "натуральне число", так що так.
Ørjan Johansen

Оскільки плитки унікальні, чи допустимо було б сприймати їх як бітмаску?
Арнольд

@TRITICIMAGVS Так, якщо середня купа порожня, гравець не може взяти плитку з середини, тому вони втрачають плитку (якщо у неї є)
Black Owl Kai

@Arnauld Це прийнятно
Чорна сова Кай

Відповіді:


3

Haskell , 119 111 104 103 байт

1 байт збережено завдяки Ørjan Johansen

(#)=span.(<)
(a%(b:c))d|(g,e:h)<-b#d=(e:a)%c$g++h|g:h<-a,(i,j)<-g#d=h%c$i++g:j|1>0=a%c$d
(a%b)c=a
([]%)

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

Припускає, що плитки відсортовані у порядку зменшення.

Тут не так багато фантазії. Перший аргумент - це гра гравців, другий - їхні рахунки, а третій - середина.


1
Це не може бути правильним, оскільки sortє висхідним. Проте тестовий випадок TIO ніколи не потрапляє в цю галузь. Я настійно рекомендую кожен раз тестувати всі випадки, коли подібні ітерації.
Ørjan Johansen

@ ØrjanJohansen Дякую! Виправлено зараз. Принаймні мені більше не потрібно імпортувати!
Ad Hoc Hunter Hunter

Збережіть байт за допомогою (#)=span.(<).
Ørjan Johansen

@ ØrjanJohansen Зміна зроблена. Дивно, що я спробував це раніше і думав, що це додає байт.
Ad Hoc Hunter Hunter

3

Japt, 24 байти

Ой! Це не вийшло так добре, як я думав, що це буде!

Вводиться в зворотному порядку.

®=Va§Z)Ì?NpVjZ:VpNo)nÃN¤

Спробуйте або запустіть усі тестові випадки на TIO

®=Va§Z)Ì?NpVjZ:VpNo)nÃN¤     :Implicit input of N=[U=scores, V=tiles]
®                            :Map each Z in U
 =                           :  Reassign to Z
  Va                         :    0-based index of last element in V (-1 if not found)
    §Z                       :      Less than or equal to Z
      )                      :  End reassignment
       Ì                     :  Sign of difference with -1 (1 if found, 0 if not)
        ?                    :  If truthy (not zero)
         Np                  :    Push to N
           VjZ               :      Remove and return the element at index Z in V
              :              :  Else
               Vp            :    Push to V
                 No          :      Pop the last element of N
                   )         :    End Push
                    n        :    Sort V
                     Ã       :End map
                      N¤     :Slice the first 2 elements (the original inputs) off N


2

C # (Visual C # Interactive Compiler) , 159 158 154 байт

Називається як f(tiles)(scores)

n=>m=>{var s=new Stack<int>();m.Add(0);n.ForEach(k=>{var a=m.Except(s).Where(x=>x<=k).Max();if(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);});return s;}

Якщо тільки System.Voidнасправді є тип повернення, а не просто заповнювач для роздумів. Я міг би замінити if(a<1)m.Add(s.Count<1?0:s.Pop());else s.Push(a);з var t=a>1?m.Add(s.Count<1?0:s.Pop()):s.Push(a);, зберігаючи два байта.

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

//Function taking in a list and returning
//another function that takes in another list and returns a stack
n=>m=>{
//Initialize the stack
var s=new Stack<int>();
//Add a zero to the tiles, to ensure no exceptions appear due to accessing
//non-existent elements in an empty collection later
//when we try to filter it later and getting the biggest element
m.Add(0);
//Iterate through our scores
n.ForEach(k=>{
//Create a variable called a, which we will use later
var a=
//Get all the elements in the middle that haven't appeared in our stack
m.Except(s).
//And throw away all elements that are bigger than our current score
Where(x=>x<=k).
//And get the biggest element there, and that is now the value of a
//Without the m.Add(0), we would get an exception here
Max();
//Self-explanatory, if a is less than 1 aka if a equals 0
//Checks if all elements in the middle are bigger than our score 
//Except for our self added 0, of course
if(a<1)
//Add 0 to the middle if the stack is empty
//Remember, zeros don't affect the list
m.Add(s.Count<1?0:
//Else pop the stack and add that to the middle
s.Pop());
//If a isn't 0, add a to the stack
else s.Push(a);});
//Afterwards, return the stack
return s;}


2

JavaScript (Node.js) , 80 байт

Така ж логіка, що і версія ES6, але плитки вважають бітмаскою BigInt, а оцінки - масивом BigInts.

m=>s=>s.map(g=x=>!x||m>>x&1n?m^=1n<<(x?r.push(x)&&x:r.pop()||~x):g(--x),r=[])&&r

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


JavaScript (ES6),  100 98 94  87 байт

Вводиться як " (tiles)(scores). Плитку можна прокласти в будь-якому порядку.

t=>s=>s.map(g=x=>m[x]?m[x?r.push(x)&&x:r.pop()]^=1:g(x-1),t.map(x=>m[x]=1,m=[r=[]]))&&r

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

Прокоментував

t => s =>                 // t[] = tiles; s[] = scores
  s.map(g = x =>          // for each score x in s[]:
    m[x] ?                //   if m[x] is set:
      m[                  //     update the 'middle':
        x ?               //       if x is not equal to 0:
          r.push(x) && x  //         push x in the stack r[] and yield x
        :                 //       else:
          r.pop()         //         pop the last value from the stack
                          //         (may be undefined if the stack is empty)
      ] ^= 1              //     toggle the corresponding flag in m[]
    :                     //   else:
      g(x - 1),           //     try again with x - 1
    t.map(x =>            //   initialization of the 'middle': for each value x in t[]:
      m[x] = 1,           //     set m[x]
      m = [r = []]        //     the stack r[] is stored as the first entry of m[],
                          //     which ensures that g will always stop when x = 0
    )                     //   end of initialization
  ) && r                  // end of main loop; return r[]

1

Вугілля деревне , 35 байт

Fη«≔⌈Φ講κιι¿ι«≔Φθ⁻κιθ⊞υι»¿υ⊞θ⊟υ»Iυ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Fη«

Петля над балами.

≔⌈Φ講κιι

Шукайте найвищу доступну плитку.

¿ι«

Якщо він існує тоді ...

≔Φθ⁻κιθ

... видаліть плитку з середини ...

⊞υι

... і додайте його в стек.

»¿υ

В іншому випадку, якщо стек не порожній ...

⊞θ⊟υ

Вийміть останню плитку зі стопки і поверніть її в середину.

»Iυ

Роздрукуйте отриманий стек від найдавнішого до найновішого.



1

05AB1E , 27 22 байт

vÐy>‹ÏDgĀià©K®së\sª])¨

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

v            # Loop `y` over the (implicit) input-list of scores:
 Ð           #  Triplicate the tiles list (takes it as implicit input in the first iteration)
  y>‹        #  Check for each if `y` <= the value in the tiles list
     Ï       #  Only leave the values at the truthy indices
 D           #  Duplicate the remaining tiles
  ¯Êi        #  If this list is not empty:
     à       #   Pop the list, and push its maximum
      ©      #   Store it in the register, without popping
       K     #   Remove it from the tiles list
        ®    #   Push the maximum again
         s   #   Swap the maximum and tiles-list on the stack
    ë        #  Else:
     \       #   Remove the duplicated empty tiles-list from the stack
      sª     #   Add the last tile to the tiles-list
]            # Close the if-else and loop
 )           # Wrap everything on the stack into a list
  ¨          # Remove the last item (the tiles-list)
             # (and output the result implicitly)

1

Pyth, 32 байти

VE ?JeS+0f!>TNQ=-QeaYJaQ.)|Y]0;Y

Спробуйте це в Інтернеті тут або перевірити всі тестові випадки тут .

Тут десь має бути місце для вдосконалення - будь-які пропозиції будуть дуже вдячні!

VE ?JeS+0f!>TNQ=-QeaYJaQ.)|Y]0;Y   Implicit: Q=input 1 (middle), E=input 2 (scores), Y=[]
VE                            ;    For each score, as N, in the second input:
         f    Q                      Filter Q, keeping elements T where:
          !>TN                         T is not greater than N 
                                       (less than or equal is the only standard inequality without a token in Pyth, grrr)
       +0                            Prepend 0 to the filtered list
     eS                              Take the largest of the above (_e_nd of _S_orted list)
    J                                Store the above in J
   ?                                 If the above is truthy:
                   aYJ                 Append J to Y
                  e                    Take last element of Y (i.e. J)
               =-Q                     Remove that element from Q and assign the result back to Q
                                     Else:
                          |Y]0         Yield Y, or [0] if Y is empty
                        .)             Pop the last element from the above (mutates Y)
                      aQ               Append the popped value to Q
                               Y   Print Y

1

Perl 5 -apl -MList:Util=max, 97 байт

$_=$".<>;for$i(@F){(($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$s:$s=~s/ \d+$//?$_:$G).=$&}$_=$s;s/ //

ТІО

читає бали та плитки в наступному рядку та друкує вихід.

Як

  • -apl: перевести -pцикл на рядки та друкувати, автоматично -aрозщедрити , зіткнути -lз вводу та додати символ нового рядка до виводу
  • $_=$".<> : читати наступний рядок (плитки) та додавати пробіл у змінну за замовчуванням $_
  • for$i(@F){... }переведіть петлю $iна @Fполя поточного рядка (бали)
  • (.. ?.. :.. ).=$&додайте попередню відповідність до потрійного l-значення
  • ($m=max grep$_<=$i,/\d+/g)&&s/ $m\b//?$sу випадку, якщо максимальне значення знайдено та вилучено з плиток ( $_) l-значення - це бали ( $s)
  • $s=~s/ \d+$//?$_ в іншому випадку, якщо останнє число можна буде зняти з балів, це плитки
  • :$G нарешті, це сміття, бо не може статися
  • $_=$s;s/ // щоб встановити бали за замовчуванням var та видалити простір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.