ย้อนกลับวิ่งคี่


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

นอกจากนี้ฉันไม่แน่ใจว่าการคำนวณตัวเลขเพิ่มเติมหมายถึงอะไร หมายความว่าฉันไม่สามารถส่งคืน tuple ที่ไม่เปลี่ยนรูปแบบหรือพิมพ์ตัวเลขได้หรือไม่?
Dennis

@Dennis อัปเดตตามที่คุณแนะนำ มันคือการป้องกันอินพุต / เอาต์พุตเป็นสตริง ข้อเสนอแนะใด ๆ สำหรับการใช้ถ้อยคำที่ดีกว่า?
อดัม

4
ทำไมคุณต้องการป้องกันเอาต์พุตสตริง?
Dennis

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 การเดาของคุณถูกต้อง แท็บสำหรับการอ่าน ไม่ว่าจะนับแหล่งที่มาหรือนับอุดมการณ์หนึ่ง
Leun Nun

1
printไม่จำเป็นต้องมี parens นอกจากนี้คุณใช้เพียงaครั้งเดียวดังนั้นจึงไม่จำเป็นต้องมีตัวแปร
Dennis

5

Python 2, 79 75 73 ไบต์

def f(x):
 i=j=0
 for n in x+[0]:
    if~n%2:x[i:j]=x[i:j][::-1];i=j+1
    j+=1

นี่คือฟังก์ชั่นที่ปรับเปลี่ยนการโต้แย้งในสถานที่ ระดับการเยื้องที่สองเป็นตาราง

ทดสอบบนIdeone


เมตาของนี้อยู่ที่ไหน
Leun Nun


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

แก้ไข: ~ขอบคุณกฎหมายของ De Morgan


1
สวัสดีและยินดีต้อนรับสู่ PPCG! นี่คือโพสต์ที่ดี
NoOneIsHere ที่นี่

5

Haskell, 46 44 ไบต์

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

ขอบคุณ @xnor สำหรับการจดจำการพับและบันทึกสองไบต์


วิธีการที่ดีโดยเฉพาะ(h*)! คุณสามารถบันทึกไบต์บนเคสฐานโดยการเขียนf x=xวินาทีเพื่อจับคู่รายการว่างแม้ว่ามันจะดูเหมือนว่า 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)

Super Hacky :)


คือk.iอะไร
Leun Nun

@LeakyNun k.i=0ในบรรทัดสุดท้าย มันเป็นเพียงตัวแปร
orlp

ฉันไม่เข้าใจ มีความเกี่ยวข้องkและk.i?
Leun Nun

@LeakyNun ฉบับที่เป็นตัวแปรถาวรระหว่างสายของ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

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และ prepends a 1)

แล้วYsคำนวณผลรวมสะสม[1;2;3;3;3;4;4;5;5]ให้ แต่ละตัวเลขเหล่านี้จะถูกนำมาใช้เป็นฉลากตามที่องค์ประกอบของการป้อนข้อมูลจะถูกจัดกลุ่ม สิ่งนี้ทำได้โดยการG8XQ!แยกอาร์เรย์อินพุตเข้าในเซลล์อาร์เรย์ที่มีกลุ่ม {[1] [2] [3;5;7] [4;6] [7;9]}ในกรณีนี้มันจะช่วยให้

ส่วนที่เหลือของรหัสiterates ( ") ในอาร์เรย์เซลล์ @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

J , 33 31 30 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 ไบต์ (หรือจริง ๆ 1 เนื่องจากคำตอบปัจจุบันของคุณคือ 179 ไบต์แทน 178)
Kevin Cruijssen

@KevinCruijssen มันมีการเปลี่ยนแปลงในส่วน minify น้อยลง แต่ไม่ได้อยู่ใน minify หนึ่ง ขอบคุณสำหรับพื้นที่หน้า!
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ผมคิดว่าคุณก็สามารถที่จะบันทึกอีกสองเช่นนี้
Neil

ความหมายของ...oอะไร
aloisdg กำลังย้ายไปยัง codidact.com


@Neil อาร์เรย์ว่างที่ใช้เป็นองค์ประกอบที่เพิ่มเป็นสโตรกหลัก
edc65

1

Stax , 15 10 ไบต์CP437

Çⁿ╜"}☻≥º╚(

ลองออนไลน์!

เจลลี่ผูก! เศร้ามากที่การจัดเก็บบันทึกเพียงหนึ่งไบต์

เวอร์ชันที่คลายการบีบอัดที่มี 11 ไบต์:

{|e_^*}/Frm

คำอธิบาย

{|e_^*}เป็นบล็อกที่แมแม้ตัวเลขทั้งหมดnไปn+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.



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.