Обратные нечетные пробеги

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-битные целые числа, участвовать будет намного сложнее.
Деннис
Кроме того, я не уверен, к чему относится дальнейшее численное вычисление . Означает ли это, что я не могу вернуть неизменный кортеж или просто напечатать числа?
Деннис
@ Денис Обновлено как вы предложили. Это предотвращает ввод / вывод в виде строки. Любое предложение для лучшей формулировки?
Адам
4
Почему вы хотите предотвратить вывод строки?
Деннис
2
Да, если взглянуть на другую проблему, большинство ответов основаны на разделении на нули, тогда как здесь вам придется разделить условие, для которого большинство языков не имеет встроенной функции.
xnor

Ответы:

8

Python 2, 75 68 63 байта

5 байтов благодаря Денису.

И я обошел Денниса .

Кредиты Byeonggon Lee за ядро ​​алгоритма.

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 Ваше предположение верно. Вкладки для удобства чтения. Либо считайте источник, либо считайте идеон.
Утренняя монахиня
1
printне нуждается в паренсе Кроме того, вы используете только aодин раз, поэтому нет необходимости в переменной.
Деннис
5

Python 2, 79 75 73 байта

def f(x):
 i=j=0
 for n in x+[0]:
    if~n%2:x[i:j]=x[i:j][::-1];i=j+1
    j+=1

Это функция, которая изменяет свой аргумент на месте. Второй уровень отступа - табулятор.

Проверьте это на Ideone .

Деннис
источник
Где мета для этого?
Утренняя монахиня
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

Редактировать: Сохранено ~благодаря законам де Моргана

Woofmao
источник
1
Здравствуйте и добро пожаловать в PPCG! Это хороший пост.
NoOneIsHere
5

Haskell, 46 44 байта

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

Спасибо @xnor за распознавание сгиба и сохранение двух байтов.

Линн
источник
Хороший метод, особенно (h*)! Вы можете сохранить байт в базовом регистре, написав f x=xсекунду, чтобы соответствовать пустому списку, хотя он выглядит как 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)

Супер хакер :)

orlp
источник
что такое k.i?
Утренняя монахиня
@LeakyNun k.i=0в последней строке. Это просто переменная.
orlp
Я не понимаю Есть kи k.iсвязаны?
Утренняя монахиня
@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();}
orlp
источник
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]}.

Остальная часть кода iterate ( ") в массиве ячеек. Каждый составляющий числовой массив помещается в @g. toделает копию и вычисляет ее соотношение . Если ( ?) результат верен, то есть содержимое массива нечетно, массив переворачивается ( P).

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

Луис Мендо
источник
2

Pyth, 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);
};

Престижность Byeonggon Ли для оригинального алгоритма.

aloisdg переходит на codidact.com
источник
1
Вы можете оставить пробел в foreach(varи изменить, if(n%2==1)чтобы if(n%2>0)сохранить 2 байта (или фактически 1, потому что ваш текущий ответ составляет 179 байтов вместо 178).
Кевин Круйссен
@KevinCruijssen Это было изменено в разделе менее минимизировать, но не в минимизировать. Также спасибо за пространство foreach!
aloisdg переходит на codidact.com
1

TSQL 118 байт

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

скрипка

t-clausen.dk
источник
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
    )   
)

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

Например, для этого seq 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

cliffroot
источник
1

JavaScript (ES6) 70 66

Редактирование 4 байт сохраненного ТНХ @Neil

a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r
edc65
источник
:r=r.concat(o,x,o=[]),экономит пару байт. Я думаю , то вы можете пойти на , чтобы сохранить еще два , как это: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Нил
В чем смысл ...o?
aloisdg переходит на codidact.com
@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.
Вейцзюнь Чжоу
источник
0

Рубин , 51 байт

->l{l.chunk(&:odd?).flat_map{|i,j|i ?j.reverse: j}}

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

Некоторые небольшие вариации:

->l{l.chunk(&:odd?).flat_map{|i,j|i&&j.reverse||j}}
->l{l.chunk(&:odd?).flat_map{|i,j|!i ?j:j.reverse}}
->l{l.chunk(&:even?).flat_map{|i,j|i ?j:j.reverse}}
Асоне Тухид
источник