Ограничьте свои числа своими пробегами


15

Самоограничивающиеся списки

Рассмотрим непустой список L, содержащий неотрицательные целые числа. Выполнения в L представляет собой непрерывный подсписок равных элементов, которые не могут быть сделаны больше. Например, прогоны [0,0,1,1,3,3,3,2,1,1] : [0,0], [1,1], [3,3,3], [2 ], [1,1] . Список L является самоограничивающим, если для каждого целого числа N ≥ 1 число вхождений N меньше или равно количеству прогонов N-1 . Приведенный выше список не является самоограничивающим, потому что есть 4 вхождения по 1 , но только один прогон из 0 с.

Вот пример самоограничивающегося списка: [0,0,3,4,1,0,2,1,1,0,2,1,0,0,0,1,0] . Она имеет

  • 5 прогонов 0 и 5 вхождений 1 ,
  • 4 прогона из 1 и 2 вхождения по 2 ,
  • 2 прогона 2 и 1 вхождение 3 ,
  • 1 прогон 3 и 1 вхождение 4 ,
  • 1 прогон из 4 и без 5 случаев ,
  • нет вхождений других целых чисел.

Задание

Ваша задача - решить, является ли список самоограниченным. Более конкретно, ваш ввод должен быть непустым списком неотрицательных целых чисел. Если список самоограничен, ваш вывод должен быть правдивым; в противном случае это должно быть ложно. Ввод и вывод могут быть в любом разумном формате.

Наименьшее количество байтов в каждом языке программирования является победителем. Применяются стандартные правила .

Контрольные примеры

Истинные случаи:

[0]
[1,0]
[0,1,1,0,2]
[3,1,1,0,0,2,0,0]
[5,0,4,1,3,0,2,2,0,1,1,1,0]
[0,0,1,1,0,0,1,1,0,0,2,2,0,0]
[6,0,0,0,2,2,1,0,5,0,3,4,0,1,1,1]
[5,0,1,0,0,0,0,4,0,3,1,1,1,2,2,0,0,0,0,0]
[4,5,1,3,2,0,5,2,0,3,0,1,0,1,0,0,0,1,0,0,1,0,3,4,4,0,2,6,0,2,6]
[0,4,1,3,10,6,0,1,3,7,9,5,5,0,7,4,2,2,5,0,1,3,8,8,11,0,0,6,2,1,1,2,0,4]

Ложные случаи:

[2]
[1,1,0]
[0,0,1,1,1,0,0,2]
[0,1,0,1,1,2,2,3,0,0,4,6]
[1,1,2,1,2,0,2,0,3,0,0,2,2,1,2,3,2,0,1,1,1,0,0,3,3,0]
[3,4,1,0,0,0,5,5,0,2,2,0,0,0,0,0,2,0,1,1,0,4,3,5,4,3]
[1,0,0,0,2,5,3,1,1,0,3,3,1,3,5,4,0,4,0,0,2,0,2,1,1,5,0,0,2,4,4,0,2,0,1,4,4,2,3,3,5,3,4,0,2,0,5]
[4,3,1,0,0,4,6,6,1,0,1,2,1,3,0,1,0,2,0,3,4,0,2,1,1,3,0,2,2,2,0,5,5,0,5,2,5,5,0,4,3,2,3,1,1,3,5,1,4,1,6,2,6,2,4,0,4,0,4,5,3,3,0,0,6,1,0,0,0,6,2,1,0,1,2,6,2,4]
[5,1,1,1,0,2,0,6,1,0,2,1,2,2,5,3,1,0,0,0,3,2,3,0,1,1,0,1,0,1,1,2,0,6,4,1,2,1,1,6,4,1,2,2,4,0,1,2,2,1,3,0,1,2,0,0,0,2,0,2,2,0,1,0,0,1,3,0,0,0,6,2,0,1,0,1,2,1,1,1,0,4,0,0,5,2,0,0,0,4,1,2,2,2,2,0,5,3,2,4,5,0,5]

Не беспокойтесь, но, пожалуйста, рассмотрите возможность использования одного из подходов из этого мета-обсуждения вместо правдивости / ложности, поскольку правдивость не является свойством более чем пары часто используемых здесь языков.
FryAmTheEggman

@LeakyNun Да, в противном случае условие не выполняется для тех N, для которых N-1 отсутствует.
Згарб

@ Mr.Xcoder Там [2]тоже, но такие случаи должны быть ложными, да.
Эрик Outgolfer

@FryAmTheEggman Я не видел эту дискуссию, спасибо за ссылку. Я оставлю эту проблему такой, какой она есть, потому что я хочу обработать обсуждаемые там подходы некоторое время.
Згарб

Конечно, но я бы хотел оставить здесь комментарий, так как чувствую, что многие его пропустили. Это имеет большое значение, по крайней мере для меня, в публикации на таких языках, как Retina.
FryAmTheEggman

Ответы:


5

Perl 6 , 29 байт

{bag(.grep(?*)X-1)⊆.squish}

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

Очень хорошая задача для Perl 6. Использует оператор подмножеств в Bags (целочисленные множества). Объяснение:

{
    bag(           # Create bag of
        .grep(?*)  # non-zero elements,
        X- 1       # decremented by one.
    )
                  # Subset test.
    .squish        # "squish" removes repeated elements in each run.
                   # The result is implicitly converted to a bag
                   # counting the number of runs.
}

1
Прекрасный. Я видел подход Bag + subset, но остановился на том, с чем сравнивать.
Фил Х

3

JavaScript (ES6), 92 89 байт

a=>a.map(n=>g(~n,n!=p&&g(p=n)),c=[j=0],p=g=n=>c[n]=-~c[n])&&!c.some((n,i)=>i-j++|n<c[~j])

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

Как?

Массив c [] используется для хранения как количества прогонов, так и числа целочисленных вхождений. Прогоны хранятся с неотрицательными индексами, а целочисленные вхождения - с индексами 1-го дополнения ( c [-1] = число 0 , c [-2] = число 1 и т. Д.).

Отрицательные индексы фактически сохраняются как свойства базового объекта массива, и .some () не выполняет их итерацию.

a =>                        // given the input array a[]
  a.map(n =>                // for each value n in a[]:
    g(                      //   update c[]:
      ~n,                   //     increment c[~n] (# of integer occurrences)
      n != p && g(p = n)    //     if n != p, set p to n and increment c[n] (# of runs)
    ),                      //   end of c[] update
    c = [j = 0],            //   start with c = [0] and j = 0 (used later)
    p =                     //   initialize p to a non-numeric value
    g = n => c[n] = -~c[n]  //   g = helper function to increment c[n]
  )                         // end of map()
  && !c.some((n, i) =>      // for each value n at position i in c[]:
    i - j++ |               //   make sure that i == j++
    n < c[~j]               //   and n is greater than or equal to c[~j]
  )                         // end of some()


3

Желе , 10 байт

œ-ŒgḢ€‘ƊS¬

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

Как это устроено

œ-ŒgḢ€‘ƊS¬  Main link. Argument: A (array)

       Ɗ    Drei; group the three links to the left into a monadic chain.
  Œg          Group consecutive, identical elements of A into subarrays.
    Ḣ€        Head each; pop the first element of each run.
      ‘       Increment the extracted integers.
            The resulting array contains n repeated once for each run of (n-1)'s.
œ-          Perform multiset subtraction, removing one occurrence of n for each
            run of (n-1)'s.
       S    Take the sum. If only 0's remain, the sum will be 0.
        ¬   Take the logical NOT, mapping 0 to 1 and positive integers to 0.





2

Stax , 13 9 байт

Деннис нашел гораздо лучший алгоритм . Я безбожно портировал его на Stax.

ä╨²@┬↕OR♣

Запустите и отладьте его онлайн

Распакованный, распакованный и прокомментированный, вот как это выглядит.

c   copy input
:g  get run elements
{^m increment each
|-  multiset-subtract from original input
|M! get maximum from result, and apply logical not

Запустите этот

Старый ответ:

║Ä|╤#╫∩▼cëózü

Запустите и отладьте его

Он перебирает ввод и проверяет условия:

  • Элемент > 0?
  • Является occurrences(element) >= runs(element - 1) ?

Если какое-либо из этих условий выполняется для элемента, то этот элемент является совместимым. Если все элементы соответствуют, результат1 .

Вот распакованное, разархивированное, закомментированное представление той же программы.

O           push 1 under the input
F           iterate over the input using the rest of program
  |c        skip this iteration of the value is 0
  x#        number of occurrences of this value in input (a)
  x:g _v#   number of runs of (current-1) in input (b)
  >!        not (a > b); this will be truthy iff this element is compliant
  *         multiply with running result

Запустите этот


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