Алгоритм підрахунку зворотного збору


14

Діти, які вчаться рахувати, часто знають прогони чисел, але, здається, не можуть правильно їх скласти.

Наприклад, вони можуть сказати:

1,2,3,4,7,8,9,10

Іноді діти зрозуміють, що вони пропустили деякі цифри, і повернуться назад:

1,2,3,4,7,8,5,6,7,8,9,10

Це, очевидно, найкраща модель. Нам потрібно їх ідентифікувати.

Щоб визначити ці списки:

  1. Ми визначаємо мінімум Mта максимум Nсписку

  2. Ми переходимо через список. Якщо поточне число більше або дорівнює будь-якому члену списку праворуч, ми видаляємо поточне число.

  3. Якщо решта списку містить усі числа від Mдо N, то ми повертаємо триєдне значення.

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

Тестові приклади:

Truthy:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

Фальсі:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

Це , тому робіть свої відповіді якомога коротшими!


Не дуже зрозуміло: чи слід [0,1,2,3,4,5,4,3,2,1] вважати правдивим чи хибним?
ГБ

1
@GB False. Коли ви знаходитесь на другому елементі, ви видалите його на кроці 2 (тому що 1пізніше внизу є лінія). Ви також видалите всі інші елементи (за винятком останнього 1), щоб ви закінчилися 0 1, чого немає0 1 2 3 4 5
Натан Меррілл

Відповіді:


6

05AB1E , 5 байт

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

Ú¥1QP

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

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results


2
@val Ні, 05AB1E використовує спеціальне кодування, 05AB1E.
Ерік Аутгольфер

2

Желе , 10 9 байт

ṀrṂɓṚ«\Q⁼

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

Як це працює

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

Цікаво, чи ɓвідносно нова особливість?
ETHproductions

Так, це із запиту на притягнення Джонатана Аллана.
Денніс

Ага, 13 днів тому. Я ще не бачив, щоб він використовувався, хоча (можливо, ви чи Джонатан, і я просто пропустив це).
ETHproductions

Справді цікава частина тут, «\на мій погляд, хоча.
Ерік Аутгольфер



1

PHP , 148 130 байт

-18 байт, дякую @Christoph

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

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


Добре багато тут коментувати: $argnзавжди рядок foreachне працює на ньому. Ви можете використовувати $argvмасив як вхід, але будьте уважні, що він завжди містить ім'я файлу як перший елемент. Ви можете використовувати $mі $nтільки один раз , так що ви можете заощадити багато байт , створюючи $bраніше: $b=range(min($a),max($a));. Кидок (bool)є укомплектувати непотрібним. if($k>=$a[$s])$a[$i]=null;до $k<$a[$s]?:$a[$i]=-1;. Використовуючи посилання, ми можемо зробити це: foreach($a as$i=>&$k)(+1 байт) і $a[$i]до $k(-4 байт). Більше того, це дозволяє нам кинутись, $s=$iтому що ми можемо ітератувати $iпрямо зараз.
Крістоф

Результат виглядає приблизно так $a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117 байт). Але вона все ще використовується $argnнеправильно. $a=explode(' ',$argn);виправить це за 13 додаткових байтів.
Крістоф

1
Без проблем ! Завжди приємно знайти нового гольфіста на PHP. Я сподіваюся побачити більше вас :) Або Тит, Йорг або я завжди готові допомогти!
Крістоф

1
@Christoph Чому б не використовувати $_GETяк вхідний масив? У цьому випадку немає необхідності використовувати explodeadditonal -6 байт для використання не $bзмінної
Jörg Hülsermann

1
@Christoph Гаразд У цьому випадку нам потрібна версія під 7.1 і ми використовуємо ´a & `замість ~ спробувати її в Інтернеті!
Йорг Гюльсерманн

1

Java 8, 264 262 байти

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

Пояснення:

Спробуйте тут.

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R, 88 85 байт

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

Це, ймовірно, може бути в гольф далі. Петля над елементами x, перевіряє, чи є всі майбутні значення більшими, і лише потім зберігає цей елемент. Після циклу він створює послідовність від min(x)до max(x)та перевіряє, %in%чи всі значення включені у обрізану версію x.


Передавши відповідь Денніса, ми змогли зійти до 53 байт. function(n)all(unique(cummin(rev(n)))==max(n):min(n))
Джузеппе

1

JavaScript (ES6), 60 байт

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

Безголівки:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

Це більш простий алгоритм:

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

Фрагмент:


1

Хаскелл, 62 байти

g(a:b)=[a|all(a<)b]++g b
g a=a
f x=g x==[minimum x..maximum x]

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

Пряма реалізація визначення, де gвилучають елементи, якщо вони> =, ніж елементи праворуч.


1

C #, 69 байт

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

Коротше кажучи:
s = рівняння входу (s) береться
з елемента s, де для всіх елементів після цього (пропустити (I) ndex + 1 пункт), поточне значення вище
порахуйте їх, і подивіться, чи залишилася сума дорівнює очікуваній сумі ((max) imum значення мінус (min) imum) кількість чисел

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


@MDXF Ви хочете його вітати?
Стен Струм

@StanStrum я неправильно зрозумів правила? моя англійська занадто безладна? я -ам - розміщую вперше ...
Barodus

Ні ні! Це привітання привітати новачка в PPCG, і я запитав у нього, чи хотів би він сказати привіт вам
Стен Струм

Схоже, що привілей вам обом. Дякую, люди ^^
Barodus

Це відмінна перша відповідь, сподіваюся, вам буде весело в майбутньому PPCG!
Стен Струм

0

JavaScript (ES6), 82 73 72 70 байт

Повертається булева.

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

Як?

Ми повторюємо кожен елемент x вхідного масиву a , відстежуючи максимальне зустрічається значення m та число -k значень, яке не більше або дорівнює жодному члену праворуч. За визначенням, дійсні значення відображаються у суворому порядку.

Ми використовуємо, filter()а не map()так, що всі елементи фільтруються, поки k не стане негативним. Це дозволяє нам виділити перший дійсний елемент, який також гарантовано є мінімальним значенням масиву.

Нарешті ми перевіряємо, чи minimum - (maximum + 1) == -number_of_valid_elements:

a.filter(...)[0] + ~m == k

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.