仕事
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
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
回答:
デニスのおかげで5バイト。
クレジットByeonggonリーアルゴリズムのコア用。
o=t=[]
for i in input():o+=~i%2*(t+[i]);t=i%2*([i]+t)
print o+t
古いバージョン:75バイト
print
かっこは必要ありません。また、使用するのはa
1回だけなので、変数は必要ありません。
{∊⌽¨⍵⊂⍨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
編集:デモーガン~
の法則のおかげで助かりました
Ḃ¬ðœ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.
TiodgvYsG8XQ!"@gto?P
入力は、;
セパレータとして使用する列配列です。
例として入力配列を考えます[1;2;3;5;7;4;6;7;9]
。コードの最初の部分で、Tiodgv
この配列を[1;1;1;0;0;1;0;1;0]
に変換します。ここで、パリティの変更を1
示します。(具体的には、コードは入力配列の各エントリのパリティを取得し、連続する差分を計算し、非ゼロ値をに変換し、aを付加します。)1
1
次に累積和をYs
計算し、を与えます。これらの番号のそれぞれはラベルとして使用されるでしょう、それに基づいて入力の要素はグループ化されるでしょう。これは、入力配列をグループを含むセル配列に分割します。この場合、それはを与えます。[1;2;3;3;3;4;4;5;5]
G8XQ!
{[1] [2] [3;5;7] [4;6] [7;9]}
残りのコードは、セル配列で反復("
)します。各構成要素の数値配列はでプッシュされ@g
ます。to
コピーを作成し、そのパリティを計算します。(?
)結果が真実の場合、つまり配列の内容が奇数の場合、配列は反転されます(P
)。
スタックは、最後に暗黙的に表示されます。各数値の垂直配列が表示され、改行で区切られた数字のリストが表示されます。
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
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 Leeに称賛を送ります。
foreach(var
に変更if(n%2==1)
しif(n%2>0)
て2バイトを節約できます(現在の回答は178ではなく179バイトなので、実際には1)。
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
#(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
thx @Neilで保存された4バイトの編集
a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r
:r=r.concat(o,x,o=[]),
数バイト節約できます。その後、次のような別の2つのファイルを保存できると思いますa=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r
。
...o
何ですか?
Çⁿ╜"}☻≥º╚(
縛られたゼリー! とても悲しいので、パッキングで1バイトしか節約できませんでした。
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.
ṁ↔ġ¤&%2
ṁ↔ġ¤&%2 Implicit input, a list of integers.
ġ Group by equality predicate:
¤ %2 Arguments modulo 2
& are both truthy.
ṁ Map and concatenate
↔ reversing.
->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}}