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


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

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секунду, чтобы соответствовать пустому списку, хотя он выглядит как 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?
Утренняя монахиня

@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();}

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

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 Ли для оригинального алгоритма.


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

скрипка


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


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

: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.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.