奇数の逆走


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バイト


結ばれた、本当に。また、私は75ではなく81を数えています。タブで数えたと思いますが、SEエディターはスペースを埋めました。
DJMcMayhem

@DrGreenEg​​gsandIronManあなたの推測は正しいです。読みやすいタブ。ソースをカウントするか、イデオンをカウントします。
リーキー修道女

1
printかっこは必要ありません。また、使用するのはa1回だけなので、変数は必要ありません。
デニス


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(%)[]

フォールドを認識して2バイトを節約してくれた@xnorに感謝します。


素敵な方法、特に(h*)f x=x空のリストに一致するように2番目を書き込むことで、ベースケースにバイトを保存できますが、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
リーキー修道女

k.i=0最後の行の@LeakyNun 。それは単なる変数です。
orlp

わかりません。あるkk.i関連?
リーキー修道女

@LeakyNun No. k.iは、の呼び出し間の永続変数ですkglobalキーワードを使用せずに、仮のグローバルとして表示します。
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示します。(具体的には、コードは入力配列の各エントリのパリティを取得し、連続する差分を計算し、非ゼロ値をに変換し、aを付加します。)11

次に累積和をYs計算し、を与えます。これらの番号のそれぞれはラベルとして使用されるでしょう、それに基づいて入力の要素はグループ化されるでしょう。これは、入力配列をグループを含むセル配列に分割します。この場合、それはを与えます。[1;2;3;3;3;4;4;5;5]G8XQ!{[1] [2] [3;5;7] [4;6] [7;9]}

残りのコードは、セル配列で反復")します。各構成要素の数値配列はでプッシュされ@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

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#ラムダを使用します。.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バイトを節約できます(現在の回答は178ではなく179バイトなので、実際には1)。
ケビンクルーッセン

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

基本的には入力シーケンスを通過し、偶数に遭遇した場合は番号と空のベクトルを追加し、奇数の場合は最後の要素をこの番号と最後の要素にあったもので置き換えます。

たとえば、この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

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何ですか?
aloisdgは


@Neil追加要素として使用される空の配列はマスターストローク
-edc65

1

スタックス15 10 バイトCP437

Çⁿ╜"}☻≥º╚(

オンラインでお試しください!

縛られたゼリー! とても悲しいので、パッキングで1バイトしか節約できませんでした。

11バイトのアンパックバージョン:

{|e_^*}/Frm

説明

{|e_^*}すべての偶数マップするブロックであるnn+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.



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.