Запровадити лінивий сортування крапель


26

Цей виклик уже описує дрозорт. Однак я ніби лінивий, і мені справді потрібен лише мій масив, щоб бути трохи більш відсортованим, ніж раніше, його не потрібно сортувати весь шлях .

У Drop Sort ми скидаємо кожен елемент менше, ніж будь-який елемент перед ним. У режимі "Ледачий сортування" ми скидаємо кожен елемент менше, ніж той, який суворо передує йому.

Ось приклад. Розглянемо наступний масив:

8 6 9 9 7 2 3 8 1 3

Позначимо кожен елемент менше, ніж один перед ним.

8 6 9 9 7 2 3 8 1 3
  ^     ^ ^     ^

Зверніть увагу, як ні 3відмічено, ні останнє 8. Всі вони більше, ніж одиничний елемент зліва від них.

Виконуючи алгоритм, видаляючи позначені елементи, отримуємо:

8 9 9 3 8 3

Це в основному виглядає більш відсортованим. Свого роду. Я ледачий.

Ваше завдання, як ви, можливо, вже зробили, - реалізувати цей алгоритм.

Введення - це масив щонайменше з 1 додатного цілого числа між 1 і 9, тому ви також можете взяти рядок цифр.

Це , найменше виграш байтів!

Додаткові тестові випадки:

1
1

1 2 3
1 2 3

5 3 1
5

1 2 3 2 1
1 2 3

1 1 1 9 9 9 1 1 1 9 9 9 1 1 1
1 1 1 9 9 9 1 1 9 9 9 1 1

9 9
9 9

5 2 4 2 3
5 4 3

Це може бути функція або це повинна бути повноцінна програма?
rafa11111

@ rafa11111 Або добре
Павло

У випадку, якщо це функція, чи може вхідний масив бути жорстко кодованим в основній програмі? І чи може довжина масиву передаватися як вхід до функції?
rafa11111

@ rafa11111 Вхід не може бути жорстко кодований у самій функції. Не має значення, як функція отримує цей вхід у вашій тестовій програмі. Ви можете взяти довжину масиву, лише якщо ви використовуєте C / C ++ або іншу мову, де це єдиний спосіб визначити довжину масиву.
Павло

Відповіді:



15

JavaScript (ES6), 28 25 байт

Збережено 3 байти завдяки @Shaggy

a=>a.filter(n=>~-a<(a=n))

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


2
n=>p<=nвиглядало б приголомшливо ;-)
ETHproductions

4
@ETHproductions За +4 байти, (n=p)=>p<=(p=n)працює чудово;)
Арнольд

ця відповідь роздуває мій погляд, чому це не вибухає при спробі доступу pвперше, коли це ще не визначено?
Брайан Х.

1
@Shaggy Це виглядає безпечно. Оновлюється, коли я повернусь перед комп'ютером. Спасибі!
Арнольд

2
@Pavel aспочатку встановлюється на вхідний масив і a-1призведе до NaN(якщо він не містить єдиного цілого числа; у цьому випадку він примусовий до цього цілого числа).
Арнольд


6

MATL , 9 8 байт

Збережено один байт завдяки Джузеппе.

0yd0<h~)

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


Пояснення:

0                 % Push a zero
 y                % Implicitly grab the input and duplicate it.
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [8 6 9 9 7 2 3 8 1 3]
  d               % The difference between each number of the last element:
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [-2, 3, 0, -2, -5, 1, 5, -7, 2]
   0<             % Which are negative?
                  % Stack: [8 6 9 9 7 2 3 8 1 3], 0, [1 0 0 1 1 0 0 1 0]
     h            % Concatenate. Stack: [8 6 9 9 7 2 3 8 1 3], [0 1 0 0 1 1 0 0 1 0] 
      ~           % Negate. Stack: [8 6 9 9 7 2 3 8 1 3], [1 0 1 1 0 0 1 1 0 1]
       )          % Index. Stack: [8 9 9 3 8 3]

5

Perl 5 .10.0 + -nl, 16 байт

$f>$_||say;$f=$_

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


1
Переклад на Perl 6perl6 -ne '$/>$_||.say;$/=$_'
Бред Гілберт b2gills

@Brad perl6 - це інша мова (вона навіть не сумісна з зворотним ходом).
wastl

Я написав той, який був більш ідіоматичним Perl 6, але він був довшим. Також однією з причин, яку я публікую тут, є показати мову та пояснити її. Опублікування цього перекладу не означає нічого, крім того, що це трохи більш багатослівна версія Perl. В основному це не задовольняє жодної з причин, чому я розміщую повідомлення на цьому сайті.
Бред Гілберт b2gills



4

Стакс , 5 байт

âÿ╠╦░

Запустити та налагодити це в Інтернеті

Розпаковуючи, скасовуючи та коментуючи код, ми отримуємо це.

Z   Push a zero under the input
f   Use the rest of the program as a filter on the input.  Output passing elements.
>   Current element is greater than previous?
_~  Push current element to the input stack; when the main stack is empty, pops fall back to this
!   Logical not; applies to the result of the greater-than

Виконати цей

Упорядкування інструкцій незручне, але в цьому є причина. Упаковка вихідного коду Stax не завжди дає вихід однакового розміру для одного і того ж розміру. В основному, у вас є шанс зберегти байт, якщо останній символ джерела має менший код символів. Ну, !є один з найнижчих кодів, який можна отримати для друку. (33 конкретно) Багато 6-байтних програм ASCII Stax не можуть спакувати менші розміри. Але якщо вони закінчуються символом a !, вони можуть. Отже, причиною цього конкретного впорядкування інструкцій є те, щоб логічне не закінчилося в кінці програми.


4

J, 12 байт

#~1,2&(<:/\)

Пояснення:

#~1,2&(<:/\)    | Whole function, executed as a hook
       <:/      | Distribute <: (greater or equal) over an array
    2&(   \)    | Apply to each sub array of length 2
  1,            | Append a 1 to the front
#~              | Choose elements from the original array

Приклади:

    2&(<:/\) 8 6 9 9 7 2 3 8 1 3
0 1 1 0 0 1 1 0 1
    1,2&(<:/\) 8 6 9 9 7 2 3 8 1 3
1 0 1 1 0 0 1 1 0 1
    (1 0 1 1 0 0 1 1 0 1) # 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3
    f =: #~1,2&(<:/\)
    f 8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

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


Приємне рішення! Я додав посилання TIO для вашого коду.
Гален Іванов


4

Ява 8, 66 55 48 байт

l->{for(int i=0;;)if(i>(i=l.next()))l.remove();}

-11 байт після підказки від @ OlivierGrégoire .
-7 більше байт завдяки @ OlivierGrégoire .

Пояснення:

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

l->{                     // Method with Integer-ListIterator parameter and no return-type
  for(int i=0;;)         //  Loop over all items
    if(i>(i=l.next()))   //   If the current item is larger than the next
      l.remove();}       //    Remove this next item

Чому всі починають використовувати, ~0коли це в основному -1. Особисто я вибрав би більш інтуїтивне рішення, якщо кількість байтів буде однакової довжини (за винятком while(...)vs for(;...;), в такому випадку я віддаю перевагу for. Але, дякую, ще -7 байт. :)
Кевін Круїссен

Це тому, що мені погано з 2-єм доповненням ... Мені так погано, що я хотів мати на увазі Integer.MIN_VALUE(що тоді 1<<31, я думаю, ...) ;-)
Олів'є Грегоар

4

Октава , 21 байт

@(x)x(~[0,diff(x)<0])

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

Пояснення:

Візьміть вектор xяк вхідний і створіть вектор [0, diff(x)<0], деdiff(x) вектор з різницею між усіма сусідніми елементами. Зберігайте лише ті негативні, порівнюючи їх до нуля, подаючи нам список усіх елементів, які ми хочемо скинути.

Потім вибираємо елементи з вхідного вектора, який ми хочемо зберегти.


4

V , 25 байт

òjälá k$yl+@"òç-/d
ç /dw

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

Hexdump:

00000000: f26a e46c e120 6b24 796c 2b40 2218 f2e7  .j.l. k$yl+@"...
00000010: 2d2f 640a e720 2f64 77                   -/d.. /dw

Найгірша мова для роботи. Але я це зробив на сміливість .


6
Примітка сторони: Ойала іспанська для ми сподіваємося .
Денніс

2
@dennis Це круто. Для чого k$yl+@"òç-/dіспанська мова?
DJMcMayhem

7
k$yl+@"òç-/dможе бути вільно перекладено як Ой, хто, чорт забирав, двері шафи відчинені?
Луїс Мендо

3

Трикутність , 71 байт

.....).....
....IEL....
...)rFD)...
..2+)IE)w..
.+h)2_stDO.
={M)IEm}...

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

Як це працює?

) IEL) rFD) 2+) IE) w + h) 2_stDO = {M) IEm} - Повна програма.
) IE - Отримайте 0-й вхід I і оцініть його.
   L) r - І натисніть на діапазон [0 ... довжина I).
      F {- Фільтр цілих чисел у цьому діапазоні, які задовольняють:
       Г) 2+) IE) w + h) 2_stDO = - Ця умова. Запускає кожен елемент Е окремо
                                    складати та відкидати ті, які не відповідають критеріям.
       D) 2+ - Скопіюйте та додайте 2 до другого примірника.
           ) IE - Отримати знову.
              ) - Натисніть 0 на стек.
               w - Загорніть 0 у список. [0]
                + - Додайте його до я.
                 h - Голова. Обріжте елементи після індексу Е + 2.
                  ) 2_ - Буквальний -2.
                     st - Хвіст.
                       DO = - Перевірте, чи результат інваріантний щодо сортування.
                           М) IEm} - Остання частина: індексація на вхід.
                           M} - для кожного індексу, який відповідає умовам:
                            ) IEm - витягніть елемент I у цій позиції.

2
З цікавості (оскільки ви творець трикутності): чому б не зробити щось подібне, як «Гексагонія / Кубічно», де фрагмент коду автоматично заповнюється крапками без відключення? Отже, ця програма буде, )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}яка розшириться до вашої нинішньої відповіді?
Кевін Кройсейсен

@KevinCruijssen Тому що я насправді планував зробити «Трикутність» 2D езоланг, але я відмовився від ідеї, тому просто дотримувався попереднього шаблону. Думаю, що незабаром я внесу деякі основні зміни, коли випущу Triangularity v2. (Крім того, цікаво грати в нього в його теперішньому вигляді, адже простий 1-байтовий збереження в рядку може замість цього заощадити 20: D ... Це також застосовується заднім числом, коли виправляєте речі: C)
Містер Xcoder

Ну, навіть якщо ви плануєте випускати його як 2D езоланг, мій коментар все ще залишається (дещо). )IEL)rFD)2+)IE)w+h)2_stDO={M)IEm}буде вашим кодом, він розшириться на ваш поточний шаблон, а потім виконайте 2D команди на цьому розширеному шаблоні. EDIT: .....).....\n....IEL....\n...)rFD)...\n..2+)IE)w..\n.+h)2_stDO.\n={M)IEm}...і .....).........IEL.......)rFD).....2+)IE)w...+h)2_stDO.={M)IEm}...і)IEL)rFD)2+)IE)w+h)2_stDO={M)IEm} буде все три бути точно такою ж програмою.
Кевін Кройсейсен

3

Пітон , 40 байт

f=lambda h,*t:t and h+f(*t)[h>t[0]:]or h

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

Введіть як кортеж символів.


Python 3 , 41 байт

p=''
for x in input():x<p or print(x);p=x

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

Рядок введення.


Python 2 , 41 байт

for x in input():
 if x>=id:print x
 id=x

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

Введення рядків, лише тому, що рядків більше, ніж id але число менше.


3

Мова Вольфрама (Mathematica) , 33 байти

Pick[#,Arg[#-{0}~Join~Most@#],0]&

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

Як це працює

Код # - {0}~Join~Most@#перетворює масив {a,b,c,d,e,f}у {a,b-a,c-b,d-c,e-d,f-e}. Застосовуючи Argдо цього, встановлюється від'ємні числа до, Piа невід'ємні числа - 0.

Pick[#, ..., 0]&вибирає записи, #де ...є 0: у нашому випадку - саме ті елементи, які дають негативне число, коли ви віднімаєте попередній елемент. Іншими словами, це саме записи, які ми хочемо зберегти під час ліниводства.


3

Диво , 27 байт

-> ':1.!> 'sS#<=.cns2.++[0]

Приклад використання:

(-> ':1.!> 'sS#<=.cns2.++[0])[8 6 9 9 7 2 3 8 1 3]

Пояснення

Безгольова версія:

(map get 1).(fltr sS <=).(cns 2).(++ [0])

Попередньо 0, отримати список послідовних пар, зберегти елементи списку, де перше число <= друге число, отримати друге число кожної пари.


3

Мова Вольфрама (Mathematica) , 20 байт

#&@@@Split[#,##>0&]&
(* or *)
Max/@Split[#,##>0&]&

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

Пояснення

Input = {8, 6, 9, 9, 7, 2, 3, 8, 1, 3}

Split[#,##>0&]

Групуйте послідовні елементи, які суворо зменшуються: {{8, 6}, {9}, {9, 7, 2}, {3}, {8, 1}, {3}}

#&@@@

Візьміть перший елемент кожного: {8, 9, 9, 3, 8, 3}


##>0це фантазія і все, але це насправді нічого не економить #>#2тут;) (що змусить вашу програму працювати з довільними цілими числами, але не те, що потрібно).
Мартін Ендер


3

SWI-Prolog, 44 байти

[A,B|C]-[A|E]:-B<A,[B|C]-[B|E];[B|C]-E. L-L.

Використання: виклик " Список -X", де Список - це скоплений дужкою список, розділений комами, наприклад [1,4,5,1,11,6,7].


1
Ласкаво просимо на сайт! :)
DJMcMayhem

2

APL + WIN, 14 байт

Підказки для введення екрану вектора цілих чисел.

(1,1>2-/v)/v←⎕




2

К4 , 10 байт

Рішення:

x_/|&<':x:

Приклад:

q)k)x_/|&<':x:8 6 9 9 7 2 3 8 1 3
8 9 9 3 8 3

Пояснення:

Знайдіть індекси, де елемент менше попереднього, видаліть ці індекси з вхідних даних

x_/|&<':x: / the solution
        x: / store input as x
     <':   / less-than each-previous
    &      / indices where true
   |       / reverse
 _/        / drop-over
x          / the input

2

Attache , 24 байти

{Mask[1'(Delta!_>=0),_]}

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

Пояснення

Maskвибирає всі елементи зі свого другого аргументу, які відповідають правдивим елементам у першому аргументі. 1'(Delta!_>=0)обчислює індекси, які відповідають елементам, які повинні бути в кінцевому масиві.

Інші спроби

28 байт (pointfree): ~Mask#(1&`'##Delta#`>=#C[0])

32 байти: {Mask[1'(&`<= =>Slices[_,2]),_]}


2

C # (.NET Core) , 33 + 18 = 51 байт

x=>x.Where((a,n)=>n<1||x[n-1]<=a)

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

в основному висловлювання полягає в тому, де x - перший int в масиві, або більше або дорівнює попередньому номеру, зберігайте його. Інше киньте його.


1
Ви можете повернути IEnumerable. Не ToArray()потрібно.
Павло

@Pavel Мені потрібно додати додаткову посилання System.Collections, і це заперечує всі байти, збережені для видалення ToArray().
Dennis.Verweij

Ні, оскільки ви не будете посилатися IEnumerableу відповіді, просто використовуючи її як тип повернення.
Павло

@Pavel добре, дякую, іноді я трохи не впевнений, коли порахувати байти чи ні ... вибачте
Dennis.Verweij


1

Желе , 9 байт

0;>ƝżµḢÐṂ

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

Це відчуває себе досить об'ємно, не здивувало б, якщо є кращий спосіб.

0;>ƝżµḢÐṂ
   Ɲ       For each adjacent pair in the input...
  >        ...is the first element greater than the second? (yields a list of 0/1)
0;         prepend a zero to this list (always keep the first element)
    ż      zip with the input
     µ     new monadic link
       ÐṂ  keep elements of the list with minimal value of... (Ðḟ would have worked here and been slightly more clear but I'll leave it as it is)
      Ḣ    ...their first element

1

Мозг-Флак , 136 , 120 байт

((())){{}([{}]({}))([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}{{}(({})<>)(())(<>)}{}([][()])}{}{}<>{{}({}<>)<>}<>

Тут він відформатований і "читабельний" .

((()))
{
    {}

    ([{}]({}))

    ([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

    {
        {}(({})<>)(())(<>)
    }

    {}

    ([][()])

}{}{}<>

{
    {}
    ({}<>)<>
}<>

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

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