Зворотні непарні прогони


17

Натхнення .

Завдання

Зворотні прогони непарних чисел у заданому списку від 2 до 2 15 невід’ємних цілих чисел.

Приклади

0 1 →  0 1
1 3 →  3 1
1 2 3 →  1 2 3
1 3 2 →  3 1 2
10 7 9 6 8 9 →  10 9 7 6 8 9
23 12 32 23 25 27 →  23 12 32 27 25 23
123 123 345 0 1 9 → 345 123 123 0 9 1


4
1. Я зрозумів виклик лише після перегляду прикладів. Я думаю, що прогони непарних цілих чисел будуть чіткішими, ніж послідовності . 2. Я не думаю, що встановлення явної верхньої межі є хорошою справою. Якщо мова має лише 8-бітні цілі числа, брати участь буде набагато важче.
Денніс

Крім того, я не впевнений, до чого відноситься подальше числове обчислення . Це означає, що я не можу повернути незмінний кортеж або просто надрукувати цифри?
Денніс

@Dennis Оновлено, як ви запропонували. Це запобігання вводу / виводу як рядок. Будь-яка пропозиція щодо кращого формулювання?
Адам

4
Чому ви хочете запобігти виведенню рядків?
Денніс

2
Так, дивлячись на інший виклик, більшість відповідей спираються на поділ на нулі, тоді як тут вам доведеться розділити за умовою, до якої більшість мов не має вбудованої.
xnor

Відповіді:


8

Python 2, 75 68 63 байт

5 байт завдяки Деннісу.

І я перемогла Денніса .

Кредити Byeonggon Лі для ядра алгоритму.

o=t=[]
for i in input():o+=~i%2*(t+[i]);t=i%2*([i]+t)
print o+t

Ідей це!

Стара версія: 75 байт


Зв'язали, справді. Також я рахую 81, а не 75. Я здогадуюсь, що ви порахували це вкладками, але редактор SE заповнив пробіли.
DJMcMayhem

@DrGreenEggsandIronMan Ваша здогадка правильна. Вкладки для читабельності. Або порахуйте джерело або порахуйте ідеоне.
Leaky Nun

1
printне потребує паронів. Крім того, ви використовуєте лише aодин раз, тому немає необхідності в змінній.
Денніс


5

APL, 21 20 байт

{∊⌽¨⍵⊂⍨e⍲¯1↓0,e←2|⍵}

Спробуйте || Усі тестові справи

Пояснення:

                  2|⍵ Select all the odd numbers
                e←    Save that to e
              0,      Append a 0
           ¯1↓        Delete the last element
         e⍲           NAND it with the original list of odd numbers
     ⍵⊂⍨             Partition the list: (even)(even)(odd odd odd)(even)
  ⌽¨                 Reverse each partition
 ∊                    Flatten the list

Редагувати: Збережено ~подяку законам Де Моргана


1
Привіт, і ласкаво просимо до PPCG! Це хороший пост.
NoOneIsHere

5

Haskell, 46 44 байти

h%p|(l,r)<-span(odd.(h*))p=l++h:r
foldr(%)[]

Дякуємо @xnor за те, що розпізнала складку та зберегла два байти.


Хороший метод, особливо (h*)! Ви можете зберегти байт у базовому регістрі, записавши f x=xдругий, щоб відповідати порожньому списку, хоча він виглядає як a foldrще коротший h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]::
xnor

Я знав, що це просто foldrврешті-решт! Дякую.
Лінн

4

Желе , 10 байт

Ḃ¬ðœpUżx@F

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

Ḃ¬ðœpUżx@F  Main link. Argument: A (array)

Ḃ           Bit; return the parity bit of each integer in A.
 ¬          Logical NOT; turn even integers into 1's, odds into 0's.
  ð         Begin a new, dyadic link.
            Left argument: B (array of Booleans). Right argument: A
   œp       Partition; split A at 1's in B.
     U      Upend; reverse each resulting chunk of odd numbers.
       x@   Repeat (swapped); keep only numbers in A that correspond to a 1 in B.
      ż     Zipwith; interleave the reversed runs of odd integers (result to the
            left) and the flat array of even integers (result to the right).
         F  Flatten the resulting array of pairs.

4

Python 2, 78 75 байт

def r(l):
 def k(n):o=~n%2<<99;k.i+=o*2-1;return k.i-o
 k.i=0;l.sort(key=k)

Супер хакі :)


що таке k.i?
Leaky Nun

@LeakyNun k.i=0в останньому рядку. Це просто змінна.
orlp

Я не розумію. Є kі k.iпов'язані?
Leaky Nun

@LeakyNun No. k.i- стійка змінна між викликами k. Розглядайте це як імпровізований глобальний, не використовуючи globalключове слово.
orlp

4

Python3, 96 байт

Збережено багато байт завдяки Leaky Nun!

o=l=[]
for c in input().split():
 if int(c)%2:l=[c]+l
 else:o+=l+[c];l=[]
print(" ".join(o+l))

3

C, 107 байт

i;b[65536];f(){for(;i;)printf("%d ",b[--i]);}main(n){for(;~scanf("%d",&n);)n%2||f(),b[i++]=n,n%2||f();f();}

3

MATL , 20 байт

TiodgvYsG8XQ!"@gto?P

Вхід - це масив стовпців, який використовується ;як роздільник.

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

Пояснення

Розглянемо в якості прикладу вхідний масив [1;2;3;5;7;4;6;7;9]. Перша частина коду, Tiodgvперетворює цей масив у [1;1;1;0;0;1;0;1;0], де 1вказує на зміну паритету . (Зокрема, код отримує паритет кожного запису вхідного масиву, обчислює послідовні відмінності, перетворює ненульові значення на 1і попереджує a 1.)

Потім Ysобчислює сукупну суму , даючи [1;2;3;3;3;4;4;5;5]. Кожне з цих номерів буде використовуватися як мітка , на основі якої будуть впорядковані елементи введення . Це робиться шляхом G8XQ!, який розбиває вхідний масив на масив комірок, що містить групи. У цьому випадку він дає {[1] [2] [3;5;7] [4;6] [7;9]}.

Решта коду ітераціює ( ") на масиві комірок. Кожен складовий числовий масив висувається з @g. toробить копію та обчислює її паритет . Якщо ( ?) результат є truthy, тобто вміст масиву непарний, масив перевертається ( P).

Стек неявно відображається в кінці. Відображається кожен числовий вертикальний масив із поданням списку чисел, розділених новими рядками.


2

Піт, 14 байт

s_McQshMBx0%R2

           %R2Q   Take all elements of the input list modulo 2
         x0       Get the indices of all 0s
      hMB         Make a list of these indices and a list of these indices plus 1
     s            Concatenate them
   cQ             Chop the input list at all those positions
 _M               Reverse all resulting sublists
s                 Concatenate them

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


2

J , 33 31 30 байт

[:;]<@(A.~2-@|{.);.1~1,2|2-/\]

Використання

   f =: [:;]<@(A.~2-@|{.);.1~1,2|2-/\]
   f 0 1
0 1
   f 1 3
3 1
   f 1 2 3
1 2 3
   f 1 3 2
3 1 2
   f 10 7 9 6 8 9
10 9 7 6 8 9
   f 23 12 32 23 25 27
23 12 32 27 25 23
   f 123 123 345 0 1 9
345 123 123 0 9 1

2

C #, 179 178 177 байт

s=>{var o=new List<int>();var l=new Stack<int>();foreach(var n in s.Split(' ').Select(int.Parse)){if(n%2>0)l.Push(n);else{o.AddRange(l);o.Add(n);l.Clear();}}return o.Concat(l);}

Я використовую лямбда C #. Ви можете спробувати .NETFiddle .

Код менш мінімізований:

s => {
    var o=new List<int>();var l=new Stack<int>();
    foreach (var n in s.Split(' ').Select(int.Parse)) {
        if (n%2>0)
            l.Push(n);
        else {
            o.AddRange(l);
            o.Add(n);
            l.Clear();
        }
    }
    return o.Concat(l);
};

Kudos to Byeonggon Lee за оригінальний алгоритм.


1
Ви можете опустити пробіл у foreach(varта змінити, if(n%2==1)щоб if(n%2>0)зберегти 2 байти (або фактично 1, оскільки ваша поточна відповідь - 179 байт замість 178).
Кевін Кройсейсен

@KevinCruijssen Він був змінений у розділі з менш зручним, але не в мініфікованому. Також дякую за простір foreach!
aloisdg переходить на codidact.com


1

118 байт TSQL

DECLARE @ TABLE(i int identity, v int)
INSERT @ values(123),(123),(345),(0),(1),(9)

SELECT v FROM(SELECT sum((v+1)%2)over(order by i)x,*FROM @)z
ORDER BY x,IIF(v%2=1,max(i)over(partition by x),i),i desc

Скрипка


1

Clojure, 86 байт

#(flatten(reduce(fn[a b](if(odd? b)(conj(pop a)(conj[b](last a)))(conj a b[])))[[]]%))

Ось версія без вогків

#(flatten ; removes all empty vectors and flattens odd sequences
    (reduce 
        (fn[a b]
            (if(odd? b) ; if we encounter odd number in the seq
                (conj(pop a)(conj[b](last a))) ; return all elements but last and the element we encountered plus the last element of current result
                (conj a b[])) ; else just add the even number and the empty vector
            )
        [[]] ; starting vector, we need to have vector inside of vector if the sequence starts with odd number
        %    ; anonymous function arg
    )   
)

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

Наприклад, для цієї послідовності 2 4 6 1 3 7 2це виглядає так:

  • []<=2
  • [2 []]<=4
  • [2 [] 4 []]<=6
  • [2 [] 4 [] 6 []]<=1
  • [2 [] 4 [] 6 [1 []]]<=3
  • [2 [] 4 [] 6 [3 [1 []]]]<=7
  • [2 [] 4 [] 6 [7 [3 [1 []]]]]<=2
  • [2 [] 4 [] 6 [7 [3 [1 []]]] 2 []]

І тоді згладжування цього вектора дає правильний вихід. Ви можете побачити його онлайн тут: https://ideone.com/d2LLEC


1

JavaScript (ES6) 70 66

Відредагуйте 4 байти, збережені thx @Neil

a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r

:r=r.concat(o,x,o=[]),економить вам пару байт. Я думаю , то ви можете піти на , щоб зберегти ще два , як це: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Ніл



@Neil порожній масив, який використовується як доданий елемент, є основним обведенням
edc65

1

Stax , 15 10 байт CP437

Çⁿ╜"}☻≥º╚(

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

Зв’язане желе! Настільки сумно, що упаковка зберегла лише один байт.

Розпакована версія з 11 байтами:

{|e_^*}/Frm

Пояснення

{|e_^*}це блок , який відображає всі парні числа nдо n+1, і всі непарні числа nв 0.

{|e_^*}/Frm
{     }/       Group array by same value from block
 |e            1 if the element is even, 0 if odd.
   _^          Get another copy of the current element and increment by 1
     *         Multiply them
        F      For each group execute the rest of the program
         r     Reverse the group
          m    Print elements from the group, one element per line.



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