反向奇数运行


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

Answers:


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

@DrGreenEg​​gsandIronMan您的猜测是正确的。标签的可读性。数一数源或一数二元酮。
Leaky Nun

1
print不需要parens。另外,您只使用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)

超级hacky :)


是什么k.i
Leaky Nun

@LeakyNun k.i=0在最后一行。这只是一个变量。
orlp

我不明白 是kk.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]}

其余代码在单元数组上迭代")。每个组成数字数组用推动@gto复制并计算其奇偶校验。如果(?)结果为真,即数组内容为奇数,则将数组翻转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

J33 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#lambda。您可以在.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 Lee表示敬意


1
您可以在处放置空格,foreach(var然后更改if(n%2==1)if(n%2>0)保存2个字节(或实际为1个字节,因为当前答案是179个字节而不是178个字节)。
凯文·克鲁伊森

@KevinCruijssen在最小化部分中进行了更改,但在最小化部分中未进行更改。也感谢您的foreach空间!
aloisdg说恢复莫妮卡


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
    )   
)

基本上,它会遍历输入序列,如果遇到偶数,它将加数字和空向量,否则,如果它是奇数,它将用该数字替换最后一个元素加上最后一个元素的内容。

例如,此序列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
尼尔

是什么意思...o
aloisdg说恢复莫妮卡


@Neil用作添加元素的空数组是主笔画
edc65 '16

1

Stax15个10 字节CP437

Çⁿ╜"}☻≥º╚(

在线尝试!

绑果冻! 太可惜了,打包只保存了一个字节。

11字节的解压缩版本:

{|e_^*}/Frm

说明

{|e_^*}是所有的偶数映射块nn+1,和所有的奇数n0

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

1

外壳,7个字节

ṁ↔ġ¤&%2

在线尝试!

说明

ṁ↔ġ¤&%2  Implicit input, a list of integers.
  ġ      Group by equality predicate:
   ¤ %2   Arguments modulo 2
    &     are both truthy.
ṁ        Map and concatenate
 ↔       reversing.

0

Ruby,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}}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.