Ters orantısız koşular


17

İlham .

Görev

2 ila 2 15 negatif olmayan tamsayılar listesindeki tek sayıların ters işlemleri .

Örnekler

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. Zorluğu ancak örneklere baktıktan sonra anladım. Garip tamsayıların dizileri dizilerden daha net olacağını düşünüyorum . 2. Açık bir üst limit belirlemenin iyi bir şey olduğunu düşünmüyorum. Bir dilin yalnızca 8 bitlik tam sayıları varsa, katılmak çok daha zor olacaktır.
Dennis

Ayrıca, başka sayısal hesaplamanın ne anlama geldiğinden emin değilim . Bu, değişmez bir demet döndüremeyeceğim veya sadece sayıları basamayacağım anlamına mı geliyor?
Dennis

@Dennis önerdiğiniz gibi güncellendi. Dize olarak giriş / çıkışı önlemektir. Daha iyi ifadeler için herhangi bir öneriniz var mı?
Adám

4
Neden dize çıktısını önlemek istiyorsunuz?
Dennis

2
Evet, diğer zorluğa baktığımızda, cevapların çoğu sıfırlara bölmeye dayanırken, burada çoğu dilin yerleşik olmadığı bir koşula bölünmeniz gerekir.
xnor

Yanıtlar:


8

Python 2, 75 68 63 bayt

Dennis sayesinde 5 bayt.

Ve Dennis'i geride bıraktım .

Algoritmanın özü için Byeonggon Lee'ye verilen krediler .

o=t=[]
for i in input():o+=~i%2*(t+[i]);t=i%2*([i]+t)
print o+t

Boşver!

Eski versiyon: 75 bayt


Gerçekten bağlı. Ayrıca, 81 değil, 81 sayıyorum. Sekmelerle saydığınızı tahmin ediyorum, ancak SE editörü boşlukları doldurdu.
DJMcMayhem

@DrGreenEggsandIronMan Tahmininiz doğru. Okunabilirlik için sekmeler. Ya kaynağı sayın ya da ideone olanı sayın.
Leaky Nun

1
printebeveynlere ihtiyaç duymaz. Ayrıca, yalnızca bir akez kullanırsınız , bu nedenle bir değişkene gerek yoktur.
Dennis


5

APL, 21 20 bayt

{∊⌽¨⍵⊂⍨e⍲¯1↓0,e←2|⍵}

Deneyin || Tüm test örnekleri

Açıklama:

                  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

Edit: ~De Morgan yasalarına teşekkür etti


1
Merhaba, PPCG'ye hoş geldiniz! Bu iyi bir gönderi.
NoOneIsHere

5

Haskell, 46 44 bayt

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

Katlamayı tanımak ve iki bayt kaydetmek için @xnor'a teşekkürler.


Güzel bir yöntem, özellikle (h*)! f x=xBoş listeyle eşleşmek için ikinci yazı yazarak temel kutuya bir bayt kaydedebilirsiniz , ancak a foldrdaha kısa gibi görünüyor h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]::
xnor

foldrSonuçta sadece bir şey olduğunu biliyordum ! Teşekkür ederim.
Lynn

4

Jöle , 10 bayt

Ḃ¬ðœpUżx@F

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

Ḃ¬ðœ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 bayt

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)

Süper hacky :)


nedir k.i?
Leaky Nun

k.i=0Son satırda @LeakyNun . Bu sadece bir değişken.
orlp

Anlamıyorum. Are kve k.iilgili?
Leaky Nun

@LeakyNun No. k.i, çağrıları arasında kalıcı bir değişkendir k. globalAnahtar kelimeyi kullanmak zorunda kalmadan bunu derme çatma küresel olarak görün .
orlp

4

Python3, 96 bayt

Leaky Nun sayesinde çok bayt kurtardı!

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 bayt

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 bayt

TiodgvYsG8XQ!"@gto?P

Girdi, ;ayırıcı olarak kullanılan bir sütun dizisidir .

Çevrimiçi deneyin!

açıklama

Giriş dizisini örnek olarak ele alalım [1;2;3;5;7;4;6;7;9]. Kodunun ilk bölümü, Tiodgviçine, bu dizi dönüştürür [1;1;1;0;0;1;0;1;0], 1bir işaret parite değişimi . (Özellikle, kod giriş dizisinin her girdisinin paritesini alır, ardışık farklılıkları hesaplar, sıfır olmayan değerleri dönüştürür 1ve1 .)

Sonra toplamı , toplamıYs hesaplar . Bu numaraların her biri, girdinin öğelerinin gruplandırılacağı temelde bir etiket olarak kullanılacaktır . Bu, giriş dizisini grupları içeren bir hücre dizisine bölerek yapılır . Bu durumda verir .[1;2;3;3;3;4;4;5;5]G8XQ!{[1] [2] [3;5;7] [4;6] [7;9]}

Kodun geri kalanı hücre dizisinde yinelenir ( "). Her bileşen sayısal dizisi ile itilir @g. tobir kopyasını çıkarır ve paritesini hesaplar . (Eğer ?sonuç truthy olan), örneğin, bir dizi içeriği bir tek, dizi çevrilmiş (P ).

Yığın sonunda örtük olarak görüntülenir . Her sayısal dikey dizi görüntülenir ve yeni satırlarla ayrılmış sayıların bir listesini verir.


2

Pyth, 14 bayt

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

Test senaryoları


2

J , 33 31 30 bayt

[:;]<@(A.~2-@|{.);.1~1,2|2-/\]

kullanım

   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 bayt

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

Bir C # lambda kullanıyorum. .NETFiddle üzerinde deneyebilirsiniz .

Kod daha az küçültülür:

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

Orijinal algoritma için Byeonggon Lee'den Kudos'a .


1
Sen de boşluk bırakın foreach(varve değişim if(n%2==1)için if(n%2>0)(geçerli cevap 179 byte yerine 178 olduğundan, ya aslında 1) 2 bayt kaydedin.
Kevin Cruijssen

@KevinCruijssen Daha az küçültme bölümünde değiştirildi, küçültme bölümünde değiştirilmedi. Ayrıca foreach alanı için teşekkür ederiz!
aloisdg moving to codidact.com


1

TSQL 118 bayt

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

Vaktini boşa harcamak


1

Clojure, 86 bayt

#(flatten(reduce(fn[a b](if(odd? b)(conj(pop a)(conj[b](last a)))(conj a b[])))[[]]%))

İşte ungolfed versiyonu

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

Temel olarak giriş dizisinden geçer ve çift sayı ile karşılaşırsa, sayıyı ve boş vektörü ekler, aksi takdirde tek bir sayı ise son öğeyi bu sayı artı son öğede bulunanla değiştirir.

Örneğin bu seq için şu 2 4 6 1 3 7 2şekilde gider:

  • []<=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 []]

Ve sonra bu vektörü düzleştirmek doğru çıktıyı verir. Çevrimiçi olarak burada görebilirsiniz: https://ideone.com/d2LLEC


1

JavaScript (ES6) 70 66

Düzenleme 4 kaydedilmiş thx bayt @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=[]),size birkaç bayt kazandırır. Ben o zaman bu gibi başka iki kurtarmak için devam edebilir düşünüyorum: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil



@ Eklenen öğe olarak kullanılan boş dizi ana
vuruştur

1

Stax , 15 10 bayt CP437

Çⁿ╜"}☻≥º╚(

Çevrimiçi deneyin!

Bağlı Jelly! O kadar üzücü ki ambalaj sadece bir bayt kurtardı.

11 baytlık ambalajsız sürüm:

{|e_^*}/Frm

açıklama

{|e_^*}tüm çift sayıları eşleştiren bir bloktur niçin n+1ve tüm tek sayılar niçin 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.

1

Kabuk , 7 bayt

ṁ↔ġ¤&%2

Çevrimiçi deneyin!

açıklama

ṁ↔ġ¤&%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 bayt

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

Çevrimiçi deneyin!

Bazı küçük varyasyonlar:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.