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.


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

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

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


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.


5

Ruby - 33 Chars

$><<gets.chars.sort(&:casecmp)*''

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

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.

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

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

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)


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"

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

1
Você pode remover o Dump e afirmar que ele é executado na expressão de LinqPad Modo :)
Jacob


1

J, 12 caracteres

(/:32|a.i.])

Ignora qualquer caractere não alfa.


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("")

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 

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.


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

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 ....


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.