Це гарна дошка 2048 року?


26

Це моє перше питання тут, тому будь-які пропозиції в коментарях були б вдячні! Спасибі ;)

Вступ

Дуже часто стратегія гри 2048 НЕ ніколи ніколи НЕ б'ючи вниз . Це розташовує всі великі числа вгорі, а нижні - внизу. Отже, якщо ви правильно застосовуєте цю стратегію, ваша рада завжди буде відповідати наступній схемі:

Шаблон для перевірки на / Ваше завдання

Ваше подання повинно бути або повною програмою, або функцією, яка повертає трибунове значення, якщо дошка може бути описана так: Опускаючи кожен стовпець дошки, перший номер повинен бути найвищим у стовпці, другий номер повинен бути меншим ніж або дорівнює першому номеру і т. д. Хороша дошка 2048 визначається як дошка, де найвищі цифри знаходяться вгорі. Це код-гольф , тому найкоротший Код на мову (у байтах) виграє.

I / O

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

Приклади

Truthy:

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 |  8 |
|-------------------|
|  4 |    | 32 |  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|


|-------------------|
| 16 | 128| 64 | 32 |
|-------------------|
|  8 | 128| 32 |  8 |
|-------------------|
|  4 | 16 |  8 |  2 |
|-------------------|
|  4 |    |    |    |
|-------------------|

Фальсі:

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 | 16 |
|-------------------|
| 32 |    | 128|  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|


|-------------------|
| 16 | 128| 64 | 32 |
|-------------------|
|  8 |  32|    |  8 |
|-------------------|
|  4 | 16 |  8 |  2 |
|-------------------|
|  4 |    |    |    |
|-------------------|

Примітка

Подивіться на 2-й тестовий випадок хибної помилки: Коли десь є порожнє значення (або 0) і навіть коли за ним слідує значення, яке вище останнього ненульового числа, це має бути помилковим, оскільки наступне значення після нуль був би більшим, ніж 0, що робить його недійсним.

Удачі!


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Мартін Ендер

Відповіді:


16

Haskell , 21 байт

all$scanr1 max>>=(==)

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

Приймає список стовпців із порожніми пробілами як 0.


Дає неправильний вихід для [[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]].
Джонатан Аллан

@JonathanAllan Повертається помилково, як слід, ваш другий стовпчик [16,0,4,4], що не є монотонним. Або я щось пропускаю?
Я хочу зробити ігри

0 - це ваш заповнювач порожньої комірки, а не значення 0.
Джонатан Аллан

2
@Iwanttomakegames, щоб цей коментар був призначений для вас (замініть "ваш" на "the").
Джонатан Аллан

@JonathanAllan Вибачте за все плутанину, але 0 дійсно повинен, хоча представляючи порожню клітинку, вважати значенням 0. Порожні комірки слід розглядати як значення "0".
dv02


9

APL (Dyalog) , 7 4 байти

В якості аргументу бере матрицю 4 на 4, використовуючи 0 для пробілів.

⊢≡⌊⍀

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

⌊⍀ - вертикальний кумулятивний мінімум

 тотожна

 незмінений аргумент?


Дивовижний гольф! (Я очікував, що від когось, хто працює в Dyalog і тривалий час програмував APL). І так, у МОЙ є багато символів APL, хоча вони не є символами APL. Альфа, Йота, Омега - це грецькі, а технічно не APL. Вони прийшли в голову спочатку, думаючи про односимвольні команди. Отже, приріст і скорочення MY - це желе, тому що це прийшло в голову першим. (Тільки щоб повідомити вас, я
відхилений

7

Желе , 4 байти

Ṣ€U⁼

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

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


Яке представлення порожньої комірки? (напр., третій колон другого тестового випадку фальси) - "загалом це завжди буде 16 чисел". Це буде працювати з нулями, якщо ви їх відфільтруєте спочатку.
Джонатан Аллан

@JonathanAllan Відповідно до специфікацій, я думаю, що це теж справедливо
HyperNeutrino

І все-таки це не вдасться повернути запропонований тестовий випадок,0 а не повернути його 1.
Джонатан Аллан

@JonathanAllan Як ви фільтруєте в Jelly ._. Я очікую, що це спрацює, але ḟ0не працює
HyperNeutrino

1
@DirtyDev Це добре, ми тут, щоб насолодитися викликами та допомогти новим користувачам звикнути до цього місця :) Сподіваюся, вам сподобається спільнота
HyperNeutrino

6

R (+ pryr), 23 байти

pryr::f(all(diff(x))<1)

Який оцінює функцію

function (x) 
all(diff(x)) < 1

Який приймає матрицю як вхід:

     [,1] [,2] [,3] [,4]
[1,]   16    0   64    8
[2,]    8    0   32    8
[3,]    4    0   32    2
[4,]    2    0    0    0

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

     [,1] [,2] [,3] [,4]
[1,]   -8    0  -32    0
[2,]   -4    0    0   -6
[3,]   -2    0  -32   -2

Жодне з цих значень не може бути на рівні 1 або вище в хорошій дошці, тому ми перевіряємо <1і перевіряємо, чи allвідповідають матриці значення.

     [,1] [,2] [,3] [,4]
[1,] TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE

[1] TRUE

5

JavaScript, 37 байт

x=>''+x==x.map(v=>v.sort((x,y)=>y-x))

Назвіть це так:

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 |  8 |
|-------------------|
|  4 |    | 32 |  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|

f([[8,8,2,0],[64,32,32,0],[0,0,0,0],[16,8,4,2]])

Тестовано на Firefox, Chrome, оболонку JavaScript та Node.js.


Чому ви перетворюєте результат у рядок? ( ''+)
Zacharý

@ Zacharý sort- це мутаційний метод, який буде мутувати масив. Перше перетворення в рядок збереже копію масиву. перетворення в рядок також робить рівноправні операції за значенням (string) замість посилання.
tsh


4

C # (.NET Core) , 71 байт

i=>{for(int n=3;++n<i.Length;)if(i[n]>i[n-4])return false;return true;}

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

БОРІНГИЙ спосіб. Очікує, що введення сплюснуто в лінійний масив.

Альтернативно прямо заборонений спосіб:

i=>{for(int n=3;i[++n]<=i[n-4];);}

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

Закидає IndexOutOfBoundsException, щоб вказати істину, закінчується зазвичай, щоб вказати неправду. Я спробував версію, яка включала конверсію від винятку / не виняток до true / false, але це закінчилося так само, як і звичайна версія.


4

JavaScript, 34 , 32 байти

v=>!v.some((x,i)=>i%4&&x>v[i-1])

Телефонуйте, проходячи в одному масиві, що містить перший стовпець, а потім 2-й, 3-й та 4-й.

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

Тест

f=v=>!v.some((x,i)=>i%4&&x>v[i-1])

f([16,8,4,2,0,0,0,0,64,32,32,0,8,8,2,0])
f([16,8,4,4,128,128,16,0,64,32,8,0,32,8,2,0])
f([16,8,32,2,0,0,0,0,64,32,128,0,8,16,2,0])
f([16,8,4,4,128,32,16,0,64,0,8,0,32,8,2,0])

Редагувати: збережено 2 байти завдяки tsh


після того, як деякий логічне значення перетворення:v=>!v.some((x,i)=>i%4&&x>v[i-1])
TSH

3

Haskell , 28 байт

all$and.(zipWith(>=)=<<tail)

Там також

all$(==)=<<sort

з 15 байтами, але цього потрібно import Data.List при роботі з Prelude. Крім того,

all$(==)=<<Data.List.sort

з 25 байтами працює в GHCI.


3

Гая , 3 6 байт

+3 байт, тому що, мабуть, я не знав, як працює моя мова

ọ¦_ẏ⁇!

Це функція, що приймає список стовпців і залишає результат у стеку.

Існує кілька інших 6-байтних рішень, включаючи 0+¦o¦ẏта ọ¦_ẏ¦ỵ.

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

Пояснення

ọ¦      Deltas of each column
  _     Flatten
   ẏ⁇   Keep only positive numbers
     !  Negate (is it empty?)

Не можу подати заявку, але використання оператора, доданого до мови після опублікування виклику, мені не здається справедливим. Також це за замовчуванням заборонено відповідно до цього .
Cinaski

@Cinaski Ми як би віддалилися від цього правила, як це бачимо тут . Так чи інакше, в моїх альтернативних рішеннях використовуються лише оператори, які безумовно існували до виклику.
Ділова кішка

Я просто поміняю його на одну з інших, напевно,
Business Cat

Неважливо, я не знав про це нове правило.
Cinaski

3

TI-BASIC, 25 байт

Вважає матрицю 4x4 в Ans.

For(R,1,3
*row+(-1,Ans,R+1,R
End
Ans=abs(Ans

Пояснення

For(R,1,3             Loop from row 1 to 3.

*row+(-1,Ans,R+1,R    Multiply row R+1 by -1 and add it to row R in-place.
                      Effectively, this subtracts row R+1 from row R.

End                   Now the first 3 rows contain the row differences,
                      and the 4th row is non-negative assuming valid input.

Ans=abs(Ans           Check whether every element in the matrix is equal to its
                      absolute value, or in other words, contains no negative values.

2

Haskell , 41 байт

f[x]=1>0
f(a:b:c)|a<b=1<0|1>0=f$b:c
all f

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

Визначає безточну функцію all f, де fвизначає, чи сортується список.


Дарн, це побиває Пітона на 1 байт; P
HyperNeutrino

@HyperNeutrino Добре xnor б'є пітона на 21.: P
Пшеничний майстер

Ви також можете визначити fякf(a:b:c)=a>=b&&f(b:c)
Крістіан Лупаску

2

JavaScript (ES6), 42 байти

Бере масив стовпців; повертає (truthy) число або false.

a=>a.every(c=>c.reduce((r,n)=>r&&n<=r&&n))

JavaScript (ES6), 54 47 байт

Перша спроба. Бере масив стовпців; повертає trueабо false.

a=>a.every(c=>c.slice(1).every((n,i)=>n<=c[i]))

Яке значення ви очікуєте для порожніх комірок?
Арнольд

2

MATL , 4 байти

SGX=

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

Введіть як масив рядків, догори дном.

S       % sort columns
GX=     % compare with input
        % true if arrays are numerically equal
        % (implicit) convert to string and display

Чи не працює в тих випадках , які повинні повертати truthy , які мають нулі між елементами стовпчика , як це , наприклад.
Джонатан Аллан

Ти маєш рацію, я працюю над рішенням. До речі, я не єдиний, хто має проблеми з порожніми клітинками;)
Cinaski

Так, я це бачу. Я запропонував і тестовий випадок для цього. Пінг, коли буде виправлено, ви отримаєте виплату від мене :)
Джонатан Аллан

@JonathanAllan зачекайте, хто сказав, що він повинен повернути трити, коли між елементами стовпців є нулі? Подивіться на мій другий тестовий випадок хибної помилки, порожня клітинка / 0, за якою вище значення при спуску вниз, недійсне.
dv02

@DirtyDev FYI з викладеною первинною формуляцією та її розумною інтерпретацією, ваш другий випадок фальси все ще буде фальсиєю; це просто мій тестовий приклад, який буде запропоновано.
Джонатан Аллан


2

Діялог APL, 21 19 15 байт

∧/{⍵≡⍵[⍒⍵]}¨↓⍉⎕

Спробуйте в Інтернеті!(модифіковано, щоб він запускався в tryapl)

Приймає вхід як двовимірний масив.

Як?

  • вхід
  • переносити
  • 2D масив => 1D вектор 1D векторів
  • { ... }¨застосувати це до кожного члена (аргумент ):
    • ⍵[⍒⍵] відсортований за спаданням
    • ⍵≡ рівність с
  • ∧/чи є кожен елемент 1.


2

Japt , 7 байт

Для цього я спробував декілька різних методів, але, врешті-решт, найкоротший, який я міг придумати, виявився портом рішення JS від tsh.

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

P+U¥®n§

Перевірте це


Пояснення

Неявне введення масиву U.

P+U

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

¥

Перевірте рівність, яка також кидає праву частину на рядок.

®

Карта закінчена U.

Сортувати ( n) за <=.

Неоднозначно виводиться булевий результат.


Гарна домовленість пропустити другу U. Ви могли б зробити nnі наприкінці;)
ETHproductions

Я здивовано виявив, що опускання другого Uспрацювало в цьому випадку, @ETHproductions; Я думав, що це спрацює лише в тому випадку, якщо змінна буде єдиним зліва від ==. Мені доведеться запам'ятати це для подальшого використання.
Shaggy


1

Java 8, 69 байт

b->{for(int[]c:b)for(int i=0,f=1;i<3;)if(c[i]<c[++i])f=0;return f>0;}

Що ж, з цього письма це рішення перемагає рішення Swift, так що це! Цілком прямо. Вхід - це масив цілих масивів, внутрішній масив - це стовпці дошки (спочатку верхні квадрати). Транслювати на Function<int[][], Boolean>.


1

МОЙ , 66 62 20 байт (неконкурентоспроможний)

ω⍉ω⍉A6ǵ'ƒ⇹(E8ǵ'ƒ⇹(Π←

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

Причина цього не конкурує в тому, що я нещодавно реалізував 8E (≡), що еквівалентно APL .

Як?

  • ω⍉ Перший аргумент командного рядка переміщено
  • ω⍉ Перший аргумент командного рядка переміщено
  • A6ǵ' поштовх chr(0x6A) ( у кодовій сторінці, яка сортує за спаданням)
  • ƒ як функція, а не рядок
  • натиснути функцію, яка відображає спливаючу функцію над кожним аргументом
  • ( застосувати
  • E8ǵ'ƒ⇹( те саме, за винятком того chr(0x8E), що є командою match ( ).
  • Π продукт
  • вихід без нового рядка

Так, багато символів MY точно такі ж або схожі на APL. Пояснення в тому, що вони прийшли до тями, коли я хотів команду з 1 символом. (Я не знаю, чому я не використовував T для транспонування)


0

Математика, 27 байт

t=Thread;-t[Sort/@-t@#]==#&

Пояснення:

  • Thread- це дивна загальна транспозиційна операція, яка трапляється приймати транспонінг, коли йому дана матриця .
  • t=Thread;дозволяє використовувати tдва рази замість Threadдва рази для збереження байтів.
  • Sort сортує список (у порядку збільшення).
  • Sort\@відображає Sortфункцію для кожного елемента списку окремо; при застосуванні до матриці вона сортує рядки.
  • t@#застосовує функцію транспонування до входу #основної функції.
  • - приймає мінус всіх записів, щоб сортування рядків транспонованої матриці (стовпці оригіналу) сортувало їх за потрібним способом.
  • Зовнішня -t[...]сторона скасовує мінус і транспонирует, тому все, що ми насправді робили, було сортування стовпчиків від найбільшого до найменшого.
  • ==# перевіряє, чи відповідає нова матриця, відсортована стовпчиком, вихідній вхідній.
  • &завершує анонімну функцію на #визначеному нами вході .

Ви можете спробувати його в Інтернеті у пісочниці Wolfram Cloud , вставивши такий код, як наступний і натиснути Gear -> "Оцінити клітинку" або натиснувши Shift + Enter або numpad Enter:

t=Thread;-t[Sort/@-t@#]==#&@{{16,128,64,32},{8,32,0,8},{4,16,8,2},{4,0,0,0}}

Або для всіх тестових випадків:

t=Thread;-t[Sort/@-t@#]==#&//Map[#,{{{16,0,64,8},{8,0,32,8},{4,0,32,2},{2,0,0,0}},{{16,128,64,32},{8,128,32,8},{4,16,8,2},{4,0,0,0}},{{16,0,64,8},{8,0,32,16},{32,0,128,2},{2,0,0,0}},{{16,128,64,32},{8,32,0,8},{4,16,8,2},{4,0,0,0}}}]&
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.