เรียงลำดับเลขคี่ก่อน


20

จัดเรียงรายการที่กำหนดใหม่เพื่อให้หมายเลขคี่ทั้งหมดปรากฏขึ้นก่อนหมายเลขคู่ทั้งหมด นอกจากนี้สำหรับข้อกำหนดนี้รายการเอาท์พุทอาจอยู่ในลำดับใดก็ได้

ข้อมูลที่ป้อนจะมีเฉพาะจำนวนเต็ม แต่อาจเป็นค่าลบและอาจมีค่าซ้ำกันและอาจปรากฏในลำดับใดก็ได้

ทางออกที่สั้นที่สุดชนะ

กรณีทดสอบ

[1,2][1,2]

[2,1][1,2]

[1,0,0][1,0,0]

[0,0,-1][-1,0,0]

[3,4,3][3,3,4]

[-4,3,3][3,3,-4]

[2,2,2,3][3,2,2,2]

[3,2,2,2,1,2][1,3,2,2,2,2]หรือ[3,1,2,2,2,2]

[-2,-2,-2,-1,-2,-3][-1,-3,-2,-2,-2,-2,]หรือ[-3,-1,-2,-2,-2,-2,]

[][]


ไท คำถามที่ดี. คำตอบ: เลขคี่สามารถมาในลำดับใดก็ได้ :)
display_name

11
แม้ว่าความท้าทายจะค่อนข้างง่าย แต่การเพิ่มกรณีทดสอบบางอย่างอาจทำได้ดี เช่นในตอนแรกฉันคิดว่าบล็อกของเลขคู่และเลขคู่ต้องเรียงลำดับด้วย
Laikoni

1
@AsoneTuhid ใช่ :) ตัวเลขสามารถทำซ้ำได้
display_name

11
@ Willmore คุณไม่เคยรู้เรื่องรหัสกอล์ฟกฎสำคัญ โปรดใช้Sandboxในครั้งต่อไปเพื่อชี้แจงคำถามของคุณก่อนโพสต์
Asone Tuhid

12
โปรดแก้ไขคำถามของคุณเพื่อรวมคำอธิบายที่คุณให้ไว้ในความคิดเห็น
Laikoni

คำตอบ:





9

R , 30 24 ไบต์

(x=scan())[order(!x%%2)]

ลองออนไลน์!

-6 ไบต์ขอบคุณ JayCe


ดี! คุณสามารถทำ26 ไบต์
JayCe


@ JayCe facepalm การเล่นกอล์ฟเวลาตี 3 กับลูกใหม่ไม่เหมาะ ขอบคุณ!
จูเซปเป้

5
ยินดีด้วย! นักกอล์ฟกำลังขูดอนาคตหรือไม่
JayCe

1
ขอแสดงความยินดีกับจูเซปเป้ในขณะที่ดรของเราบอกกับเราว่าคุณทำได้ดีราคาแพง :)
มิคกี้

9

C ++, 79 76 64 ไบต์

[](auto a,auto b){while(a<--b)*a%2?*++a:(*a^=*b,*b^=*a,*a^=*b);}

ฟังก์ชั่นนี้ยอมรับตัววนซ้ำคู่หนึ่ง (ซึ่งต้องเป็นตัววนซ้ำการเข้าถึงแบบสุ่ม) และจะย้ายไปยังกันและกันอย่างต่อเนื่อง เมื่อaชี้ไปที่ตัวเลขคี่มันจะสูง มิฉะนั้นให้aชี้ไปที่ตัวเลขคู่ bเป็น decremented และ'เอ็ดกับiter_swap a(เราใช้ XOR swap ซึ่งช่วยให้เราไม่ต้องรวม<algorithm>- หรือ<utility>เพื่อstd::swap)

มีการแลกเปลี่ยนที่ไม่จำเป็นเมื่อbชี้ไปที่ตัวเลขคู่ แต่เราเล่นกอล์ฟไม่บีบประสิทธิภาพ!

การสาธิต

auto f=[](auto a,auto b){while(a<--b)*a%2?*++a:(*a^=*b,*b^=*a,*a^=*b);};

#include <array>
#include <iostream>
int main()
{
    auto a = std::array{ 3,2,2,5,2,1,2 };

    f(a.begin(),a.end());

    for (auto i: a)
        std::cout << i << " ";
    std::cout << std::endl;
}

คำตอบที่ไม่ใช่การแข่งขัน

เมธอด C ++ แบบธรรมชาติคือstd::partitionแต่มีขนาด83ไบต์:

#include<algorithm>
[](auto a,auto b){std::partition(a,b,[](auto x){return x&1;});}

ฉันเชื่อว่ามีขนาด 80 ไบต์เนื่องจากคุณต้องขึ้นบรรทัดใหม่หลังจาก#includeคำสั่ง คณิตศาสตร์ของฉันแย่อยู่แล้ว ^^ คุณสามารถแทนที่!=ด้วย-การบันทึก 1 ไบต์ ฉันชอบแนวทางของคุณมันฉลาด!
OOBalance

1
มิฉะนั้นผู้วนซ้ำสามารถผ่านกันและกันได้โดยไม่เท่ากัน หากคุณใช้RandomAccessIteratorคุณสามารถใช้while(a<b)หากสะดวกกว่าการa!=bใช้a-bเวอร์ชันของ @ OOBalance
Peter Cordes

คุณสามารถร่นคำตอบแบบ 83 ไบต์ให้สั้นลงได้โดยการแทนที่ algorithmด้วยregex: codegolf.stackexchange.com/a/150895
OOBalance


7

Perl 6 , 12 ไบต์

*.sort(*%%2)

ลองออนไลน์!

บางสิ่งที่รหัสที่เรียงลำดับการป้อนข้อมูลโดยความเท่าเทียมกันกับตัวเลขคี่ก่อน คุณสามารถลบ a %เพื่อให้ได้เลขคู่ก่อนแทน โปรดทราบว่า 'Anything' เป็นชื่อของฟังก์ชันที่ไม่ระบุชื่อประเภทนี้


1
ขออภัย! ฉันแก้ไขคำตอบของคุณโดยไม่ตั้งใจแทนฉัน!
Chas Brown




5

Haskell , 23 22 ไบต์

f odd<>f even
f=filter

ลองออนไลน์! สิ่งนี้เทียบเท่า

g x = filter odd x ++ filter even x

-1 ไบต์ด้วยLynn


แนวทางอื่น ๆ :

(<>).($odd)<*>($even)$filter
f x=[i|m<-[0,1],i<-x,odd$m+i]
f x=[i|m<-[1,0],i<-x,mod i 2==m]
f x=id=<<filter<$>[odd,even]<*>[x]

แต่สิ่งนี้ไม่ต้องการimport Data.Semigroupเหรอ?
AlexJ136

1
@ AlexJ136 ในฐานะของ GHC 8.4.1, เป็นส่วนหนึ่งของโหมโรง(<>) เนื่องจาก TIO ยังคงรันเวอร์ชันที่เก่ากว่าจึงจำเป็นต้องมีการนำเข้า แต่คุณพูดถูกฉันควรพูดถึงเรื่องนี้โดยตรง
Laikoni

1
k odd<>k even;k=filterบันทึกเป็นไบต์
ลินน์

5

Attacheขนาด 11 ไบต์

SortBy!Even

ลองออนไลน์!

คำอธิบาย

Evenส่งกลับค่าtrueสำหรับเลขคู่และfalseอื่น ๆ SortByอันดับfalse < true(โดยการคำนวณเชิงตัวเลขไปที่0 < 1) ดังนั้นการวางตัวเลขคี่ก่อนหน้าคู่


5

JavaScript (Node.js)ขนาด 29 ไบต์

a=>a.sort((a,b)=>(b&1)-(a&1))

ลองออนไลน์! บันทึก 4 b%2-a%2ไบต์โดยเฉพาะการสนับสนุนค่าใช้ในเชิงบวก หากคุณเขียนสิ่งนี้เป็น:

function(a){return a.sort((a,b)=>(b&1)-(a&1))}

จากนั้นมันจะทำงานกับการใช้งาน JavaScript เก่า ๆ ทุกประเภทที่ไม่เรียงลำดับอย่างเสถียร


1
ใช้งานไม่ได้a=>a.sort((a,b)=>b&1-a&1)?
Alexis Facques

1
@AlexisFacques b&(1-a)&1ไม่มีที่จะแยกวิเคราะห์เป็น
Neil

1
a=>a.sort(a=>++a&1)สั้นลง :)
สูงสุด

@ Max มันอาจใช้ได้กับกรณีทดสอบที่ให้มา แต่ฉันจะไม่แปลกใจถ้ามีคนพบตัวอย่างที่ไม่ทำงาน
Neil

1
@ Max คุณอาจส่งคำตอบของคุณเองเช่นกัน
Neil

5

T-SQL ขนาด 26 ไบต์

SELECT*FROM t ORDER BY~i&1

ใช้ตัวดำเนินการบิตและ AND "&" เพื่อเปรียบเทียบตัวเลขสุดท้ายกับ 1

แก้ไข: Bitwise ไม่สั้นกว่าการเพิ่ม 1 EDIT2: จัดลำดับใหม่เพื่อให้สามารถลบพื้นที่ได้


1
ดี! เอาชนะฉันด้วย 5! บันทึกหนึ่งไบต์มากขึ้นโดยการเปลี่ยนการสั่งซื้อและการวางพื้นที่:ORDER BY~i&1
BradC

4

เยลลี่ 3 ไบต์

ḂÞṚ

ลองออนไลน์!

หนึ่งในอะตอมที่ต้องการมากขึ้นดูเหมือนจะเป็นหนึ่งแม้กระทั่ง (ซึ่งจะทำให้ 2 ไบต์นี้) โดยไม่ได้เราต้องย้อนกลับฉันเชื่อว่า ...

ḂÞṚ - Link: list of integers
 Þ  - sort by:
Ḃ   -   bit (least significant bit - i.e. 1 if odd 0 if even)
  Ṛ - reverse

4

จาวาสคริปต์, 22 20 ไบต์

a=>a.sort(a=>!(a%2))

ลองออนไลน์!


aฉันคิดว่าคุณสามารถวางวงเล็บรอบที่สามของคุณ
Jonathan Frech

ไม่ทำงานหาก0รวมอยู่ในอาร์เรย์
Shaggy

มันผิด js เครื่องมือเปรียบเทียบไม่ทำงานในลักษณะนี้ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

2
ตามข้อกำหนดของ ECMA "ถ้าเปรียบเทียบไม่ได้ไม่ได้กำหนดและไม่ได้เป็นฟังก์ชั่นการเปรียบเทียบที่สอดคล้องกันสำหรับองค์ประกอบของอาเรย์นี้ (ดูด้านล่าง) พฤติกรรมของการเรียงลำดับคือการใช้งานที่กำหนดไว้" ฟังก์ชันเปรียบเทียบนี้ไม่สอดคล้องกัน ดังนั้นนี่ไม่ใช่คำตอบของ JavaScript แต่อาจเป็นคำตอบสำหรับการใช้งาน JavaScript โดยเฉพาะและคุณต้องตั้งชื่อการใช้งานใด
user5090812

1
[1,2,3,4,5,6,6,-1,-2,-3,-4]ฉันคิดว่านี้ล้มเหลว JavaScript array.sortแปลก
Chas Brown

4

PHP , 55 ไบต์

~ 14 เดือนต่อมาและตอนนี้ฉันก็เล่นกอล์ฟได้ดีขึ้นนิดหน่อย:

for(;''<$n=$argv[++$i];$s=$n%2?"$n $s":"$s $n");echo$s;

ลองออนไลน์!


PHP (> = 5.4), 84 82 ไบต์

(-2 ไบต์ขอบคุณIsmael Miguel )

<?array_shift($a=&$argv);usort($a,function($i){return$i%2==0;});echo join(' ',$a);

วิธีเรียกใช้:

php -n <filename> <number_1> <number_2> ... <number_n>

ตัวอย่าง:

php -n sort_odds_first.php 2 0 1 -1 3 8 29 -666

หรือลองออนไลน์!


1
แทนการ$a=array_slice($argv,1);ใช้งานarray_shift($a=&$argv);ซึ่งจะช่วยประหยัด 1 ไบต์ นอกจากนี้ยังนำพื้นที่ก่อน$aในjoin(' ', $a)การประหยัดไบต์อีก นอกจากนี้ PHP 5.3 ยังให้ผลลัพธ์ที่แตกต่าง คุณควรระบุเวอร์ชันของ PHP ที่เป็นโซลูชันนี้
Ismael Miguel

1
@IsmaelMiguel: ขอบคุณสำหรับ array_shiftความคิดและชี้ให้เห็นความผิดพลาดของพื้นที่ ฉันไม่แน่ใจว่าฉันพลาดพื้นที่ได้อย่างไร: DI ได้เพิ่ม PHP> = 5.4 ในชื่อด้วยเช่นกัน
Night2

มันเป็นความผิดพลาดทั่วไป จริง ๆ แล้วฉันรู้สึกประหลาดใจarray_shiftเมื่อฉันลองและทำงาน
Ismael Miguel




3

C #, 23 ไบต์

i=>i.OrderBy(u=>u%2==0)

เดินไปข้างหน้าค่อนข้างมาก: นี่เป็นการแปลงตัวเลขเป็นบูลีนในขณะที่trueหมายความว่าจำนวนนั้นเป็นเลขคู่และfalseเป็นเลขคี่ เพราะtrueสูงกว่าfalseตัวเลขคู่ปรากฏขึ้นก่อน

เวอร์ชันที่จัดรูปแบบดูเหมือนว่า:

i => i.OrderBy (u => u % 2 == 0)

และคุณสามารถทดสอบได้เช่น:

Console.WriteLine (string.Join (",", new Func <IEnumerable <int>, IEnumerable <int>> (
                                    i => i.OrderBy (u => u % 2 == 0)
                                ).Invoke (new [] {3, 2, 2, 2, 1, 2, 5, 5})));

ซึ่งผลลัพธ์ในสิ่งต่อไปนี้:

3,1,5,5,2,2,2,2


3

JavaScript ขนาด 23 ไบต์

6 ไบต์สั้นกว่าคำตอบของ @ Neilโดยใช้ภาษาเดียวกัน: D

a=>a.sort(n=>-(n&1)||1)

คำอธิบาย:

ฟังก์ชั่นที่ส่งผ่านไปsortสนใจเฉพาะเกี่ยวกับพารามิเตอร์แรก ถ้ามันเป็นเลขคี่มันจะส่งคืน-1(ผลลัพธ์ของ-(n&1)) มิฉะนั้น (เมื่อ-(n&1)ผลตอบแทน0) มันจะกลับ1มา

ลองออนไลน์!


2
ยินดีต้อนรับสู่ PPCG!
Jonathan Frech


3

JavaScript (Chrome v67) - 24 19 23 ไบต์

a=>a.sort(a=>!(a&1)-.5)

การใช้งาน&1มากกว่าMath.abs()%2ถูกขโมยจาก @Neil ขอบคุณ!

ขอบคุณ @Shaggy ที่แสดงวิธีการแก้ปัญหาแฮ็ค 19 ไบต์ของฉันไม่ถูกต้อง ถ้าใครต้องการมัน:

0ขึ้นอยู่กับว่าเบราว์เซอร์จัดการค่าตอบแทนของ hacky Chrome v67 หลังจากการสุ่มอาร์เรย์ 100,000 ครั้งไม่เคยผิดพลาด ฉันแน่ใจว่าใช้งานได้จริงและขึ้นอยู่กับอัลกอริทึมการเรียงลำดับเฉพาะที่ Chrome ใช้ด้วยฉันเชื่อว่า (มันอาจทำงานได้ในเบราว์เซอร์อื่นไม่ใช่ประเด็น)

a=>a.sort(a=>++a&1)


ยินดีต้อนรับสู่ PPCG :) สิ่งนี้ล้มเหลว[-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]ในการป้อนข้อมูลในคอนโซล Chrome 67 ของฉันซึ่งส่ง[7,-5,-3,17,-1,15,1,13,3,11,5,9,2,19,14,-4,6,18,-2,16,0,10,8,12,4]ออก
Shaggy

@Shaggy - โอ๊ะโอ! คุณพูดถูก!
สูงสุด


3

PowerShell , 22 19 ไบต์

$args|sort{!($_%2)}

ลองออนไลน์!

รับอินพุตผ่านการกระจายตัวอย่างเช่น$a=(3,4,3); .\sort-odd-numbers-first.ps1 @aบน TIO ที่แสดงรายการเป็นอาร์กิวเมนต์ที่แยกกันสำหรับแต่ละรายการ

เช่นเดียวกับคำตอบอื่น ๆ ที่นี่คุณSort-Objectสามารถเปรียบเทียบตามนิพจน์ นี่คือการแสดงออกคือ!($_%2)ได้รับการจัดเรียง$falseและได้รับการจัดเรียง$trueและเหตุการณ์เหล่านั้นได้รับการเรียงลำดับขอบคุณที่เปรียบเทียบค่าบูลีนค่าที่ผิดพลาดจะถูกจัดเรียงก่อน สิ่งนี้จะย้ายอัตราต่อรองไปที่จุดเริ่มต้นของเอาต์พุตและจากนั้นไปยังจุดสิ้นสุดSort-Objectมีความเสถียรดังนั้นการเรียงลำดับของแต่ละรายการในหมวดหมู่นั้นจะไม่เปลี่ยนแปลง (เช่นในตัวอย่างของ TIO)

-3 ไบต์ต้องขอบคุณ


มันสามารถที่จะใช้splatting $a=(3,4,3); .\sort-odd-numbers-first.ps1 @aเช่น ดังนั้น$args|sort{!($_%2)}ก็พอ ไม่ใช่เหรอ
mazzy

ทำไม "โกง" มันเป็นคุณสมบัติของขุมพลังพื้นเมือง อีกหนึ่งคำถาม: เราสามารถใช้การกระจายด้านในโซลูชัน codeGolf ได้หรือไม่ ตัวอย่างเช่นโซลูชันมีหลายฟังก์ชัน ถ้าเราสามารถแล้วทำไมสายภายนอกไม่ควร? ถ้าเราทำไม่ได้ทำไมคุณสมบัตินี้ถึงถูกแบน? และคุณสมบัติใดบ้างที่ถูกแบนเช่นกัน?
mazzy

1
@ mazzy ขอบคุณที่ชี้ให้เห็น ฉันได้อัปเดตการส่งของฉันแล้ว
AdmBorkBork

3

ทับทิมขนาด 23 ไบต์

->a{a.sort_by{|i|~i%2}}

ลองออนไลน์!

คำอธิบาย:

sort_by เรียงลำดับทุกหมายเลขราวกับว่าค่าเป็นผลลัพธ์ของบล็อก (~i%2 )

~xเทียบเท่า-x-1และมีความสำคัญมากกว่า%2

ตัวเลขคี่จะประเมิน0และแม้ตัวเลขจะประเมินเป็น1ตัวเลขคี่ดังนั้นจะเรียงลำดับก่อน

ไม่เกี่ยวข้องกัน: ใช้งานได้กับทับทิมจาก homebrew 2.5.1p57 (เพราะมันขึ้นอยู่กับข้อผิดพลาดเล็ก ๆ ) แต่สำหรับจำนวนเต็มที่ไม่เป็นลบเท่านั้น 20 ไบต์

->a{a.sort{|i|i%-2}}

คำอธิบาย:

การใช้งานนี้sortซึ่งคาดว่าบล็อกที่ใช้เวลา 2 ค่านิยมและผลตอบแทน-1, 0หรือ1ขึ้นอยู่กับว่าคนแรกที่มีขนาดใหญ่ที่พวกเขากำลังเท่ากันหรือคนที่สองมีขนาดใหญ่

บล็อกที่ให้ไว้ที่นี่จะละเว้นค่าที่สองและส่งคืน-1ถ้าหมายเลขแรกเป็นเลขคี่หรือ0ถ้าเป็นเลขคู่

มันไม่ได้รับประกันว่าจะทำงานได้ แต่มันใช้ได้กับบางอย่าง (ฉันคิดว่าเป็นบั๊กกี้)


เรากำหนดภาษาโดยการนำไปใช้ที่นี่เพื่อให้โซลูชัน 20 ไบต์ของคุณถูกต้อง
Shaggy

@Shaggy ไม่เป็นไรฉันไปยุ่งกับการทดสอบของฉันเมื่อวานนี้
Asone Tuhid

3

รหัสประจำเครื่อง 6502 , 47 ไบต์

A0 00 84 FE B1 FB 4A 90 07 C8 C4 FD F0 20 D0 F4 2A 85 02 84 FE A4 FD 88 C4 FE
F0 12 B1 FB 4A 90 F6 2A AA A5 02 91 FB A4 FE 8A 91 FB 90 D6 60

ต้องการตัวชี้ไปยังอาร์เรย์ของตัวเลขใน$fb/ $fcและความยาวของอาร์เรย์นี้$fdนี้ จัดการอาเรย์ให้มีเลขคี่ข้างหน้าทั้งหมด นี่คือรหัสตำแหน่งอิสระจึงไม่จำเป็นต้องโหลดที่อยู่

ในฐานะที่เป็น 6502 เป็นชิป 8bit (เพื่อให้คำแนะนำในการจัดการเฉพาะกับค่า 8bit ลงนามขยะ), ช่วงเลขที่ถูกต้องและขนาดอาร์เรย์สูงสุดคือ[-128 .. 127]256

ความคิดเห็นถอดแยกชิ้นส่วน

; function to "partially sort" array, so all odd numbers come before all
; even numbers.
;
; input:
;   $fb/$fc: address of array to sort
;   $fd:     length of array to sort, 0 means 256 (maximum size)
;
; clobbers:
;   $fd/$fe: position from back/front of array
;   $2:      temporary for exchanging two values
;   A, X, Y

 .oddfirst:
A0 00       LDY #$00            ; initialize index from front
84 FE       STY $FE             ; to 0

 .search_front:
B1 FB       LDA ($FB),Y         ; load number from front
4A          LSR A               ; check for even/odd by shifting
90 07       BCC .search_back    ; if odd -> to searching from back
C8          INY                 ; next position from front
C4 FD       CPY $FD             ; same as position searching from back?
F0 20       BEQ .done           ; then we're finished
D0 F4       BNE .search_front   ; else check next from front
 .search_back:
2A          ROL A               ; shift carry back in
85 02       STA $02             ; and save number to temp
84 FE       STY $FE             ; save index from front
A4 FD       LDY $FD             ; load index from back
 .sb_loop:
88          DEY                 ; previous position from back
C4 FE       CPY $FE             ; same as position searching from front?
F0 12       BEQ .done           ; then we're finished
B1 FB       LDA ($FB),Y         ; load number from back
4A          LSR A               ; check for even/odd by shifting
90 F6       BCC .sb_loop        ; if odd -> check previous position
2A          ROL A               ; shift carry back in
AA          TAX                 ; remember in X
A5 02       LDA $02             ; load temporary from front
91 FB       STA ($FB),Y         ; store at current position
A4 FE       LDY $FE             ; load index from front
8A          TXA                 ; load remembered number
91 FB       STA ($FB),Y         ; store at current position
90 D6       BCC .search_front   ; and back to searching from front
 .done:
60          RTS

ตัวอย่างโปรแกรมประกอบ C64 โดยใช้รูทีน:

การสาธิตออนไลน์

ภาพหน้าจอ

รหัสในรูปแบบca65 :

.import oddfirst ; link with routine above

.segment "BHDR" ; BASIC header
                .word   $0801           ; load address
                .word   $080b           ; pointer next BASIC line
                .word   2018            ; line number
                .byte   $9e             ; BASIC token "SYS"
                .byte   "2061",$0,$0,$0 ; 2061 ($080d) and terminating 0 bytes

.bss
linebuf:        .res    5               ; maximum length of a valid signed
                                        ; 8-bit number input
convbuf:        .res    3               ; 3 BCD digits for signed 8-bit
                                        ; number conversion
numbers:        .res    $100            ; maximum array size that can be
                                        ; directly handled with indexing
                                        ; instructions

.data
prompt:         .byte   "> ", $0
message:        .byte   $d, $d, "Enter one number per line.", $d
                .byte   "just press enter (empty line) when done.", $0
errmsg:         .byte   "Error parsing number, try again.", $d, $0

.code
                lda     #$17            ; set upper/lower mode
                sta     $d018

                lda     #0
                sta     $2a             ; index for number array
                sta     $52             ; flag that at least one number was
                                        ; entered

                lda     #<message       ; display message
                ldy     #>message
                jsr     $ab1e

inputloop:
                lda     #<prompt        ; display prompt
                ldy     #>prompt
                jsr     $ab1e

                lda     #<linebuf       ; read string into buffer
                ldy     #>linebuf
                ldx     #5
                jsr     readline

                lda     linebuf         ; empty line?
                beq     process         ; -> start processing

                lda     #<linebuf       ; convert input to int8
                ldy     #>linebuf
                jsr     toint8
                bcc     numok           ; successful -> store number
                lda     #<errmsg        ; else show error message and repeat
                ldy     #>errmsg
                jsr     $ab1e
                bcs     inputloop

numok:          ldx     #$ff            ; set flag that we have a number
                stx     $52
                ldx     $2a
                sta     numbers,x
                inc     $2a             ; next index
                bne     inputloop       ; if array not full, next input

process:        lda     $52             ; check we have some numbers
                beq     exit            ; otherwise exit program

                lda     #<numbers       ; address of array to $fb/fc
                sta     $fb
                lda     #>numbers
                sta     $fc
                lda     $2a             ; length of array to $fd
                sta     $fd
                jsr     oddfirst        ; call "sorting" function

                lda     #$0             ; index variable for output loop
                sta     $52
outloop:        ldy     $52             ; load current index
                lda     numbers,y       ; load current number
                jsr     printnum        ; -> output
                inc     $52             ; next index
                lda     $52             ; compare with ...
                cmp     $2a             ; ... array size
                bne     outloop         ; not reached yet -> repeat

exit:           rts                     ; done, exit program

; read a line of input from keyboard, terminate it with 0
; expects pointer to input buffer in A/Y, buffer length in X
.proc readline
                dex
                stx     $fb
                sta     $fc
                sty     $fd
                ldy     #$0
                sty     $cc             ; enable cursor blinking
                sty     $fe             ; temporary for loop variable
getkey:         jsr     $f142           ; get character from keyboard
                beq     getkey
                sta     $2              ; save to temporary
                and     #$7f
                cmp     #$20            ; check for control character
                bcs     checkout        ; no -> check buffer size
                cmp     #$d             ; was it enter/return?
                beq     prepout         ; -> normal flow
                cmp     #$14            ; was it backspace/delete?
                bne     getkey          ; if not, get next char
                lda     $fe             ; check current index
                beq     getkey          ; zero -> backspace not possible
                bne     prepout         ; skip checking buffer size for bs
checkout:       lda     $fe             ; buffer index
                cmp     $fb             ; check against buffer size
                beq     getkey          ; if it would overflow, loop again
prepout:        sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and clear 
                and     #$7f            ;   cursor in
                sta     ($d1),y         ;   current row
output:         lda     $2              ; load character
                jsr     $e716           ;   and output
                ldx     $cf             ; check cursor phase
                beq     store           ; invisible -> to store
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and show
                ora     #$80            ;   cursor in
                sta     ($d1),y         ;   current row
                lda     $2              ; load character
store:          cli                     ; enable interrupts
                cmp     #$14            ; was it backspace/delete?
                beq     backspace       ; to backspace handling code
                cmp     #$d             ; was it enter/return?
                beq     done            ; then we're done.
                ldy     $fe             ; load buffer index
                sta     ($fc),y         ; store character in buffer
                iny                     ; advance buffer index
                sty     $fe
                bne     getkey          ; not zero -> ok
done:           lda     #$0             ; terminate string in buffer with zero
                ldy     $fe             ; get buffer index
                sta     ($fc),y         ; store terminator in buffer
                sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and clear 
                and     #$7f            ;   cursor in
                sta     ($d1),y         ;   current row
                inc     $cc             ; disable cursor blinking
                cli                     ; enable interrupts
                rts                     ; return
backspace:      dec     $fe             ; decrement buffer index
                bcs     getkey          ; and get next key
.endproc

; print an int8 number to the screen
; input:
;   A - the number to print
; clobbers:
;   X, Y
.proc printnum
                bpl     doprint         ; positive? -> direct number output
                eor     #$ff            ; else invert, 
                sta     $2              ; ...
                inc     $2              ; add one,
                lda     #'-'            ; output a minus sign
                jsr     $e716
                lda     $2
doprint:        tax                     ; number to X reg
                lda     #$0             ; set A to 0
                jsr     $bdcd           ; routine for uint16 in X/A output
                lda     #' '            
                jmp     $e716           ; and print a space
.endproc

; parse / convert int8 number using a BCD representation and double-dabble,
; handle negative numbers.
.proc toint8
                sta     $fb
                sty     $fc
                ldy     #$0
                sty     $fd
                sty     $fe
                sty     convbuf
                sty     convbuf+1
                sty     convbuf+2
scanloop:       lda     ($fb),y
                beq     copy
                iny
                cmp     #$20
                beq     scanloop
                cmp     #$2d
                beq     minus
                cmp     #$30
                bcc     error
                cmp     #$3a
                bcs     error
                inc     $fd
                bcc     scanloop
minus:          lda     $fd
                bne     error
                lda     $fe
                bne     error
                inc     $fe
                bne     scanloop
error:          sec
                rts
copy:           dey
                bmi     error
                ldx     #$2
copyloop:       lda     ($fb),y
                cmp     #$30
                bcc     copynext
                cmp     #$3a
                bcs     copynext
                sec
                sbc     #$30
                sta     convbuf,x
                dex
copynext:       dey
                bpl     copyloop
                lda     #$0
                sta     $fb
                ldx     #$8
loop:           lsr     convbuf
                lda     convbuf+1
                bcc     skipbit1
                ora     #$10
skipbit1:       lsr     a
                sta     convbuf+1
                lda     convbuf+2
                bcc     skipbit2
                ora     #$10
skipbit2:       lsr     a
                sta     convbuf+2
                ror     $fb
                dex
                beq     done
                lda     convbuf
                cmp     #$8
                bmi     nosub1
                sbc     #$3
                sta     convbuf
nosub1:         lda     convbuf+1
                cmp     #$8
                bmi     nosub2
                sbc     #$3
                sta     convbuf+1
nosub2:         lda     convbuf+2
                cmp     #$8
                bmi     loop
                sbc     #$3
                sta     convbuf+2
                bcs     loop
done:           lda     $fe
                beq     positive
                lda     #$ff
                eor     $fb
                sta     $fb
                inc     $fb
positive:       lda     $fb
                clc
                rts
.endproc


2

Clojure - 35 ไบต์

(defn o[c](sort(fn[p _](odd? p))c))

Ungolfed:

(defn oddsort [col]
  (sort (fn [p _] (odd? p)) col))

#(...)มีจำนวนมากห้องสำหรับการปรับปรุงเป็นตัวอย่างเช่นคุณสามารถส่งฟังก์ชั่นที่ไม่ระบุชื่อซึ่งมีไวยากรณ์การสร้างสั้นผ่านทาง นอกจากนี้คุณสามารถsort-byลองแม้ว่าจะมีการส่งอยู่แล้ว
NikoNyrh

@NikoNyrh: ลอง #()ฟังก์ชั่นที่ไม่ระบุตัวตน แต่มีข้อผิดพลาด arity เนื่องจากพารามิเตอร์สองตัวถูกส่งผ่าน แต่คาดว่าจะใช้ได้ / ใช้งาน%2เท่านั้น จะสนใจที่จะดูว่าสิ่งนี้สามารถทำได้
Bob Jarvis - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.