Обмежте свої номери за допомогою пробігу


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,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]теж є, але такі випадки повинні бути хибними, так.
Ерік Аутгольфер

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

Звичайно, але я хотів би залишити коментар там, оскільки я відчуваю, що багато людей його пропустили. Принаймні для мене це має значення, принаймні для мене, при публікації таких мов, як Retina.
FryAmTheEggman

Відповіді:


5

Perl 6 , 29 байт

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

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

Дуже приємний виклик для Perl 6. Використовує оператор підмножини на сумках (цілочисельні зважені набори). Пояснення:

{
    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 +, але застряг у порівнянні.
Філ Х

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 's, c [-2] = число 1 ' s тощо).

Негативні індекси фактично зберігаються як властивості базового об’єкта масиву, і .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

Стакс , 13 9 байт

Денніс знайшов набагато кращий алгоритм . Я безсоромно переніс це в Стакс.

ä╨²@┬↕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.