Afficher la phrase par ordre alphabétique

13

Écrivez un programme qui prend une chaîne et produit tous les caractères par ordre alphabétique. Les espaces et les symboles peuvent être ignorés ou supprimés, mais les lettres majuscules et minuscules doivent rester dans le même cas.

Exemple d'entrée:

Johnny walked the dog to the park.

Exemple de sortie

aaddeeeghhhJklnnoooprtttwy

Règles:

• N'importe quel langage

• Le code le plus court gagne.

aks.
la source
5
Comment trier les lettres majuscules / minuscules? Supérieur avant inférieur, vice versa ou stable avec l'entrée?
Howard
Doit-il gérer des lettres en dehors de l'alphabet latin de base ("alphabet anglais")?
Sebastian Negraszus
3
D'après le titre, j'espérais pouvoir m'en tirer en affichant "Phrase dans l'ordre alphabétique". Ou "ceeennst". (OK, "Sceeennt", si vous insistez sur une capitalisation correcte et un ordre ASCII.)
keshlam
Lorsque vous Spaces and symbols can be ignored or deleted, cela signifie-t-il qu'il faut ignorer; ou la sortie est-elle , .aaddeeeffautorisée?
blutorange
2
Ne devrait-il pas y avoir 2 ks dans la sortie?
HyperNeutrino

Réponses:

2

MathGolf , 2 octets

áδ

Essayez-le en ligne!

Exemple de sortie

      .aaddeeeghhhJkklnnoooprtttwy

Suppression de caractères non alphabétiques

Pour supprimer tous les caractères non alphabétiques, cette solution fonctionne:

áδgÆ∞_δ¡

C'est le même que le code ci-dessus, suivi d'un filtrage où chaque caractère est d'abord doublé, puis comparé sa propre capitalisation. Par exemple, la chaîne "a"est convertie "aa"puis capitalisée en "Aa", ce qui n'est pas égal à "aa". De la même manière, la chaîne "B"est convertie "BB"et mise en majuscule "Bb", ce qui n'est pas égal à "BB". Cependant, "."est converti en ".."et reste inchangé une fois capitalisé, il sera donc filtré.

Explication

J'ai vraiment besoin de plus de gestion des chaînes dans MathGolf ... Pour le moment, il n'y a même pas d'opérateur pour convertir en minuscules / majuscules. La seule chose que je pouvais utiliser était l'opérateur de capitalisation, qui fonctionne comme un opérateur majuscule pour les chaînes de longueur 1. Cette solution trie également les caractères non alphabétiques, mais ceux-ci pourraient être ignorés. Les caractères alphabétiques conservent leur casse et sont sortis dans le bon ordre.

á    sort by comparator
 δ   capitalize string
maxb
la source
12

GolfScript, 24/6 caractères

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

Exemple:

> Johnny walked the dog to the park.
aaddeeeghhhJkklnnoooprtttwy  

Si l'entrée est limitée à ascii imprimable, le code peut être raccourci de trois caractères en utilisant {95&.64>\91<&},comme filtre.

Peut être testé ici .

La version peut être ignorée est encore plus courte (6 caractères):

{31&}$

et donne une sortie

> Johnny walked the dog to the park.
      aaddeeeghhhJkkl.nnoooprtttwy
Howard
la source
et si "alphabétiser" pouvait être interprété comme signifiant "ordre ASCII correct, il pourrait simplement être réduit à{}$
McKay
@McKay La question énonce explicitement différemment. Et {}$serait équivalent à $.
Howard
Oh oui. Merci, j'essaie d'apprendre golfscript
McKay
7

Utilitaires principaux GNU - 25 caractères (29 symboles de chute)

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

Exemple (de GNU bash 3):

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

De la question:

Les espaces et les symboles peuvent être ignorés ou supprimés

J'ai choisi de les laisser dedans! Pour conserver uniquement les caractères alphabétiques, remplacez-les fold -1par grep -o \\w+4 caractères.

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

Merci à Firefly pour recommander grep -oplus sed, et pour Wumpus fold -1. ;-)

joeytwiddle
la source
Il ne s'agit pas d'un ordre alphabétique, le J majuscule doit toujours être trié par ordre alphabétique avec les autres lettres minuscules.
aks.
Oh bon point aks. Je dois ajouter -f(plier) sortpour ignorer la casse.
joeytwiddle
6

C, 121

C'est assez long par rapport aux autres entrées, mais il ne repose sur aucune fonction de tri ou ToLower intégrée:

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

Version plus lisible:

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

Il s'agit d'une implémentation du tri par insertion avec une comparaison insensible à la casse entre les éléments (en utilisant l' |32opération au niveau du bit). En effet, dans le codage ASCII, les lettres majuscules et minuscules ne diffèrent que par le 2 5 bits.

user12205
la source
5

Rubis - 33 caractères

$><<gets.chars.sort(&:casecmp)*''
Siva
la source
Où est le code de sortie?
John Dvorak
Vous pouvez épargner 2 caractères en utilisant *""au lieu de .join.
manatwork
Vous pouvez utiliser p, mais c'est discutable, alors utilisez-le puts. Aussi, $<est un raccourci pour ARGF
Shelvacu
@manatwork édité ...
Siva
Vous pouvez épargner 1 caractère en utilisant $><<au lieu de putscar l'espace de séparation peut être supprimé.
manatwork
5

PowerShell: 39

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

Résultat

  .aaddeeeghhhJkklnnoooprtttwy

C #: 100

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

Résultat

aaddeeeghhhJkklnnoooprtttwy
Ralf de Kleine
la source
Ce n'est pas un programme comme l'exige la question.
Howard
Vous n'avez pas besoin ToCharArray; StringoutilsIEnumerable<char>
Rik
@howard donc les scripts comptent-ils comme un programme?
Ralf de Kleine
1
Vos solutions sans symboles ne fonctionnent que pour l'exemple d'entrée. Cette entrée n'était qu'un échantillon (une entrée réelle peut également inclure d'autres symboles).
Sander
1
@RalfdeKleine Désolé, j'ai mal parlé sal, je ne pense pas que vous puissiez l'utiliser. Mais, vous pouvez vous débarrasser de l'affectation des variables avec "$([string[]][char[]](Read-Host)|sort)".
Kris Harper
4

APL 16

      ⍞←A[⍋48|⎕av⍳A←⍞]
Johnny walked the dog to the park.
      aaddeeeghhhJkklnnoooprtttwy.
Mark Plotnick
la source
Cela ne répond pas aux exigences, car J ne vient pas avant a, d, e, etc.
Timtech
Excellent travail là-bas +1
Timtech
3

Perl6: 26 caractères

Trie la sortie en majuscules en premier, puis en minuscules, supprime les symboles / espaces

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

Si les espaces / symboles en sortie peuvent également être ignorés, il ne s'agit que de 21 caractères.

say [~] get.comb.sort

Cela trie sans tenir compte de la casse, conserve les symboles (26 caractères)

say [~] get.comb.sort: &lc
Ayiko
la source
Il doit trier sans tenir compte de la casse, mais il peut ignorer les espaces et les symboles si vous préférez.
Timtech
3

Perl 34

Prend maintenant une entrée de STDIN.

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

Perl 18

Si la sortie comprenant les majuscules en premier et les symboles inclus est acceptable:

print sort<>=~/./g
Dom Hastings
la source
Je soupçonne que vous pouvez le raccourcir davantage en prenant la chaîne d'entrée (selon la description) au lieu de l'obtenir de la cmdline.
boîte à pain le
Oooh, tu as raison!
Dom Hastings
2

Haskell, 88

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

(38 sans importations depuis la bibliothèque standard)

Vektorweg
la source
2

k ( 10 9)

Lit à partir de stdin

x@<_x:0:0

Exemple

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

C #: 83

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

Mise à jour: 65

Exécutable dans LinQPad

new string(Console.ReadLine().OrderBy(i=>i+"").ToArray()).Dump();
Abbas
la source
1
Vous pouvez supprimer le vidage et indiquer qu'il s'exécute en mode d'expression de LinqPad :)
Jacob
1

Python 3: 45

print(''.join(sorted(input(),key=str.lower)))
evuez
la source
Je ne suis pas en Python mais votre code supprime-t-il les espaces dans la période?
Ralf de Kleine
Non, mais "Les espaces et les symboles peuvent être ignorés ou supprimés", alors je les ignore simplement!
evuez
Ah la lecture est difficile;)
Ralf de Kleine
L'utilisation de lambda permet d'économiser quelques octets: Essayez-le en ligne
Vedant Kandoi
1

J, 12 caractères

(/:32|a.i.])

Ignore tous les caractères non alpha.

Gareth
la source
Cette tâche demande un programme. Je ne vois aucune E / S ici. Si vous utilisez des indicateurs d'interpréteur, vous devez les indiquer - et les compter dans le nombre de caractères.
John Dvorak
@JanDvorak D'accord, une fonction compterait-elle f=., ou voulez-vous que j'ajoute le 1!:1[1?
Gareth
1!:1[1et echos'il vous plaît
John Dvorak
@JanDvorak Pourquoi voudriez-vous echo?
Gareth
L'interpréteur J génère-t-il automatiquement le résultat de la dernière expression lors de l'exécution d'un fichier de script? Ou comment le gérez-vous?
John Dvorak
1

Javascript - 74

Malheureusement, en raison de la façon dont JS trie les caractères, nous ne pouvons pas utiliser la fonction de tri standard:

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

En fait, cela peut être réduit à:

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

F # ( 68 56)

J'apprends le F # donc je suis sûr que cela pourrait être plus court:

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

Production:

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

PHP, 50 octets

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

ne supprime pas les non-lettres, prend l'entrée de STDIN; courir avec -R.

Titus
la source
0

R, 48 caractères

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

Exemple d'utilisation:

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

q / k4 (3? 5? 8?)

s'il suffit d'entrer le code et l'entrée directement dans le REPL, c'est juste asc:

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

l' `s#est un peu de notation q qui indique que la chaîne est en ordre de tri (peut être recherché binaire, etc.). si elle doit disparaître, cela coûte deux personnages, soit cinq:

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

si vous voulez qu'il soit fourni sur stdin, il est temps de passer en k4 (et nous nous en débarrassons `s#gratuitement), et c'est une solution à huit caractères:

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

celui-ci, btw, fonctionnera comme un fichier de code exactement tel quel (toujours huit caractères, car q est bien sans avoir la nouvelle ligne finale dans un fichier de code). normalement, il y aurait des problèmes avec une bannière de bienvenue et avec le REPL restant ouvert, mais si vous passez l'entrée en héritage, tout cela disparaît:

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

ne sais pas vraiment d'où vient cette nouvelle ligne supplémentaire dans la sortie ...

Aaron Davies
la source
0

Gelée, 3 octets

ŒlÞ

Ma première solution Jelly sur ce site! Merci à @LeakyNun et @ErikTheOutgolfer de m'avoir appris à utiliser Jelly et @Dennis pour le faire! :RÉ

Explication

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

Alternativement, ŒuÞfait exactement la même chose sauf la conversion en majuscules à la place.

HyperNeutrino
la source
0

Powrshell, 36 octets

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

Script de test:

$f = {

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

}

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

Production:

True: aaddeeeghhhJkklnnoooprtttwy
mazzy
la source
0

05AB1E , 3 octets

áΣl

Essayez-le en ligne .

Explication:

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

Java 10, 72 octets (en tant que fonction lambda)

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

Essayez-le en ligne.

Mais comme c'est un vieux défi énonçant le programme complet:

Java 10, 126 octets (comme programme complet)

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

Essayez-le en ligne.

Explication:

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
la source