Os números aumentam enquanto as letras diminuem

23

Inspirado por esta pergunta de estouro de pilha: Classificando uma lista: números em ordem crescente, letras em ordem decrescente . Sua tarefa é resolver o seguinte problema e, como esse é o , você deve fazê-lo com o menor número de bytes possível.

Você deve ter uma lista de objetos como entrada contendo letras (qualquer forma razoável: string, char, etc) e números. Você deve classificar os números em ordem crescente e as letras em ordem decrescente. No entanto, você deve manter as letras nas posições das letras e os números nas posições numéricas. Por exemplo, se a lista for:

[L, D, L, L, D, L]

A lista de saída deve estar na forma de:

[L, D, L, L, D, L]

Trabalhar com

Entrada: ['a', 2, 'b', 1, 'c', 3]

  • Classifique os números em ordem crescente: [1, 2, 3]
  • Classifique as letras em ordem decrescente: ['c', 'b', 'a']
  • Junte-os de volta, mas mantenha a ordem da mesma forma: ['c', 1', 'b', 2, 'a', 3]

Regras

  • A lista conterá apenas letras e dígitos.
  • A lista pode estar vazia.
  • A lista pode conter apenas letras ou apenas dígitos.
  • Se o seu idioma não suportar matrizes de tipo misto, você poderá usar caracteres de dígito em vez de números. Observe que se o seu idioma suportar isso, você deverá usar tipos mistos.
  • As letras serão apenas [a-z]ou [A-Z], você pode escolher qual delas.
  • As letras são classificadas como asendo as mais baixas, zou seja , as mais altas a = 1, z = 26.
  • As brechas padrão são proibidas.
  • A E / S pode ser realizada por qualquer meio padrão, incluindo uma string.

Casos de teste

[5, 'a', 'x', 3, 6, 'b'] -> [3, 'x', 'b', 5, 6, 'a']

[ 3, 2, 1] -> [ 1, 2, 3 ]

[ 'a', 'b', 'c' ] -> [ 'c', 'b', 'a' ]

[] -> []

[ 2, 3, 2, 1 ] -> [1, 2, 2, 3]

Como este é o a resposta mais curta em bytes vence!

TheLethalCoder
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Martin Enders

Respostas:

7

Retina , 10 bytes

O`\d
O^`\D

Experimente online!

O Oestágio na Retina pode executar diretamente o tipo de classificação seletiva exigida por esse desafio.

Aqui, a primeira linha classifica os dígitos, enquanto a segunda linha classifica os não dígitos no sentido inverso.

Leo
fonte
13

Python 2 , 53 52 bytes

-2 bytes graças a g.rocket
-1 byte graças a Jonathan Frech

def F(x):n=sorted(x);print[n.pop((e<x)-1)for e in x]

Experimente online!

A sortedlista terá os números primeiro e, em seguida, os caracteres como [3, 5, 6, 'a', 'b', 'x'], em seguida, use e<xpara filtrar o que é número e o que é caractere. Em python, qualquer número é menor que uma lista (entrada) e uma lista é menor que uma string.

Cajado
fonte
Esta versão falha com IndexError: pop index out of range. A solução anterior funcionou.
Mr. Xcoder
Isso funciona , porém , com 55 bytes também. 1-(e<'`')deveria ser (e<'`')-1. Você acabou de colocá-los na ordem errada. BTW, você ninja'd me: / Eu tinha isso
Sr. Xcoder
@ Mr.Xcoder obrigado pela ajuda c:
Rod
2
Salve dois come>x
g.rocket
1
@RootTwo Isso faz o oposto do comportamento pretendido.
usar o seguinte código
9

APL (Dyalog) , 27 26 bytes

Espera que os caracteres estejam em maiúsculas

(⍋⊃¨⊂)@(~e)(⍒⊃¨⊂)@(e←∊∘⎕A)

Experimente online!

Este é apenas dois aplicativos do formulário f@g, aplique a função fnos itens indicados por g.

Para o primeiro uso que aplicação:
f:  ⍒⊃¨⊂ as notas descendentes ( ) cada escolha ( ⊃¨) de todo o argumento ( ).
g:  (e←∊∘⎕A) members ( ) of ( ) the A lphabet ( ⎕A) e store ( ) funcionam como e.

Para o segundo uso que aplicação:
f:  ⍋⊃¨⊂ as notas ascendentes ( ) cada escolha ( ⊃¨) de todo o argumento ( ).
g:  (~e) not ( ~) membros do alfabeto ( e; a função que armazenamos anteriormente)

Adão
fonte
Eu acho que isso precisa de cobertura para todos os inteiros, então substituir o segundo filtro com83=⎕DR¨⍵
Uriel
@ Uriel Na verdade, não parece ser um requisito, mas salvou um byte. Além disso, ⎕DR não é universalmente 83 para números, apenas para números inteiros pequenos.
Adám
é sempre 3=10|⎕DRpara números inteiros?
Uriel
@ Uriel Sim: 0 = UnicodeChar, 1 = Boolean, 2 = ClassicChar, 3 = int, 5 = float, 6 = ponteiro, 7 = decimal, 9 = complexo. ⌊0.1×⎕DRfornece o número de bits usados ​​para representar cada escalar, exceto os ponteiros, que dependem da arquitetura, mas sempre são 326. Portanto, todos os números são 2|⎕DR.
Adám 9/08/17
8

JavaScript (ES6), 71 51 47 bytes

Economizou 20 bytes apenas usando sort(), como sugerido por @JustinMariner
Economizou mais 4 bytes graças a @CraigAyre

Usando uma abordagem semelhante à resposta de Rod's em Python :

a=>[...a].map(n=>a.sort()[1/n?'shift':'pop']())

Casos de teste

Arnauld
fonte
Estou faltando alguma coisa ou você não conseguiu remover toda a sortfunção e apenas usar sort()por conta própria? Parece classificar da mesma maneira sem uma função (no Chrome / FF / Edge).
Justin Mariner
@JustinMariner No começo, pensei que os valores numéricos poderiam ser números - nesse caso, um simples sort()falharia. Mas como estamos limitados a dígitos, você está correto: isso funciona. Obrigado!
Arnauld
1
Agradável solução, você pode mudar / pop em a.sort()cada loop em vez de atribuir a x:?.map(n=>a.sort()[1/n?'shift':'pop']())
Craig Ayre
@CraigAyre Good catch!
Arnauld
Eu tenho certeza que +npode ser usado em vez de1/n
Conor O'Brien
5

R , 83 76 bytes

-7 bytes graças a Miff

function(n){u=unlist
d=n%in%0:9
n[d]=sort(u(n[d]))
n[!d]=sort(u(n[!d]),T)
n}

É o mesmo que o abaixo, mas permite a entrada de tipos mistos como um vetor, liste não como um atomicvetor (o que tipifica tudo como caracteres com tipos mistos).

Experimente online!

R , 68 bytes 61

-7 bytes graças a Miff

function(n){d=n%in%0:9
n[d]=sort(n[d])
n[!d]=sort(n[!d],T)
n}

Função anônima. Todos os dígitos são convertidos em caracteres neste caso. n[-d]é a matriz sem os dígitos. Retorna NULL(lista vazia) na entrada vazia.

Experimente online!

Giuseppe
fonte
Você pode raspar alguns personagens comd=n%in%0:9
Miff
4

Japonês , 18 15 bytes

Obrigado @Shaggy por -3 bytes e pela ajuda na correção de matrizes com 0s.


c ñc
®¤?Vv :Vo

A primeira linha é intencionalmente deixada em branco.

Experimente online! usando -Qpara visualizar a matriz formatada.

Explicação

A primeira linha está em branco para evitar a substituição da matriz de entrada.
[5, 'a', 'x', 3, 6, 'b']

c ñc

Faça uma cópia achatando ( c) a matriz de entrada e, em seguida, ordene ( ñ) com as strings representadas pelo código de char ( c). Isso é armazenado em V.
[3, 5, 6, 'a', 'b', 'x']

£

Em seguida, mapeie a matriz de entrada pela função ...

¤?Vv :Vo

Transforme números em strings binários (truthy) ou strings em ""(falsy) ( ¤). Se for verdade, remova desde o início doV ( v), caso contrário, remova do final ( o).

Justin Mariner
fonte
15 bytes
Salsicha
@ Shaggy Nice, isso é realmente inteligente. Obrigado!
Justin Mariner
Você se esqueceu de interruptor Voe Vvao redor. Estou convencido de que deve haver um caminho mais curto, sem o ternário.
Shaggy
@ Shaggy Oh, whoops. E sim, apenas se opoderia remover desde o início com valores negativos ou algo assim ...
Justin Mariner
4

JavaScript, 164 162 158 142 bytes

edite 1: 2 bytes a menos após remover uma atribuição redundante de v.

edite 2: 4 bytes a menos graças ao TheLethalCoder.

editar 3: 16 bytes a menos graças às dicas brilhantes de Justin Mariner

x=>eval("n=v=>typeof(v)=='number';l=x.length;for(i=0;i<l;x[i++]=x[m],x[m]=w){for(v=w=x[j=m=i];++j<l;)n(e=x[j])==n(w)&&e<v==n(w)&&(m=j,v=e)}x")

É a minha primeira vez no code-golf, por isso certamente pode ser melhorado ... Mas ainda assim, vale a pena tentar.

O programa executa uma variante da classificação de seleção, que leva em consideração apenas os valores do mesmo tipo que o atual (trocando apenas um número e um número, ou uma letra e uma letra)

Formulário legível:

x=>eval("
    n=v=>typeof(v)=='number';
    l=x.length;
    for(i=0;i<l;x[i++]=x[m],x[m]=w){
        for(v=w=x[j=m=i];++j<l;) 
            n(e=x[j])==n(w) && e<v==n(w) && (m=j,v=e)
    }
    x
")
mackoo13
fonte
for(j=i+1;j<l;j++)-> for(j=i++;++j<l;)e remova o incremento no loop externo.
TheLethalCoder
PPCG bem-vindo também!
TheLethalCoder
@TheLethalCoder Se incrementarmos os contadores tão cedo, também precisaremos alterar as linhas em que eu e j são usados ​​... Mas a ideia é realmente inteligente, vou pensar em como usá-la de qualquer maneira.
mackoo13
Você pode incrementar jcomo sugeri, eu não vi você usar imais abaixo apenas mudar x[i]=x[m]muitox[i++]=x[m]
TheLethalCoder
Ah, claro ... Por que eu não pensei em x[i++]=x[m]... Obrigado!
mackoo13
3

C ++ 17 (gcc) , 219 bytes

#include <variant>
#include <set>
using V=std::variant<char,int>;void f(V*a,V*b){std::set<V>S[2];for(V*c=a;c<b;++c)S[c->index()].insert(*c);auto
C=S->rbegin();auto N=S[1].begin();for(;a<b;++a)*a=(a->index()?*N++:*C++);}

Experimente online!

Dificilmente competitivo. Mas devo suportar matrizes de tipo misto? BEM.

Aceita uma matriz de variantes no estilo de intervalo e modifica-o no lugar. Copia a entrada em dois conjuntos classificados e depois na matriz de entrada / saída.

aschepler
fonte
Isto é interessante. Eu não interpretaria "suportando matrizes de tipo misto" dessa maneira. Caso contrário, eu teria que usar uma matriz de void *C;) Mas, sim, interessante ver uma solução pulando por um aro tão grande.
Felix Palmen
Você pode salvar dois bytes removendo os espaços no #includes
Conor O'Brien
2

Mathematica, 203 bytes

(K=Reverse;B=Complement;L=Length;S=Position[#,_Integer];T=Sort@Cases[#,_Integer];G=K@B[#,T];V=B[Range@L@#,Flatten@S];R=K@Sort@#;Table[R[[Min@S[[i]]]]=T[[i]],{i,L@T}];Table[R[[V[[i]]]]=G[[i]],{i,L@G}];R)&


Experimente online!

J42161217
fonte
2

Pitão , 12 11 bytes

KSQm.(Kt>\@

Experimente online! ou Experimente o conjunto de testes.


Explicação

KSQm.(Kt<d\@  - Full program with implicit input.

KSQ           - Assign a variable K to the lexicographically sorted input.
   m          - Map over the input (with a variable d).
    .(K       - Pop the sorted list at this location:
       >\@    - If d is lexicographically lower than '@', at 0 (the first element). Else, at -1 (the last element).
Mr. Xcoder
fonte
Aguarde, você não precisa solicitar a matriz inteira, apenas divida em duas matrizes homogêneas, cada uma com facilidade de classificação. O APL também não pode classificar matrizes mistas (mas), mas classifico cada tipo separadamente.
Adám
@ Adám O que você quer dizer com dividir em dois arrays homogêneos, cada um com facilidade de classificação ?
Sr. Xcoder
Conforme descrito no "Passo a passo" do OP: 1. Anote quais elementos são numéricos e quais são os caracteres. 2. Extraia todos os números em uma matriz separada e classifique-a. Faça o mesmo para os personagens. 3. Coloque o número classificado novamente nos slots de números. Faça o mesmo para os personagens.
Adám 9/08/17
@ Adám Se o OP considera este inválido, vou fazer exatamente o que você disse (Isso resultaria em um tempo muito maior aproximação muito,)
Mr. Xcoder
2

Python, 145 139 130 bytes

6 bytes salvos graças a @officialaimm

9 bytes salvos graças a @Chris_Rands

g=lambda s,a:sorted(x for x in s if(type(x)==str)==a)
def f(s):l,n=g(s,1),g(s,0)[::-1];return[[n,l][type(x)==str].pop()for x in s]

Experimente online!

Uriel
fonte
139 bytes
officialaimm
type(x)==striria salvar alguns bytes sobre o uso isinstance(...)eu acho
Chris_Rands
@Chris_Rands thanks!
Uriel
2

05AB1E , 17 bytes

SaJ¹á{R¹þ{«vyay.;

Experimente online!


SaJ               # Push 1 if letter 0 else, for all letters in string.
   ¹á{R           # Reverse sort letters from input.
       ¹þ{        # Regular sort digits from input.
          «       # Concatenate those two things.
           v      # For each letter in the sorted string...
            ya    # 0 if digit, 1 if letter.
              y.; # Replace first instance of 0/1 with digit/letter.

Usar o fechamento ordenado na verdade foi pior: Σ©Ç®ai0<*}}¹SaJsvyay.;

Urna de polvo mágico
fonte
2

Python 3, 77 bytes

Esta resposta é baseada no comentário que diz que você pode usar '1', '2', etc., se caracteres e dígitos não forem comparáveis ​​no idioma. 'a' e 1 não são comparáveis ​​no Python 3.

def f(s):x=sorted(s,key=lambda c:ord(c)-95);return[x.pop(-(c>'.'))for c in s]
RootTwo
fonte
2

q / kdb +, 54 53 bytes

Solução:

{x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}

Exemplos:

q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}(5;"a";"x";3;6;"b") / mixed list
3
"x"
"b"
5
6
"a"
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}3 2 1   / simple list
1 2 3
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}"abc"   / simple list
"cba"
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}2 3 2 1 / simple list
1 2 2 3

Explicação:

Encontre os caracteres na lista, classifique-os em ordem decrescente, encontre os compridos na lista, classifique-os em ordem crescente, junte-se para obter uma lista de, por exemplo ("x";"b";"a";3;5;6), em seguida, atribua os valores classificados de volta às suas posições originais na lista, por exemplo, em0 3 4 1 2 5 .

Golfe é apenas trocar q palavras-chave ( each, wheree not) pelo seu kequivalente (o que exige que elas sejam colocadas entre colchetes).

{x[w,q]:asc[x w:where d],desc x q:where not d:-7=type each x;x} / ungolfed
{                                                           ; } / lambda function with 2 statements
                                                 type each x    / return types of elements in mixed list
                                              -7=               / true where item is a long
                                            d:                  / save this bool array in d
                                        not                     / invert
                                  where                         / indices where true (we have chars)
                                q:                              / save these indices in q
                              x                                 / values of x at these indices
                         desc                                   / sort them descending
                        ,                                       / join/contatenate
                where d                                         / indices where we have digits
              w:                                                / save this in w
            x                                                   / values of x at these indices
        asc[           ]                                        / sort them ascending
 x[w,q]:                                                        / assign this list to x at indices w,q
                                                             x  / return x

Edições

  • -1 byte, pois não precisa de colchetes desc
rua
fonte
2

C (gcc) , 125 113 110 bytes

main(i){char*b,*c,s[99];for(gets(c=b=s);*++c||*(c=++b);)i=*b&64,i^*c&64||*c>*b^!i&&(i=*c,*c=*b,*b=i);puts(s);}

Experimente online!

Explicado:

main(i)
{
    char*b,*c,s[99];

    // slightly modified stupid bubblesort, this line in fact
    // does nested looping with a single for statement
    for(gets(c=b=s);*++c||*(c=++b);)
    // (undefined behavior here, there's no sequence point between accesses to c,
    // so this could go wrong. Works with the gcc version on tio.)

        // determine whether the current b is a letter:
        i=*b&64,

        // for doing anything, b and c must be the same "type":
        i^*c&64

            // when c > b for letter or c <= b for digit
            || *c>*b^!i

            // then swap
            && (i=*c,*c=*b,*b=i);

    puts(s);
}

Letras são esperadas em maiúsculas.

Felix Palmen
fonte
2

PHP, 66 bytes:

for($a=$argv,sort($a);a&$c=$argv[++$i];)echo$a[$c<A?++$k:--$argc];

recebe entrada dos argumentos da linha de comando, imprime uma string. Corra com -nrou experimente online .

Emite um aviso no PHP 7.1; substitua a&por ""<para corrigir.

Titus
fonte
1

Mathematica, 107 bytes

(s=#;s[[p]]=Sort[s[[p=#&@@@s~($=Position)~_String]],#2~Order~#>0&];s[[c]]=Sort@s[[c=#&@@@s~$~_Integer]];s)&
user202729
fonte
1

C # (.NET Core) , 171 bytes

a=>{var b=a.Where(x=>x is int).ToList();b.Sort();int i=0,j=0;return a.Select(x=>b.Contains(x)?b[i++]:a.Except(b).OrderByDescending(y=>y).ToList()[j++]);}

A contagem de bytes também inclui:

using System.Linq;

Experimente online!

Explicação:

a =>
{
    var b = a.Where(x => x is int).ToList(); // Filter to only ints and transform to list
    b.Sort();                                // Sort the list
    int i = 0, j = 0;                        // Create index counters
    return a.Select(x =>                     // Replace each input element with
                    b.Contains(x) ?          // If it is in list b:
                    b[i++] :                 // Get the next element from b
                    a.Except(b)              // Otherwise take input and filter out those in b
                     .OrderByDescending(x=>x)// Order them z to a
                     .ToList()[j++]);        // Get the next element
Grzegorz Puławski
fonte
1

Perl 5 , 107 + 1 (-n) = 108 bytes

y/][//d;@a=split/, /;@l=sort grep/\D/,@a;@d=sort grep/\d/,@a;@r=map{/\d/?pop@d:shift@l}@a;$"=", ";say"[@r]"

Experimente online!

Xcali
fonte
1

Ruby , 265 bytes

x.sort_by(&:to_s).select{|a| a.is_a?(String)}.zip(x.map.with_index {|a, i| a.is_a?(String) ? i : nil}.compact).each{|a,i| x[i] = a}
x.sort_by(&:to_s).select{|a| a.is_a?(Integer)}.zip(x.map.with_index {|a, i| a.is_a?(Integer) ? i : nil}.compact).each{|a,i| x[i] = a}

Experimente online!

Primeiro temporizador aqui, minha solução definitivamente não é a melhor. Mas como essa é minha primeira resposta, pensei em postar apenas por diversão.

Olhando para a frente para ver melhores respostas Ruby, para ver qual é a melhor abordagem. Espero melhorar nas respostas futuras =)

Legível

x = ["c", 1, "a", 3, "b", 2]

b = x.map.with_index {|a, i| a.is_a?(Integer) ? i : nil}.compact
s = x.map.with_index {|a, i| a.is_a?(String) ? i : nil}.compact

o = x.sort_by(&:to_s).select{|a| a.is_a?(Integer)}
d = x.sort_by(&:to_s).select{|a| a.is_a?(String)}

d.zip s
d.zip(s).each {|a, i| x[i] = a}

o.zip b
o.zip(b).each {|a, i| x[i] = a }

p x
Gustavo Gabriel
fonte
1

Haskell, 108 bytes

Pode haver maneiras mais curtas, mas eu apenas tive que tentar com a Lensbiblioteca.

import Control.Lens
import Data.List
i(!)f=partsOf(traverse.filtered(!'='))%~f.sort
f x=x&i(<)id&i(>)reverse

Eu poderia definir fapenas a composição das duas iinvocações, mas ainda precisaria aplicar xa ela para evitar um erro de tipo da restrição de monomorfismo. Observe que o tipo de fé Traversable t => t Char -> t Charpara que ele possa ser usado com Strings, que são listas de Chars e também com matrizes de Chars.

Aqui estão os casos de teste:

*Main> map f ["5ax36b","321","abc","","2321"]
["3xb56a","123","cba","","1223"]
Christian Sievers
fonte
1

Python 3, 91 bytes

def f(s):x=sorted(s,key=lambda c:(type(c)==str,c));return[x.pop(-(type(c)==str))for c in s]
RootTwo
fonte
1

Clojure, 151 bytes

#(map(fn[t c](nth((if(=(type 1)t)vec reverse)(sort((group-by type %)t)))(-(c t)1)))(map type %)(reductions(partial merge-with +)(for[i %]{(type i)1})))

Example:

(def f #( ... ))
(f [5 \a \x 3 6 \b])
; (3 \x \b 5 6 \a)

This calculates the cumulative sum count of integers and characters, and uses it to lookup the correct element from a sorted list of corresponding type's elements.

NikoNyrh
fonte