Это хорошая доска 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 |    |    |    |
|-------------------|

Falsy:

|-------------------|
| 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 Возвращает false, как и должно быть, ваш второй столбец имеет значение [16,0,4,4], что не является монотонным. Или я что-то упустил?
Я хочу делать игры

0 - это ваш заполнитель для пустой ячейки, а не значение 0.
Джонатан Аллан

2
@Iwanttomakegames, этот комментарий был предназначен для вас (замените «ваш» на «the»).
Джонатан Аллан

@JonathanAllan Я прошу прощения за всю путаницу, но 0, действительно, при представлении пустой ячейки, следует считать значением 0. Пустые ячейки должны рассматриваться как значение '0'.
dv02


9

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

Принимает матрицу 4 на 4, используя 0 в качестве аргумента.

⊢≡⌊⍀

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

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

 идентичный

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


Удивительный гольф! (Я ожидал этого от кого-то, кто работает на Dyalog и давно программирует APL). И да, у MY действительно есть много символов APL, хотя они не являются символами APL. Альфа, Йота, Омега все греческие, а не APL технически. Сначала они пришли в голову, когда думали об односимвольных командах. Следовательно, приращение и уменьшение МОЯ - это желе, потому что это пришло в голову первым. (Просто чтобы уведомить вас, я отстранен от чата, поэтому ответ здесь.)
Zacharý

7

Желе , 4 байта

Ṣ€U⁼

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

Ввод в виде массива столбцов. Работает с сетками произвольного размера.


Что представляет собой пустая ячейка? (например, 3-й столб 2-го теста Фэлси) - «в общем, это всегда будет 16 цифр». Это будет работать с нулями, если вы сначала отфильтруете их.
Джонатан Аллан

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

Тем не менее , что теперь не в состоянии мой предложил тест возвращения , 0а не 1.
Джонатан Аллан

@JonathanAllan Как вы фильтруете в желе ._. Я ожидал бы, что это сработает, но ḟ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 Shell и Node.js.


Почему вы превращаете результат в строку? ( ''+)
Захари

@ Zacharý sort- изменяемый метод, который изменяет массив. первое преобразование в строку сохранит копию массива. преобразование в строку также делает равную операцию работающей по (строковому) значению вместо ссылки.
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-й.

Сравнивает каждое число с предыдущим, за исключением первого числа каждого столбца, и возвращает значение true, если все значения равны true.

Тест

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

Gaia , 3 6 байт

+3 байта, потому что, видимо, я не знал, как работает мой язык

ọ¦_ẏ⁇!

Это функция, принимающая список столбцов и оставляющая результат в стеке.

Существует несколько других 6-байтовых решений, включая 0+¦o¦ẏи ọ¦_ẏ¦ỵ.

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

объяснение

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

Невозможно понизить голос, но использование оператора, добавленного к языку после публикации запроса, не кажется мне справедливым. Также, по-видимому, по умолчанию это запрещено .
Чинаски

@Cinaski Мы вроде как отошли от этого правила, как видно здесь . В любом случае, мои альтернативные решения используют только операторов, которые определенно существовали до вызова.
Бизнес Кот

Я просто изменить его на один из других я думаю
Business Cat

Неважно, я не знал об этом новом правиле.
Чинаски

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определяет, отсортирован ли список.



@HyperNeutrino Что ж, xnor's бьет питона к 21.: P
Волшебник Пшеницы

Вы также можете определить fкакf(a:b:c)=a>=b&&f(b:c)
Кристиан Лупаску

2

JavaScript (ES6), 42 байта

Принимает массив столбцов; возвращает (правдивое) число или 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

Дьялог АПЛ, 21 19 15 байт

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

Попробуйте онлайн! (модифицировано так, что оно будет работать в тряпле)

Принимает ввод в виде 2D-массива.

Как?

  • вход
  • транспонирования
  • 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

Mathematica, 27 байт

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

Объяснение:

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

Вы можете попробовать его онлайн в песочнице Wolfram Cloud , вставив код, подобный приведенному ниже, и щелкнув Gear -> «Оценить ячейку» или нажав Shift + Enter или цифровую клавишу 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.