Classifique os números ímpares primeiro

20

Reorganize uma determinada lista para que todos os números ímpares apareçam antes de todos os números pares. Além deste requisito, a lista de saída pode estar em qualquer ordem.

A entrada conterá apenas números inteiros, mas eles podem ser negativos, duplicatas e aparecer em qualquer ordem.

A solução mais curta vence.

Casos de teste

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

[-2,-2,-2,-1,-2,-3][-1,-3,-2,-2,-2,-2,]ou[-3,-1,-2,-2,-2,-2,]

[][]

Nome em Exibição
fonte
Ty. Boa pergunta. Resposta: números ímpares podem vir em qualquer ordem. :)
display_name
11
Mesmo que o desafio seja bastante simples, adicionar alguns casos de teste seria bom. Por exemplo, à primeira vista, pensei que o bloco de números pares e ímpares também precisava ser classificado.
Laikoni 18/07/19
1
@AsoneTuhid Sim :), os números podem se repetir.
display_name
11
@ Willmore Você nunca sabe com o código golf, as regras são importantes. Use o Sandbox na próxima vez para esclarecer sua pergunta antes de publicá-la.
Asone Tuhid
12
Edite sua pergunta para incluir os esclarecimentos que você deu nos comentários.
Laikoni 18/07/19

Respostas:

11

Pitão , 4 3 bytes

-1 byte graças a isaacg

iD2

Experimente online!

riscado 4 ainda é regular 4

cromática
fonte
2
Legal, eu tinha oiI2.
Mr. Xcoder
4
Que tal iD2?
Isaacg
Solução alternativa de 3 bytes:oi2
Sok
9

J , 5 bytes

\:2&|

Experimente online!

\: classificar decrescente por

2&| mod-2

Adão
fonte
Prazer em vê-lo vindo para o lado sombrio ...
Jonah
@ Jonah eu tive um momento fraco.
Adám
9

R , 30 24 bytes

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

Experimente online!

-6 bytes graças a JayCe

Giuseppe
fonte
Agradável! você pode fazer 26 bytes
Jayce
24 para o programa completo
JayCe 18/07/2018
@JayCe facepalm jogar golfe às 3h com um novo bebê não é o ideal. Obrigado!
18718 Giuseppe
5
Parabéns! Um futuro jogador de Scratch?
21418 JayCe
1
Meus parabéns também Giuseppe, como o nosso Dr. disse-nos, bem feito você tem um cara :)
MickyT
9

C ++, 79 76 64 bytes

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

Essa função aceita um par de iteradores (que devem ser iteradores de acesso aleatório) e os move constantemente um para o outro. Quando aaponta para um número ímpar, é avançado. Caso contrário, aaponta para um número par; bé decrementado e iter_swapeditado com a. (Usamos a troca XOR, o que nos impede de incluir <algorithm>- ou a <utility>favor std::swap).

Há trocas desnecessárias quando baponta para um número par, mas estamos jogando golfe, não diminuindo a eficiência!

Demo

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

Resposta não competitiva

O método C ++ natural é std::partition, mas sai em 83 bytes:

#include<algorithm>
[](auto a,auto b){std::partition(a,b,[](auto x){return x&1;});}
Toby Speight
fonte
Acredito que são 80 bytes, já que você precisa de uma nova linha após a #includediretiva. Minha matemática é péssima embora ^^. Você pode substituir !=por -, economizando 1 byte. Eu gosto da sua abordagem, é inteligente!
OOBalance
1
caso contrário, os iteradores poderiam passar um pelo outro sem nunca se tornarem iguais. Se você estiver usando o RandomAccessIterator , poderá usar while(a<b)se for mais conveniente do que a!=busar a a-bversão de @ OOBalance .
Peter Cordes
Você pode encurtar a resposta 83-byte um pouco, substituindo algorithmcom regex: codegolf.stackexchange.com/a/150895
OOBalance
7

Perl 6 , 12 bytes

*.sort(*%%2)

Experimente online!

Algum código que classifique a entrada por paridade, com números ímpares primeiro. Você pode remover a %para obter os números pares primeiro. Observe que 'Whatever' é o nome desse tipo de função anônima.

Brincadeira
fonte
1
Desculpe! Editei acidentalmente sua resposta em vez da minha!
Chas Brown
5

Python 2 , 37 36 bytes

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

Experimente online!

Dica de 1 byte do chapéu para o Sr. Xcoder .

Chas Brown
fonte
1
~deve funcionar em vez de 1-.
Mr. Xcoder
@Senhor. Xcoder: de fato, ele faz!
Chas Brown
5

Stax , 5 bytes

{|eom

Execute e depure

Explicação:

{|eom Full program, implicit input
{  o  Sort by key:
 |e     Is odd?
    m Map over result:
        Implicit output with newline
wastl
fonte
5

Haskell , 23 22 bytes

f odd<>f even
f=filter

Experimente online! Isso é equivalente a

g x = filter odd x ++ filter even x

-1 byte graças a Lynn


Outras abordagens:

(<>).($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
fonte
Mas isso não precisa import Data.Semigroup?
AlexJ136
1
@ AlexJ136 A partir do GHC 8.4.1, (<>)faz parte do Prelude . Como o TIO ainda executa uma versão mais antiga, a importação é necessária lá. Mas você está certo, eu deveria ter mencionado isso diretamente.
Laikoni 18/07/19
1
k odd<>k even;k=filtersalva um byte.
Lynn
5

Anexo , 11 bytes

SortBy!Even

Experimente online!

Explicação

Evenretorna truepara números pares e falsecaso contrário. SortByfileiras false < true(por um elenco numérica a 0 < 1), colocando assim os números ímpares antes queridos mesmo.

Conor O'Brien
fonte
5

JavaScript (Node.js) , 29 bytes

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

Experimente online! Salve 4 bytes suportando apenas valores positivos usando b%2-a%2. Se você escrever isso como:

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

então funcionará em todos os tipos de implementações antigas de JavaScript que não foram classificadas de maneira estável.

Neil
fonte
1
Não a=>a.sort((a,b)=>b&1-a&1)funciona?
Alexis Facques
1
@AlexisFacques Não, isso analisa como b&(1-a)&1.
Neil
1
a=>a.sort(a=>++a&1)é mais curto :)
Max
@ Max Pode funcionar nos casos de teste fornecidos, mas não ficaria surpreso se alguém encontrasse um exemplo em que não funcionasse.
194 Neil
1
@ Max Você também pode enviá-lo como sua própria resposta.
194 Neil
5

T-SQL, 26 bytes

SELECT*FROM t ORDER BY~i&1

Usa o operador AND bit a bit "&" para comparar o último dígito com 1.

EDIT: bit a bit NÃO é mais curto que adicionar 1. EDIT2: reordene para permitir a remoção do espaço.

George Dando
fonte
1
Agradável! Bata em mim por 5! Salve mais um byte, trocando a ordem e soltando o espaço:ORDER BY~i&1
BradC
4

Geléia , 3 bytes

ḂÞṚ

Experimente online!

Um dos átomos mais procurados parece ser o mesmo (o que daria 2 bytes), sem ele devemos reverter, acredito ...

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

JavaScript, 22 20 bytes

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

Experimente online!

andii1997
fonte
Eu acho que você pode soltar os parênteses em torno do seu terceiro a.
22618 Jonathan Frech
Não funciona se 0estiver incluído na matriz.
Shaggy
Isto é errado. O comparador js não funciona dessa maneira. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Qwertiy
2
De acordo com a especificação da ECMA, "se comparefn não for indefinido e não for uma função de comparação consistente para os elementos dessa matriz (veja abaixo), o comportamento da classificação será definido pela implementação". Esta função de comparação não é consistente. Portanto, essa não é uma resposta JavaScript, mas pode ser uma resposta para alguma implementação JavaScript específica e você precisará nomear qual implementação.
user5090812
1
Eu acho que isso falha [1,2,3,4,5,6,6,-1,-2,-3,-4]. JavaScript array.sorté estranho.
Chas Brown
4

PHP , 55 bytes

~ 14 meses depois e agora estou um pouco melhor no golfe:

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

Experimente online!


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

(-2 bytes, graças a Ismael Miguel )

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

Para executá-lo:

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

Exemplo:

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

Ou Experimente online!

Night2
fonte
1
Em vez de $a=array_slice($argv,1);, use array_shift($a=&$argv);, que economiza 1 byte. Além disso, remova o espaço antes $ade join(' ', $a), salvando outro byte. Além disso, o PHP 5.3 fornece resultados diferentes. Você deve especificar para qual versão do PHP esta solução se destina.
Ismael Miguel
1
@IsmaelMiguel: Obrigado pela array_shiftidéia e apontando o erro de espaço. Não tenho certeza de como eu perdi o espaço: o DI também adicionou o PHP> = 5.4 no título.
night2
É um erro comum. Na verdade, fiquei surpreso array_shiftquando tentei e trabalhei.
Ismael Miguel
3

Casca , 4 bytes

↔Ö%2

Experimente online!

Explicação

 Ö     sort input according to the result of the following function
  %2   modulo 2
↔      reverse result to get odd numbers to the front
Laikoni
fonte
3

Scala , 18 bytes

_.sortBy(_.+(1)%2)
AlexJ136
fonte
3

C #, 23 bytes

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

Muito direto: isso basicamente converte os números em booleanos, enquanto truesignifica que o número é par e falseé ímpar. Porque trueé maior do que falseos números pares aparecem primeiro.

A versão formatada é assim:

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

E você pode testá-lo assim:

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

O que resulta no seguinte:

3,1,5,5,2,2,2,2
MetaColon
fonte
3

JavaScript, 23 bytes

6 bytes menores que a resposta de @ Neil usando o mesmo idioma: D

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

Explicação:

A função passada para sortapenas se preocupa com o primeiro parâmetro. Se for ímpar, retorna -1(o resultado de -(n&1)). Caso contrário (quando -(n&1)produz 0), ele retorna 1.

Experimente online!

ibrahim mahrir
fonte
2
Bem-vindo ao PPCG!
11138 Jonathan Frech
3

Python , 35 bytes

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

Experimente online!

Classifica pela função x -> (-1)**x, que fornece -1para ímpar e 1para par.

xnor
fonte
3

JavaScript (Chrome v67) - 24 19 23 bytes

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

O uso de, em &1vez de, Math.abs()%2foi roubado do @Neil. Obrigado!

Obrigado a @Shaggy por mostrar que minha solução hacky de 19 bytes não era válida. Se alguém quiser:

Depende de como o navegador lida com um valor de retorno hacky de 0. O Chrome v67, depois de 100000 iterações de matrizes aleatórias, nunca classificou errado. Tenho certeza de que funciona - e depende do algoritmo de classificação específico que o Chrome também usa, acredito. (Pode funcionar em outros navegadores, não é esse o ponto)

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

Máx.
fonte
Bem-vindo ao PPCG :) Falha na entrada [-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 meu console do Chrome 67, na saída [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 - oops! você está absolutamente correto!
Max
3

PowerShell , 22 19 bytes

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

Experimente online!

Recebe entrada por meio de splatting, por exemplo, $a=(3,4,3); .\sort-odd-numbers-first.ps1 @aque no TIO se manifesta como argumentos separados para cada entrada.

Como algumas outras respostas aqui, você Sort-Objectpode comparar com base em uma expressão. Aqui a expressão é !($_%2), ie, as probabilidades são classificadas $falsee os pares são classificados $true. Graças à comparação dos valores booleanos, os valores de falsey são classificados primeiro. Isso move as probabilidades para o início da produção e os pares para o fim. Sort-Objecté estável, portanto, a ordem dos itens individuais em suas respectivas categorias não muda (como no exemplo do TIO).

-3 bytes graças ao mazzy.

AdmBorkBork
fonte
Pode usar um splatting . Por exemplo $a=(3,4,3); .\sort-odd-numbers-first.ps1 @a. Então $args|sort{!($_%2)}é o suficiente. Não é?
Mazzy
por que "trapaça"? é recurso nativo do PowerShell. Mais uma pergunta: podemos usar splatting dentro da solução codeGolf? por exemplo, uma solução contém várias funções. se pudermos, por que a chamada externa não deveria? se não podemos, por que esse recurso foi banido? e quais recursos também são banidos?
Mazzy
1
@mazzy Obrigado por apontar isso. Atualizei meu envio.
AdmBorkBork
3

Ruby , 23 bytes

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

Experimente online!

Explicação:

sort_byclassifica cada número como se seu valor fosse o resultado do bloco ( ~i%2)

~xé equivalente a -x-1e tem precedência sobre%2

Os números ímpares serão avaliados em 0e os pares serão avaliados em 1números ímpares, que serão classificados primeiro.

Pouco relacionado: isso funciona no ruby ​​do homebrew 2.5.1p57 (porque é baseado em um pequeno bug), mas apenas para números inteiros não negativos, 20 bytes

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

Explicação:

Isso usa sort que espera um bloco que recebe 2 valores e retorna -1, 0ou 1dependendo se o primeiro é maior, eles são iguais ou o segundo é maior.

O bloco fornecido aqui ignora o segundo valor e retorna -1se o primeiro número for ímpar ou 0se for par.

Não é garantido que funcione, mas funciona em algumas implementações (acho que com erros).

Asone Tuhid
fonte
Aqui, definimos os idiomas por sua implementação, para que sua solução de 20 bytes seja válida.
Shaggy
@ Shaggy Não importa, eu tinha estragado meus testes ontem.
Asone Tuhid 19/07/19
3

Rotina de código de máquina 6502 , 47 bytes

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

Espera um ponteiro para uma matriz de números em $fb/ $fce o comprimento dessa matriz em $fd. Manipula a matriz no lugar para ter todos os números ímpares na frente. Este é um código independente da posição, portanto, nenhum endereço de carregamento é necessário.

Como o 6502 é um chip de 8 bits (as instruções tratam apenas dos valores de 8 bits, opcionalmente assinados), o intervalo de números válido é [-128 .. 127]e o tamanho máximo do array é 256.

Desmontagem comentada

; 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

Exemplo de programa assembler C64 usando a rotina:

Demonstração online

captura de tela

Código na sintaxe 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
fonte
2

Elixir , 37 35 bytes

Código:

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

Versão expandida:

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

Experimente online!

Adnan
fonte
2

Clojure - 35 bytes

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

Ungolfed:

(defn oddsort [col]
  (sort (fn [p _] (odd? p)) col))
Bob Jarvis - Restabelecer Monica
fonte
Há muito espaço para melhorias, por exemplo, você pode enviar uma função anônima que possui uma sintaxe de criação mais curta #(...). Você também pode sort-bytentar, embora o envio já exista.
NikoNyrh
@NikoNyrh: tentou uma #()função anônima, mas obteve um erro de aridade, pois dois parâmetros foram passados, mas apenas no esperado / usado, e a inclusão de %2mais caracteres. Estaria interessado em ver como isso poderia ser feito.
Bob Jarvis - Reinstate Monica