Najpierw posortuj liczby nieparzyste

20

Zmień kolejność danej listy, tak aby wszystkie liczby nieparzyste pojawiały się przed wszystkimi liczbami parzystymi. Poza tym wymogiem lista wyników może być w dowolnej kolejności.

Dane wejściowe będą zawierać tylko liczby całkowite, ale mogą być ujemne i mogą występować duplikaty oraz mogą występować w dowolnej kolejności.

Najkrótsze rozwiązanie wygrywa.

Przypadki testowe

[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]lub[3,1,2,2,2,2]

[-2,-2,-2,-1,-2,-3][-1,-3,-2,-2,-2,-2,]lub[-3,-1,-2,-2,-2,-2,]

[][]

wyświetlana nazwa
źródło
Ty. Dobre pytanie. Odpowiedź: liczby nieparzyste mogą występować w dowolnej kolejności. :)
display_name
11
Mimo że wyzwanie jest dość proste, dodanie kilku przypadków testowych byłoby fajne. Np. Na pierwszy rzut oka myślałem, że blok liczb nieparzystych i parzystych również musi zostać posortowany.
Laikoni
1
@AsoneTuhid Tak :), liczby mogą się powtarzać.
display_name
11
@Willmore Nigdy nie wiesz z kodem golfa, zasady są ważne. Użyj piaskownicy następnym razem, aby wyjaśnić swoje pytanie, zanim je opublikujesz.
Asone Tuhid
12
Edytuj swoje pytanie, aby uwzględnić wyjaśnienia podane w komentarzach.
Laikoni

Odpowiedzi:

11

Pyth , 4 3 bajty

-1 bajt dzięki isaacg

iD2

Wypróbuj online!

przekreślone 4 jest nadal regularne 4

chromat
źródło
2
Fajnie, miałem oiI2.
Pan Xcoder,
4
Jak o iD2?
isaacg
Alternatywne rozwiązanie 3-bajtowe:oi2
Sok
9

J , 5 bajtów

\:2&|

Wypróbuj online!

\: sortuj malejąco według

2&| mod-2

Adám
źródło
Miło cię widzieć, jak zbliżasz się do ciemnej strony ...
Jonasz
@Jonah Miałem słaby moment.
Adám
9

R , 30 24 bajtów

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

Wypróbuj online!

-6 bajtów dzięki JayCe

Giuseppe
źródło
Ładny! możesz zrobić 26 bajtów
JayCe
@JayCe facepalm gra w golfa o 3 nad ranem z nowym dzieckiem nie jest optymalna. Dzięki!
Giuseppe
5
Gratulacje! Przyszły golfista Scratch?
JayCe
1
Moje gratulacje również Giuseppe, jak powiedział nam nasz Dr, dobrze zrobione, masz kosztowny :)
MickyT
9

C ++, 79 76 64 bajtów

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

Ta funkcja akceptuje parę iteratorów (które muszą być iteratorami o swobodnym dostępie) i stopniowo przesuwa je w kierunku siebie. Gdy awskazuje na liczbę nieparzystą, jest ona przesuwana. W przeciwnym razie awskazuje na liczbę parzystą; bjest zmniejszany i iter_swapedytowany za pomocą a. (Używamy wymiany XOR, co oszczędza nam konieczności dołączania <algorithm>- lub <utility>dla std::swap).

Są niepotrzebne zamiany, gdy bwskazuje się na liczbę parzystą, ale my gramy w golfa, nie zmniejszając wydajności!

Próbny

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

Odpowiedź niekonkurencyjna

Naturalna metoda C ++ jest std::partition, ale wychodzi ona na 83 bajty:

#include<algorithm>
[](auto a,auto b){std::partition(a,b,[](auto x){return x&1;});}
Toby Speight
źródło
Uważam, że to 80 bajtów, ponieważ po #includedyrektywie potrzebujesz nowego wiersza . Moja matematyka jest do bani ^^. Można wymienić !=z -, oszczędzając 1 bajt. Podoba mi się twoje podejście, jest sprytne!
OOBalance,
1
w przeciwnym razie iteratory mogłyby się wzajemnie ominąć, nie osiągając nigdy równości. Jeśli używasz RandomAccessIterator , możesz użyć, while(a<b)jeśli jest to wygodniejsze niż a!=bkorzystanie z a-bwersji @ OOBalance .
Peter Cordes,
Możesz nieco skrócić 83-bajtową odpowiedź, zastępując algorithmregex: codegolf.stackexchange.com/a/150895
OOBalance
7

Perl 6 , 12 bajtów

*.sort(*%%2)

Wypróbuj online!

Jakikolwiek kod sortujący dane wejściowe według parzystości, najpierw z liczbami nieparzystymi. Zamiast tego możesz usunąć a, %aby uzyskać liczby parzyste. Zauważ, że „cokolwiek” to nazwa tego rodzaju anonimowej funkcji.

Jo King
źródło
1
Przepraszam! Przypadkowo zredagowałem twoją odpowiedź zamiast mojej!
Chas Brown
5

Python 2 , 37 36 bajtów

lambda a:sorted(a,key=lambda x:~x%2)

Wypróbuj online!

1 bajtowa wskazówka dla pana Xcodera .

Chas Brown
źródło
1
~powinien działać zamiast 1-.
Pan Xcoder,
@Pan. Xcoder: rzeczywiście tak jest!
Chas Brown
5

Stax , 5 bajtów

{|eom

Uruchom i debuguj

Wyjaśnienie:

{|eom Full program, implicit input
{  o  Sort by key:
 |e     Is odd?
    m Map over result:
        Implicit output with newline
pustkowie
źródło
5

Haskell , 23 22 bajtów

f odd<>f even
f=filter

Wypróbuj online! Jest to równoważne z

g x = filter odd x ++ filter even x

-1 bajt dzięki Lynn


Inne podejścia:

(<>).($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]
Laikoni
źródło
Ale czy to nie potrzebuje import Data.Semigroup?
AlexJ136,
1
@ AlexJ136 Począwszy od GHC 8.4.1, (<>)jest częścią Preludium . Ponieważ TIO nadal działa w starszej wersji, import jest tam potrzebny. Ale masz rację, powinienem o tym wspomnieć bezpośrednio.
Laikoni
1
k odd<>k even;k=filterzapisuje bajt.
Lynn
5

Attache , 11 bajtów

SortBy!Even

Wypróbuj online!

Wyjaśnienie

Evenzwraca trueliczby parzyste i falseinaczej. SortByrangi false < true(według rzutów numerycznych na 0 < 1), umieszczając liczby nieparzyste przed parzystymi.

Conor O'Brien
źródło
5

JavaScript (Node.js) , 29 bajtów

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

Wypróbuj online! Zaoszczędź 4 bajty, obsługując tylko wartości dodatnie przy użyciu b%2-a%2. Jeśli napiszesz to jako:

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

wtedy będzie działał na wszelkiego rodzaju starych implementacjach JavaScript, które nie posortowały się stabilnie.

Neil
źródło
1
Nie a=>a.sort((a,b)=>b&1-a&1)działa?
Alexis Facques
1
@AlexisFacques Nie, to analizuje jako b&(1-a)&1.
Neil
1
a=>a.sort(a=>++a&1)jest krótszy :)
Max
@Max Może to działać na danych testach, ale nie zdziwiłbym się, gdyby ktoś znalazł przykład, w którym to nie działa.
Neil,
1
@Maks Równie dobrze możesz przesłać to jako własną odpowiedź.
Neil,
5

T-SQL, 26 bajtów

SELECT*FROM t ORDER BY~i&1

Używa bitowego operatora AND „&” do porównania ostatniej cyfry z 1.

EDYCJA: Bitowa NIE jest wówczas krótsza niż dodanie 1. EDIT2: Zmień kolejność, aby umożliwić usunięcie przestrzeni.

George Dando
źródło
1
Ładny! Pokonaj mnie o 5! Oszczędź jeszcze jeden bajt, zamieniając kolejność i upuszczając spację:ORDER BY~i&1
BradC
4

Galaretka , 3 bajty

ḂÞṚ

Wypróbuj online!

Jeden z częściej poszukiwanych atomów wydaje się być nawet parzysty (co dałoby te 2 bajty), bez tego musimy odwrócić, wierzę ...

ḂÞṚ - Link: list of integers
 Þ  - sort by:
Ḃ   -   bit (least significant bit - i.e. 1 if odd 0 if even)
  Ṛ - reverse
Jonathan Allan
źródło
4

JavaScript, 22 20 bajtów

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

Wypróbuj online!

andii1997
źródło
Myślę, że możesz upuścić nawiasy wokół trzeciego a.
Jonathan Frech
Nie działa, jeśli 0jest uwzględniony w tablicy.
Kudłaty
To jest źle. Komparator js nie działa w ten sposób. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Qwertiy 18'18
2
Zgodnie ze specyfikacją ECMA, „jeśli Comparefn nie jest niezdefiniowany i nie jest spójną funkcją porównawczą dla elementów tej tablicy (patrz poniżej), zachowanie sortowania jest zdefiniowane przez implementację.” Ta funkcja porównywania nie jest spójna. Nie jest to więc odpowiedź JavaScript, ale może to być odpowiedź na konkretną implementację JavaScript i trzeba by nazwać, która implementacja.
user5090812,
1
Myślę, że to się nie udaje [1,2,3,4,5,6,6,-1,-2,-3,-4]. JavaScript array.sortjest dziwny.
Chas Brown
4

PHP , 55 bajtów

~ 14 miesięcy później i jestem teraz trochę lepszy w golfie:

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

Wypróbuj online!


PHP (> = 5,4), 84 82 bajtów

(-2 bajty, dzięki Ismael Miguel )

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

Aby uruchomić:

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

Przykład:

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

Lub wypróbuj online!

Noc 2
źródło
1
Zamiast $a=array_slice($argv,1);, użyj array_shift($a=&$argv);, co oszczędza 1 bajt. Również usunąć spację przed $aIN join(' ', $a), oszczędzając kolejny bajt. Ponadto PHP 5.3 daje różne wyniki. Powinieneś określić, dla której wersji PHP jest to rozwiązanie.
Ismael Miguel
1
@ IsmaelMiguel: Dzięki za array_shiftpomysł i wskazując błąd kosmiczny. Nie jestem pewien, jak tęskniłem za miejscem: DI dodałem również PHP> = 5,4 w tytule.
Noc 2
To częsty błąd. Byłem naprawdę zaskoczony, array_shiftkiedy spróbowałem i pracowałem.
Ismael Miguel
3

Łuska , 4 bajty

↔Ö%2

Wypróbuj online!

Wyjaśnienie

 Ö     sort input according to the result of the following function
  %2   modulo 2
↔      reverse result to get odd numbers to the front
Laikoni
źródło
3

Scala , 18 bajtów

_.sortBy(_.+(1)%2)
AlexJ136
źródło
3

C #, 23 bajty

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

Bardzo prosto: naprawdę zamienia liczby na logiczne, a jednocześnie trueoznacza, że ​​liczba jest parzysta i falseże jest nieparzysta. Ponieważ truejest wyższy niż falseliczby parzyste pojawiają się jako pierwsze.

Sformatowana wersja wygląda następująco:

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

Możesz to przetestować w ten sposób:

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

Co powoduje:

3,1,5,5,2,2,2,2
MetaColon
źródło
3

JavaScript, 23 bajty

6 bajtów krótszych niż odpowiedź @ Neila w tym samym języku: D

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

Wyjaśnienie:

Funkcja przekazana do sortdba tylko o pierwszy parametr. Jeśli jest nieparzysty, zwraca -1(wynik -(n&1)). W przeciwnym razie (gdy -(n&1)daje 0) zwraca 1.

Wypróbuj online!

ibrahim mahrir
źródło
2
Witamy w PPCG!
Jonathan Frech
3

Python , 35 bajtów

lambda l:sorted(l,key=(-1).__pow__)

Wypróbuj online!

Sortuje według funkcji x -> (-1)**x, co daje -1nieparzyste i 1parzyste.

xnor
źródło
3

JavaScript (Chrome v67) - 24 19 23 bajtów

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

Wykorzystanie &1zamiast Math.abs()%2zostało skradzione z @Neil. Dzięki!

Dzięki @Shaggy za pokazanie mojego zepsutego 19-bajtowego rozwiązania nie było prawidłowe. Jeśli ktoś tego chce:

Zależy od tego, jak przeglądarka obsługuje hacky zwrot wartości 0. Chrome v67, po 100 000 iteracjach losowych tablic nigdy nie posortował go źle. Jestem pewien, że to działa - i sądzę, że opiera się na specyficznym algorytmie sortowania, którego używa Chrome. (To może działać w innych przeglądarkach, nie o to chodzi)

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

Max
źródło
Witaj w PPCG :) To nie udaje się w przypadku wprowadzania danych [-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]do mojej konsoli Chrome 67, wysyłania [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 - ups! masz całkowitą rację!
Max.
3

PowerShell , 22 19 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe poprzez rozpryskiwanie, np., $a=(3,4,3); .\sort-odd-numbers-first.ps1 @aKtóre w TIO przejawia się jako osobne argumenty dla każdego wpisu.

Podobnie jak niektóre inne odpowiedzi tutaj, Sort-Objectmożna porównać na podstawie wyrażenia. Wyrażenie to oznacza !($_%2), że kursy są sortowane $falsei wyrównane $true. Dzięki temu, jak porównywane są wartości logiczne, wartości falsey są najpierw sortowane. To przenosi szanse na początek wyniku, a wyrównanie na koniec. Sort-Objectjest stabilny, więc kolejność poszczególnych pozycji w odpowiednich kategoriach nie zmienia się (jak w przykładzie TIO).

-3 bajty dzięki mazzy.

AdmBorkBork
źródło
Można użyć rozpryskiwania . Na przykład $a=(3,4,3); .\sort-odd-numbers-first.ps1 @a. To $args|sort{!($_%2)}wystarczy. Czyż nie
mazzy
dlaczego „oszukiwanie”? jest to natywna funkcja PowerShell. Jeszcze jedno pytanie: czy możemy używać rozpryskiwania w rozwiązaniu CodeGolf? na przykład rozwiązanie zawiera kilka funkcji. jeśli możemy, to dlaczego połączenie zewnętrzne nie powinno? jeśli nie możemy, to dlaczego ta funkcja została zablokowana? a jakie funkcje są również zakazane?
mazzy
1
@mazzy Dzięki za zwrócenie na to uwagi. Zaktualizowałem swoje zgłoszenie.
AdmBorkBork,
3

Rubinowy , 23 bajty

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

Wypróbuj online!

Wyjaśnienie:

sort_bysortuje każdą liczbę tak, jakby jej wartość była wynikiem bloku ( ~i%2)

~xjest równoważne -x-1i ma pierwszeństwo przed%2

Liczby nieparzyste będą obliczane na, 0a liczby parzyste na 1tak, aby liczby nieparzyste były sortowane jako pierwsze.

Prawie spokrewnione: działa na Ruby z Homebrew 2.5.1p57 (ponieważ jest oparty na małym błędzie), ale tylko dla liczb całkowitych nieujemnych, 20 bajtów

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

Wyjaśnienie:

Używa tego, sortktóry oczekuje bloku, który przyjmuje 2 wartości i zwraca -1, 0lub w 1zależności od tego, czy pierwszy jest większy, czy są równe, czy drugi jest większy.

Podany tutaj blok ignoruje drugą wartość i zwraca, -1jeśli pierwsza liczba jest nieparzysta lub 0parzysta.

Nie gwarantuje się, że zadziała, ale działa w niektórych (chyba błędnych) implementacjach.

Asone Tuhid
źródło
Tutaj definiujemy języki według ich implementacji, więc Twoje 20-bajtowe rozwiązanie jest prawidłowe.
Kudłaty
@Shaggy Nieważne, wczoraj pomieszałem swoje testy.
Asone Tuhid,
3

Procedura kodu maszynowego 6502 , 47 bajtów

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

Oczekuje wskaźnika do tablicy liczb w $fb/ $fci długości tej tablicy w $fd. Manipuluje tablicę w miejscu, aby wszystkie nieparzyste liczby były z przodu. Jest to kod niezależny od pozycji, więc adres ładowania nie jest potrzebny.

Ponieważ 6502 jest układem 8-bitowym (więc instrukcje dotyczą tylko wartości 8-bitowych, opcjonalnie podpisanych), prawidłowy zakres liczb to [-128 .. 127]i maksymalny rozmiar tablicy 256.

Skomentowano demontaż

; 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

Przykładowy program asemblerowy C64 wykorzystujący procedurę:

Demo online

zrzut ekranu

Kod w składni 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
Felix Palmen
źródło
2

Eliksir , 37 35 bajtów

Kod:

fn x->Enum.sort_by x,&(-rem&1,2)end

Wersja rozszerzona:

fn x -> Enum.sort_by(x, fn y -> -rem(y, 2) end) end

Wypróbuj online!

Adnan
źródło
2

Clojure - 35 bajtów

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

Nie golfowany:

(defn oddsort [col]
  (sort (fn [p _] (odd? p)) col))
Bob Jarvis - Przywróć Monikę
źródło
Jest wiele miejsca na ulepszenia, na przykład możesz przesłać anonimową funkcję, która ma krótszą składnię tworzenia za pośrednictwem #(...). Możesz także sort-byspróbować, chociaż przesłanie już istnieje.
NikoNyrh
@NikoNyrh: wypróbowałem #()anonimową funkcję, ale wystąpił błąd arity, ponieważ dwa parametry zostały przekazane, ale tylko przy oczekiwanym / użytym, i wprowadzając %2do niego dodano więcej znaków. Byłbym zainteresowany, aby zobaczyć, jak można to zrobić.
Bob Jarvis - Przywróć Monikę