Exibir sentença em ordem alfabética

13

Escreva um programa que pega uma string e gera todos os caracteres em ordem alfabética. Os espaços e símbolos podem ser ignorados ou excluídos, mas as letras maiúsculas e minúsculas devem permanecer no mesmo caso.

Entrada de amostra:

Johnny walked the dog to the park.

Saída de amostra

aaddeeeghhhJklnnoooprtttwy

Regras:

• Qualquer língua

• O código mais curto vence.

aks.
fonte
5
Como classificar letras maiúsculas / minúsculas? Superior antes de baixo, vice-versa ou estável com a entrada?
Howard
Precisa manusear alguma letra fora do alfabeto latino básico ("alfabeto inglês")?
Sebastian Negraszus
3
Do título, eu esperava poder exibir "Sentença em ordem alfabética". Ou "ceeennst". (OK, "Sceeennt", se você insistir em capitalização correta e ordem ASCII.)
keshlam
Quando você Spaces and symbols can be ignored or deleted, isso significa que deve ser ignorado; ou a saída é , .aaddeeeffpermitida?
Blotange
2
Não deve haver 2 ks na saída?
HyperNeutrino

Respostas:

2

MathGolf , 2 bytes

áδ

Experimente online!

Saída de exemplo

      .aaddeeeghhhJkklnnoooprtttwy

Removendo caracteres não alfabéticos

Para remover todos os caracteres não alfabéticos, esta solução funciona:

áδgÆ∞_δ¡

É o mesmo que o código acima, seguido por uma filtragem em que cada caractere é dobrado primeiro e depois comparado sua própria capitalização. Por exemplo, a cadeia de caracteres "a"é convertida "aa"e, em seguida, capitalizada para "Aa", o que não é igual a "aa". Da mesma forma, a sequência "B"é convertida "BB"e maiúscula em "Bb", o que não é igual a "BB". No entanto, "."é convertido ".."e inalterado quando em maiúscula, para que seja filtrado.

Explicação

Eu realmente preciso de mais manipulação de strings no MathGolf ... No momento, não há nem mesmo um operador para converter em letras minúsculas / maiúsculas. A única coisa que eu poderia usar era o operador de capitalização, que funciona como um operador em maiúsculas para cadeias de comprimento 1. Essa solução também classifica caracteres não alfabéticos, mas esses podem ser ignorados. Os caracteres alfabéticos preservam suas letras maiúsculas e minúsculas e são exibidos na ordem correta.

á    sort by comparator
 δ   capitalize string
maxb
fonte
12

GolfScript, 24/6 caracteres

{26,{65+.32+}%?)},{31&}$

Exemplo:

> Johnny walked the dog to the park.
aaddeeeghhhJkklnnoooprtttwy  

Se a entrada for restrita a ascii imprimível, o código poderá ser reduzido por três caracteres usando {95&.64>\91<&},como filtro.

Pode ser testado aqui .

A versão pode ser ignorada é ainda mais curta (6 caracteres):

{31&}$

e produz saída

> Johnny walked the dog to the park.
      aaddeeeghhhJkkl.nnoooprtttwy
Howard
fonte
e se "em ordem alfabética" puder ser interpretado como "ordem ASCII ok, ele poderá ser reduzido para{}$
McKay
@McKay A questão afirma explicitamente de forma diferente. E {}$seria equivalente a $.
Howard
Oh sim. Obrigado, estou tentando aprender golfe
McKay
7

Utilitários principais GNU - 25 caracteres (29 símbolos descartados)

fold -1|sort -f|tr -d \\n

Exemplo (do GNU bash 3):

$ echo "Johnny walked the dog to the park."|fold -1|sort -f|tr -d \\n
      .aaddeeeghhhJkklnnoooprtttwy   <<no trailing newline>>

Da pergunta:

Espaços e símbolos podem ser ignorados ou excluídos

Eu escolhi deixá-los dentro! Para reter apenas caracteres alfabéticos, substitua fold -1com grep -o \\wa +4 caracteres.

grep -o \\w|sort -f|tr -d \\n

Graças à Firefly para recomendar grep -omais sed, e Wumpus para fold -1. ;-)

joeytwiddle
fonte
Esta não é uma ordem alfabética, o J maiúsculo ainda deve ser classificado alfabeticamente com as outras letras minúsculas.
aks.
Oh, bom argumento. Devo adicionar -f(dobrar) sortpara ignorar maiúsculas e minúsculas.
Joeytwiddle 28/01
6

C, 121

Isso é bastante longo comparado a outras entradas, mas não depende de nenhuma classificação interna ou das funções do ToLower:

j;main(k){char s[99],*p=s;gets(s);while(*p){j=p-s-1;k=*p++;while(j>=0&&(s[j]|32)>(k|32))s[j+1]=s[j--];s[j+1]=k;}puts(s);}

Versão mais legível:

j; main(k) {
    char s[99], *p=s;
    gets(s);
    while(*p) {
        j = p-s-1;
        k = *p++;
        while(j >= 0 && (s[j]|32) > (k|32))
            s[j+1] = s[j--];
        s[j+1] = k;
    }
    puts(s);
}

Esta é uma implementação de classificação por inserção com uma comparação sem distinção entre maiúsculas e minúsculas entre elementos (usando a |32operação bit a bit). Isso ocorre porque na codificação ASCII letras maiúsculas e minúsculas diferem apenas pelos 2 5 bits.

user12205
fonte
5

Ruby - 33 Chars

$><<gets.chars.sort(&:casecmp)*''
Siva
fonte
Onde está o código de saída?
John Dvorak
Você pode poupar 2 caracteres usando em *""vez de .join.
manatwork
Você poderia usar p, mas isso é questionável, então use puts. Além disso, $<é um atalho para ARGF
Shelvacu
@manatwork editou ...
Siva
Você pode poupar 1 caractere usando em $><<vez deputs pois o espaço de separação pode ser removido.
manatwork
5

PowerShell: 39

$([string[]][char[]](Read-Host)|sort)" #With spaces and symbols

Resultado

  .aaddeeeghhhJkklnnoooprtttwy

C #: 100

Console.Write(new string(input.ToCharArray().OrderBy(a=>char.ToLower(a)).ToArray()).Trim('.',' '));

Resultado

aaddeeeghhhJkklnnoooprtttwy
Ralf de Kleine
fonte
Esse não é um programa, conforme exigido pela pergunta.
Howard
Você não precisa ToCharArray; StringimplementaIEnumerable<char>
Rik
@ howard os scripts contam como um programa?
Ralf de Kleine
1
Suas soluções de exclusão de símbolo funcionam apenas para a entrada de amostra. Essa entrada foi apenas uma amostra (a entrada real também pode incluir outros símbolos).
Sander
1
@RalfdeKleine Desculpe, eu falei mal sal, acho que você não pode usar isso. Mas, você pode se livrar da atribuição de variável com "$([string[]][char[]](Read-Host)|sort)".
Kris Harper
4

APL 16

      ⍞←A[⍋48|⎕av⍳A←⍞]
Johnny walked the dog to the park.
      aaddeeeghhhJkklnnoooprtttwy.
Mark Plotnick
fonte
Isso não atende aos requisitos, porque J não vem antes de a, d, e etc.
Timtech
Bom
3

Perl6: 26 caracteres

Classifica a saída em maiúscula primeiro e, em seguida, em minúscula, exclui símbolos / espaço em branco

say [~] sort comb /\w/,get

Se espaços em branco / símbolos na saída também puderem ser ignorados, são apenas 21 caracteres.

say [~] get.comb.sort

Isso classifica sem distinção entre maiúsculas e minúsculas, mantém símbolos (26 caracteres)

say [~] get.comb.sort: &lc
Ayiko
fonte
Ele precisa classificar sem distinção entre maiúsculas e minúsculas, mas pode ignorar espaços em branco e símbolos, se preferir.
Timtech 25/01
3

Perl 34

Agora recebe entrada de STDIN.

print sort{lc$a cmp lc$b}<>=~/\w/g

Perl 18

Se a saída incluindo maiúsculas e símbolos incluídos for aceitável:

print sort<>=~/./g
Dom Hastings
fonte
Eu suspeito que você pode reduzi-lo ainda mais, pegando a string de entrada (conforme a descrição) em vez de obtê-la do cmdline.
breadbox
Oooh, você está certo!
Dom Hastings
2

Haskell, 88

import Data.List
import Data.Char
import Data.Ord
main=interact$sortBy$comparing toLower

(38 sem importações da lib padrão)

Vektorweg
fonte
2

k ( 10 9)

Lê a partir de stdin

x@<_x:0:0

Exemplo

x@<_x:0:0
Johhny walked the dog to the park.
"      .aaddeeeghhhhJkklnoooprtttwy"
skeevey
fonte
2

C #: 83

Console.Write(new string(Console.ReadLine().OrderBy(i=>i+"".ToLower()).ToArray()));

Atualização: 65

Executável no LinQPad

new string(Console.ReadLine().OrderBy(i=>i+"").ToArray()).Dump();
Abbas
fonte
1
Você pode remover o Dump e afirmar que ele é executado na expressão de LinqPad Modo :)
Jacob
1

Python 3: 45

print(''.join(sorted(input(),key=str.lower)))
evuez
fonte
Não gosto de Python, mas seu código remove os espaços no período?
Ralf de Kleine
Não, mas "Espaços e símbolos podem ser ignorados ou excluídos", então eu os ignoro!
evuez
Ah leitura é difícil;)
Ralf de Kleine
O uso do lambda salva alguns bytes: Experimente Online
Vedant Kandoi
1

J, 12 caracteres

(/:32|a.i.])

Ignora qualquer caractere não alfa.

Gareth
fonte
Esta tarefa pede um programa. Não vejo E / S aqui. Se você estiver usando algum sinalizador de intérprete, precisará declará-los - e contá-los na contagem de caracteres.
John Dvorak
@JanDvorak Ok, uma função contaria - f=.ou você quer que eu adicione o 1!:1[1?
Gareth
1!:1[1e echoagradar
John Dvorak
@JanDvorak Por que você iria querer echo?
Gareth
O interpretador J gera automaticamente o resultado da última expressão ao executar um arquivo de script? Ou, como você o executa?
John Dvorak
1

Javascript - 74

Infelizmente, devido à maneira como o JS classifica os caracteres, não podemos usar a função de classificação padrão:

prompt().split("").sort(function(a,b){return a.localeCompare(b)}).join("")

Na verdade, isso pode ser reduzido para:

prompt().split("").sort((a,b)=>a.localeCompare(b)).join("")
eithed
fonte
1

F # ( 68 56)

Estou aprendendo F #, então tenho certeza que isso pode ser mais curto:

let f s=s|>Seq.sortBy Char.ToLower|>Seq.iter(printf"%c")

Resultado:

> f "Johnny walked the dog to the park."
        .aaddeeeghhhJkklnnoooprtttwy 
Rik
fonte
1

PHP, 50 bytes

$a=str_split($argn);natcasesort($a);echo join($a);

não remove não letras, recebe informações do STDIN; corra com -R.

Titus
fonte
0

R, 48 caracteres

cat(sort(unlist(strsplit(scan(,""),""))),sep="")

Exemplo de uso:

> cat(sort(unlist(strsplit(scan(,""),""))),sep="")
1: Johnny walked the dog to the park.
8: 
Read 7 items
.aaddeeeghhhJkklnnoooprtttwy
plannapus
fonte
0

q / k4 (3? 5? 8?)

se for suficiente inserir o código e a entrada diretamente no REPL, é apenas asc:

q)asc"Johnny walked the dog to the park."
`s#"      .Jaaddeeeghhhkklnnoooprtttwy"

o `s#é pouco de notação q que indica que a corda está em ordem de classificação (pode ser binário procurou, etc.). se for necessário, isso custa dois caracteres, perfazendo cinco:

q)`#asc"Johnny walked the dog to the park."
"      .Jaaddeeeghhhkklnnoooprtttwy"

se você quiser que ele seja fornecido no stdin, é hora de mudar para o k4 (e nos livramos dele de `s#graça), e é uma solução de oito caracteres:

  x@<x:0:0
Johnny walked the dog to the park.
"      .Jaaddeeeghhhkklnnoooprtttwy"

aquele, btw, funcionará como um arquivo de código exatamente como está (ainda com oito caracteres, pois q é bom por não ter a nova linha final em um arquivo de código). normalmente, haveria problemas com um banner de boas-vindas e com o REPL aberto, mas se você passar a entrada como herestring, tudo isso desaparecerá:

$ cat asc.k
x@<x:0:0
$ q asc.k<<<'Johnny walked the dog to the park.'
"\n      .Jaaddeeeghhhkklnnoooprtttwy"
$ 

não tenho certeza de onde vem essa nova linha extra na saída ....

Aaron Davies
fonte
0

Geléia, 3 bytes

ŒlÞ

Minha primeira solução Jelly neste site! Obrigado a @LeakyNun e @ErikTheOutgolfer por me ensinarem como usar Jelly e @Dennis para fazê-lo! : D

Explicação

ŒlÞ
  Þ Sort using the function to its left
Œl  Converts to lowercase (because it's sort alphabetically, not by codepoint)

Como alternativa, ŒuÞfaz exatamente a mesma coisa, exceto convertendo para maiúsculas.

HyperNeutrino
fonte
0

Powrshell, 36 bytes

-join($args-split'\W|(.)'-ne''|sort)

Script de teste:

$f = {

-join($args-split'\W|(.)'-ne''|sort)

}

@(
    ,("Johnny walked the dog to the park.", "aaddeeeghhhJkklnnoooprtttwy")
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$("$result"-eq"$expected"): $result"
}

Resultado:

True: aaddeeeghhhJkklnnoooprtttwy
confuso
fonte
0

05AB1E , 3 bytes

áΣl

Experimente online .

Explicação:

á      # Only leave the letters of the (implicit) input-string
 Σ     # Sort those letters by:
  l    #  Their lowercase equivalent
       # (And output the result implicitly)
Kevin Cruijssen
fonte
0

Java 10, 72 bytes (como função lambda)

s->{for(int i=64;++i<91;)for(var c:s)if((c&~32)==i)System.out.print(c);}

Experimente online.

Mas já que é um desafio antigo afirmar o programa completo:

Java 10, 126 bytes (como programa completo)

interface M{static void main(String[]a){for(int i=64;++i<91;)for(var c:a[0].toCharArray())if((c&~32)==i)System.out.print(c);}}

Experimente online.

Explicação:

interface M{                        // Class
  static void main(String[]a){      //  Mandatory main method
    for(int i=64;++i<91;)           //   Loop over the uppercase alphabet
      for(var c:a[0].toCharArray()) //    Inner loop over the characters of the input
        if((c&~32)                  //     If the current character converted to uppercase,
                  ==i)              //     equals the current letter of the alphabet
          System.out.print(c);}}    //      Print the character of the input-loop
Kevin Cruijssen
fonte