Sắp xếp số lẻ trước


20

Sắp xếp lại một danh sách đã cho sao cho tất cả các số lẻ xuất hiện trước tất cả các số chẵn. Ngoài ra đối với yêu cầu này, danh sách đầu ra có thể theo bất kỳ thứ tự nào.

Đầu vào sẽ chỉ chứa các số nguyên, nhưng chúng có thể âm và có thể có các bản sao và chúng có thể xuất hiện theo bất kỳ thứ tự nào.

Giải pháp ngắn nhất chiến thắng.

Các trường hợp thử nghiệm

[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]hoặc[3,1,2,2,2,2]

[-2,-2,-2,-1,-2,-3][-1,-3,-2,-2,-2,-2,]hoặc[-3,-1,-2,-2,-2,-2,]

[][]


Ty. Câu hỏi hay. Trả lời: số lẻ có thể đến theo thứ tự bất kỳ. :)
display_name

11
Mặc dù thử thách này khá đơn giản, nhưng việc thêm một số trường hợp thử nghiệm sẽ rất tốt. Ví dụ, thoạt nhìn tôi nghĩ khối số lẻ và số chẵn cũng cần được sắp xếp.
Laikoni

1
@AsoneTuhid Có :), số có thể lặp lại.
display_name

11
@Willmore Bạn không bao giờ biết với golf code, các quy tắc rất quan trọng. Vui lòng sử dụng Sandbox lần sau để làm rõ câu hỏi của bạn trước khi bạn đăng nó.
Asone Tuhid

12
Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm các làm rõ bạn đã đưa ra trong các ý kiến.
Laikoni

Câu trả lời:





9

R , 30 24 byte

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

Hãy thử trực tuyến!

-6 byte nhờ JayCe


Đẹp! bạn có thể làm 26 byte
JayCe


@JayCe chơi golf facepalm lúc 3h sáng với một em bé mới là không tối ưu. Cảm ơn!
Giuseppe

5
Chúc mừng! Một golfer tương lai Scratch?
JayCe

1
Xin chúc mừng Giuseppe của tôi, như Tiến sĩ của chúng tôi đã nói với chúng tôi, bạn đã làm rất tốt, bạn có một cái đắt tiền :)
MickyT

9

C ++, 79 76 64 byte

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

Hàm này chấp nhận một cặp các trình vòng lặp (phải là các trình vòng lặp truy cập ngẫu nhiên) và di chuyển chúng đều đặn về phía nhau. Khi atrỏ đến một số lẻ, nó được nâng cao. Mặt khác, atrỏ đến một số chẵn; bđược giảm dần và iter_swap'ed với a. (Chúng tôi sử dụng trao đổi XOR, giúp chúng tôi tiết kiệm phải bao gồm <algorithm>- hoặc <utility>cho std::swap).

Có những hoán đổi không cần thiết khi btrỏ đến một số chẵn, nhưng chúng ta đang chơi golf, không ép hiệu quả!

Bản giới thiệu

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âu trả lời không cạnh tranh

Phương thức C ++ tự nhiên là std::partition, nhưng xuất hiện ở mức 83 byte:

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

Tôi tin rằng đó là 80 byte, vì bạn cần một dòng mới sau #includechỉ thị. Toán học của tôi hút mặc dù ^^. Bạn có thể thay thế !=bằng -, tiết kiệm 1 byte. Tôi thích cách tiếp cận của bạn, thật thông minh!
OOBalance

1
mặt khác, các vòng lặp có thể vượt qua nhau mà không bao giờ trở nên bằng nhau. Nếu bạn đang sử dụng RandomAccessIterator , bạn có thể sử dụng while(a<b)nếu điều đó thuận tiện hơn so với a!=bsử dụng a-bphiên bản của @ OOBalance .
Peter Cordes

Bạn có thể rút ngắn câu trả lời 83 byte một chút bằng cách thay thế algorithmbằng regex: codegolf.stackexchange.com/a/150895
OOBalance


7

Perl 6 , 12 byte

*.sort(*%%2)

Hãy thử trực tuyến!

Một số Bất cứ mã nào sắp xếp đầu vào theo chẵn lẻ, với số lẻ trước. %Thay vào đó, bạn có thể xóa a để lấy số chẵn. Lưu ý rằng 'Dù thế nào' là tên của loại chức năng ẩn danh này.


1
Lấy làm tiếc! Tôi vô tình chỉnh sửa câu trả lời của bạn thay vì của tôi!
Chas Brown




5

Haskell , 23 22 byte

f odd<>f even
f=filter

Hãy thử trực tuyến! Điều này tương đương với

g x = filter odd x ++ filter even x

-1 byte nhờ Lynn


Các cách tiếp cận khác:

(<>).($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]

Nhưng không cần điều này import Data.Semigroupsao?
AlexJ136

1
@ AlexJ136 Kể từ GHC 8.4.1, (<>)là một phần của Prelude . Vì TIO vẫn chạy phiên bản cũ hơn, nên việc nhập là cần thiết ở đó. Nhưng bạn đã đúng, tôi nên đã đề cập trực tiếp điều này.
Laikoni

1
k odd<>k even;k=filtertiết kiệm một byte.
Lynn

5

Tùy viên , 11 byte

SortBy!Even

Hãy thử trực tuyến!

Giải trình

Eventrả về truesố chẵn và mặt falsekhác. SortByxếp hạng false < true(bởi một số được đúc thành 0 < 1), do đó đặt các số lẻ trước các số chẵn.


5

JavaScript (Node.js) , 29 byte

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

Hãy thử trực tuyến! Lưu 4 byte bằng cách chỉ hỗ trợ các giá trị dương bằng cách sử dụng b%2-a%2. Nếu bạn viết điều này như:

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

sau đó nó sẽ hoạt động trên tất cả các loại triển khai JavaScript cũ không sắp xếp ổn định.


1
Không a=>a.sort((a,b)=>b&1-a&1)hoạt động?
Alexis Facques

1
@AlexisFacques Không, phân tích cú pháp như b&(1-a)&1.
Neil

1
a=>a.sort(a=>++a&1)ngắn hơn :)
Tối đa

@Max Nó có thể hoạt động trên các trường hợp thử nghiệm nhất định nhưng tôi sẽ không ngạc nhiên nếu ai đó tìm thấy một ví dụ mà nó không hoạt động.
Neil

1
@Max Bạn cũng có thể gửi đó là câu trả lời của riêng bạn.
Neil

5

T-SQL, 26 byte

SELECT*FROM t ORDER BY~i&1

Sử dụng toán tử bitwise AND & "để so sánh chữ số cuối cùng với 1.

EDIT: Bitwise KHÔNG sau đó ngắn hơn so với việc thêm 1. EDIT2: Sắp xếp lại để cho phép loại bỏ khoảng trắng.


1
Đẹp! Đánh bại tôi bằng 5! Lưu thêm một byte bằng cách hoán đổi thứ tự và thả khoảng trống:ORDER BY~i&1
BradC

4

Thạch , 3 byte

ḂÞṚ

Hãy thử trực tuyến!

Một trong những nguyên tử được mong muốn nhiều hơn dường như là một - thậm chí là một (sẽ tạo ra 2 byte này), nếu không có nó, chúng ta phải đảo ngược tôi tin ...

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

4

JavaScript, 22 20 byte

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

Hãy thử trực tuyến!


Tôi nghĩ rằng bạn có thể bỏ dấu ngoặc quanh thứ ba của bạn a.
Jonathan Frech

Không hoạt động nếu 0được bao gồm trong mảng.
Xù xì

Sai rồi. js so sánh doies không hoạt động theo cách như vậy. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/,
Qwertiy 18/07/18

2
Theo đặc tả ECMA, "Nếu so sánh không được xác định và không phải là hàm so sánh nhất quán cho các phần tử của mảng này (xem bên dưới), thì hành vi sắp xếp được xác định theo thực hiện." Chức năng so sánh này không nhất quán. Vì vậy, đây không phải là câu trả lời JavaScript, nhưng nó có thể là câu trả lời cho một số triển khai JavaScript cụ thể và bạn phải đặt tên cho việc triển khai đó.
dùng5090812

1
Tôi nghĩ rằng điều này thất bại cho [1,2,3,4,5,6,6,-1,-2,-3,-4]. JavaScript array.sortthật kỳ lạ.
Chas Brown

4

PHP , 55 byte

~ 14 tháng sau và bây giờ tôi chơi golf tốt hơn một chút:

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

Hãy thử trực tuyến!


PHP (> = 5,4), 84 82 byte

(-2 byte, nhờ Ismael Miguel )

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

Để chạy nó:

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

Thí dụ:

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

Hoặc dùng thử trực tuyến!


1
Thay vì $a=array_slice($argv,1);, sử dụng array_shift($a=&$argv);, tiết kiệm 1 byte. Ngoài ra, loại bỏ không gian trước khi $avào join(' ', $a), lưu một byte khác. Ngoài ra, PHP 5.3 cho kết quả khác nhau. Bạn nên xác định phiên bản PHP mà giải pháp này dành cho.
Ismael Miguel

1
@IsmaelMiguel: Cảm ơn array_shiftý tưởng và chỉ ra lỗi không gian. Tôi không chắc là mình đã bỏ lỡ khoảng trống như thế nào: DI cũng đã thêm PHP> = 5.4 trong tiêu đề.
Đêm2

Đó là một lỗi phổ biến. Tôi thực sự ngạc nhiên array_shiftkhi tôi đã thử nó và làm việc.
Ismael Miguel




3

C #, 23 byte

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

Khá khó khăn về phía trước thực sự: Điều này về cơ bản chuyển đổi các số thành booleans, trong khi đó truecó nghĩa là số chẵn và falseđó là số lẻ. Bởi vì truecao hơn falsesố chẵn xuất hiện đầu tiên.

Phiên bản được định dạng trông như thế:

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

Và bạn có thể kiểm tra nó như thế:

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

Kết quả nào sau đây:

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


3

JavaScript, 23 byte

6 byte ngắn hơn câu trả lời của @ Neil sử dụng cùng một ngôn ngữ: D

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

Giải trình:

Hàm truyền qua sortchỉ quan tâm đến tham số đầu tiên. Nếu là số lẻ, nó trả về -1(kết quả của -(n&1)). Nếu không (khi -(n&1)sản lượng 0) nó trở lại 1.

Hãy thử trực tuyến!


2
Chào mừng đến với PPCG!
Jonathan Frech


3

JavaScript (Chrome v67) - 24 19 23 byte

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

Việc sử dụng &1thay vì Math.abs()%2bị đánh cắp từ @Neil. Cảm ơn!

Cảm ơn @Shaggy đã cho thấy giải pháp 19 byte đầy hack của tôi không hợp lệ. Nếu ai muốn nó:

Phụ thuộc vào cách trình duyệt xử lý giá trị trả về của hacky 0. Chrome v67, sau 100000 lần lặp các mảng ngẫu nhiên không bao giờ sắp xếp sai. Tôi rất chắc chắn rằng nó hoạt động - và tôi cũng dựa vào thuật toán sắp xếp cụ thể mà Chrome sử dụng. (Nó có thể hoạt động trong các trình duyệt khác, đó không phải là vấn đề)

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


Chào mừng bạn đến với PPCG :) Điều này không thành công cho đầu vào [-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]trong bảng điều khiển Chrome 67 của tôi, xuất ra [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].
Xù xì

@Shaggy - ôi! bạn hoàn toàn đúng!
Tối đa


3

PowerShell , 22 19 byte

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

Hãy thử trực tuyến!

Đưa đầu vào qua nối, ví dụ: $a=(3,4,3); .\sort-odd-numbers-first.ps1 @a trên TIO biểu hiện dưới dạng các đối số riêng biệt cho mỗi mục nhập.

Giống như một số câu trả lời khác ở đây, Sort-Objectcó thể so sánh dựa trên một biểu thức. Ở đây, biểu thức là !($_%2), tỷ lệ cược được sắp xếp $falsevà evens được sắp xếp $true. Nhờ cách so sánh các giá trị Boolean, các giá trị falsey được sắp xếp trước. Điều này di chuyển tỷ lệ cược đến đầu của đầu ra, và phát triển đến cuối. Sort-Objectlà ổn định, do đó, thứ tự của các mục riêng lẻ trong danh mục tương ứng của chúng không thay đổi (như trong ví dụ TIO).

-3 byte nhờ mazzy.


Nó có thể sử dụng một splatter . Ví dụ $a=(3,4,3); .\sort-odd-numbers-first.ps1 @a. Như vậy $args|sort{!($_%2)}là đủ. Phải không?
mê mẩn

Tại sao "gian lận"? đó là tính năng quyền hạn bản địa. Thêm một câu hỏi nữa: chúng ta có thể sử dụng phép nối trong giải pháp codeGolf không? ví dụ, một giải pháp chứa một số chức năng. Nếu chúng ta có thể thì tại sao không nên gọi bên ngoài? Nếu chúng ta không thể thì tại sao tính năng này bị cấm? và những tính năng nào bị cấm quá?
mê mẩn

1
@mazzy Cảm ơn bạn đã chỉ ra điều đó. Tôi đã cập nhật trình của tôi.
admBorkBork

3

Ruby , 23 byte

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

Hãy thử trực tuyến!

Giải trình:

sort_bysắp xếp mọi số như thể giá trị của nó là kết quả của khối ( ~i%2)

~xtương đương -x-1và được ưu tiên hơn%2

Các số lẻ sẽ đánh giá 0và các số chẵn sẽ đánh giá để 1các số lẻ sẽ được sắp xếp trước.

Liên quan khá ít: điều này hoạt động trên ruby ​​từ homebrew 2.5.1p57 (vì nó dựa trên một lỗi nhỏ) nhưng chỉ dành cho số nguyên không âm, 20 byte

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

Giải trình:

Điều này sử dụng sortđể mong đợi một khối lấy 2 giá trị và trả về -1, 0hoặc 1tùy thuộc vào khối thứ nhất lớn hơn, chúng bằng nhau hay khối thứ hai lớn hơn.

Khối được cung cấp ở đây bỏ qua giá trị thứ hai và trả về -1nếu số thứ nhất là số lẻ hoặc 0nếu là số chẵn .

Nó không được đảm bảo để làm việc nhưng nó thực hiện trong một số triển khai (tôi nghĩ là lỗi).


Chúng tôi xác định ngôn ngữ bằng cách triển khai chúng ở đây để giải pháp 20 byte của bạn hợp lệ.
Xù xì

@Shaggy Đừng bận tâm, tôi đã làm hỏng bài kiểm tra của mình ngày hôm qua.
Asone Tuhid

3

Thường trình mã máy 6502 , 47 byte

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

Yêu cầu một con trỏ tới một mảng các số trong $fb/ $fcvà độ dài của mảng này trong $fd. Thao tác với mảng tại chỗ để có tất cả các số lẻ ở phía trước. Đây là mã độc lập vị trí, vì vậy không cần địa chỉ tải.

Vì 6502 là chip 8 bit (vì vậy các hướng dẫn chỉ xử lý các giá trị 8 bit, được ký tùy ý), phạm vi số hợp lệ là [-128 .. 127]và kích thước mảng tối đa là 256.

Bình luận tháo gỡ

; 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

Ví dụ chương trình biên dịch chương trình C64 sử dụng thường trình:

Bản demo trực tuyến

ảnh chụp màn hình

Mã theo cú pháp 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 byte

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

Ung dung:

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

Có rất nhiều chỗ để cải tiến, ví dụ bạn có thể gửi một hàm ẩn danh có cú pháp tạo ngắn hơn thông qua #(...). Ngoài ra, bạn có thể sort-bythử, mặc dù trình đã tồn tại.
NikoNyrh

@NikoNyrh: đã thử một #()hàm ẩn danh nhưng gặp lỗi arity vì hai tham số được truyền nhưng chỉ được mong đợi / sử dụng và đưa %2vào đó thêm nhiều ký tự. Sẽ được quan tâm để xem làm thế nào điều này có thể được thực hiện.
Bob Jarvis - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.