Mostrar oración en orden alfabético


13

Escriba un programa que tome una cadena y muestre todos los caracteres en orden alfabético. Los espacios y símbolos se pueden ignorar o eliminar, pero las letras mayúsculas y minúsculas deben permanecer en el mismo caso.

Entrada de muestra:

Johnny walked the dog to the park.

Salida de muestra

aaddeeeghhhJklnnoooprtttwy

Reglas:

• Cualquier idioma

• El código más corto gana.


55
¿Cómo ordenar letras mayúsculas / minúsculas? Superior antes inferior, viceversa o estable con la entrada?
Howard

¿Necesita manejar letras fuera del alfabeto latino básico ("alfabeto inglés")?
Sebastian Negraszus

3
Por el título, esperaba poder mostrar "Sentencia en orden alfabético". O "ceeennst". (OK, "Sceeennt", si insiste en la correcta capitalización y el orden ASCII.)
keshlam

Cuando usted Spaces and symbols can be ignored or deleted, ¿eso significa que debe ser ignorado; o es salida como , .aaddeeeffpermitida?
blutorange

2
¿No debería haber 2 ks en la salida?
HyperNeutrino

Respuestas:


2

MathGolf , 2 bytes

áδ

Pruébalo en línea!

Salida de ejemplo

      .aaddeeeghhhJkklnnoooprtttwy

Eliminar caracteres no alfabéticos

Para eliminar todos los caracteres no alfabéticos, esta solución funciona:

áδgÆ∞_δ¡

Es lo mismo que el código anterior, seguido de un filtro donde cada personaje se duplica primero, y luego se compara su propia capitalización. Por ejemplo, la cadena "a"se convierte "aa"y luego se capitaliza en "Aa", que no es igual a "aa". De la misma manera, la cadena "B"se convierte "BB"y se capitaliza en "Bb", que no es igual a "BB". Sin embargo, "."se convierte a".." y no cambia cuando se capitaliza, por lo que se filtrará.

Explicación

Realmente necesito más manejo de cadenas en MathGolf ... En este momento ni siquiera hay un operador para convertir a minúsculas / mayúsculas. Lo único que pude usar fue el operador de mayúsculas, que funciona como un operador en mayúsculas para cadenas de longitud 1. Esta solución también clasifica los caracteres no alfabéticos, pero podrían ignorarse. Los caracteres alfabéticos conservan sus mayúsculas y minúsculas en el orden correcto.

á    sort by comparator
 δ   capitalize string

12

GolfScript, 24/6 caracteres

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

Ejemplo:

> Johnny walked the dog to the park.
aaddeeeghhhJkklnnoooprtttwy  

Si la entrada está restringida a ASCII imprimible, el código puede acortarse en tres caracteres utilizando {95&.64>\91<&},como filtro.

Se puede probar aquí .

La versión que se puede ignorar es aún más corta (6 caracteres):

{31&}$

y rinde salida

> Johnny walked the dog to the park.
      aaddeeeghhhJkkl.nnoooprtttwy

y si "alfabetizar" pudiera interpretarse como "orden ASCII bien, podría reducirse a{}$
McKay

@McKay La pregunta establece explícitamente de manera diferente. Y {}$sería equivalente a $.
Howard

Oh si. Gracias, estoy tratando de aprender golfscript
McKay

7

Utilidades principales de GNU: 25 caracteres (29 símbolos de caída)

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

Ejemplo (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 pregunta:

Los espacios y símbolos se pueden ignorar o eliminar

¡Elegí dejarlos adentro! Para conservar sólo los caracteres alfabéticos, sustituir fold -1con grep -o \\wde +4 caracteres.

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

Gracias a la luciérnaga para recomendar grep -omás sed, y para Wumpus fold -1. ;-)


Este no es un orden alfabético, la J mayúscula aún debe ordenarse alfabéticamente con las otras letras minúsculas.
aks.

Oh buen punto aks. Debo agregar -f(doblar) sortpara ignorar el caso.
joeytwiddle

6

C, 121

Esto es bastante largo en comparación con otras entradas, pero no depende de ninguna función incorporada de clasificación o 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);}

Versión más legible:

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 es una implementación del tipo de inserción con una comparación que distingue entre mayúsculas y minúsculas entre los elementos (usando la |32operación bit a bit). Esto se debe a que en la codificación ASCII, las letras mayúsculas y minúsculas solo difieren en 2 5 bits.


5

Ruby - 33 caracteres

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

¿Dónde está el código de salida?
John Dvorak

Puede ahorrar 2 caracteres utilizando en *""lugar de .join.
manatwork

Podrías usar p, pero eso es cuestionable, así que solo úsalo puts. Además, $<es un atajo para ARGF
Shelvacu

@manatwork editado ...
Siva

Puede ahorrar 1 carácter utilizando en $><<lugar de, putsya que se puede eliminar el espacio de separación.
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

Ese no es un programa como lo requiere la pregunta.
Howard

No necesitas ToCharArray; StringimplementosIEnumerable<char>
Rik

@ howard, ¿los scripts cuentan como un programa?
Ralf de Kleine

1
Sus soluciones de exclusión de símbolos solo funcionan para la entrada de muestra. Esa entrada fue solo una muestra (la entrada real también puede incluir otros símbolos).
Sander

1
@RalfdeKleine Lo siento, hablé mal sal, no creo que puedas usar eso. Pero, puede deshacerse de la asignación de variables con "$([string[]][char[]](Read-Host)|sort)".
Kris Harper

4

APL 16

      ⍞←A[⍋48|⎕av⍳A←⍞]
Johnny walked the dog to the park.
      aaddeeeghhhJkklnnoooprtttwy.

Esto no cumple con los requisitos, porque J no viene antes de a, d, e, etc.
Timtech

Gran trabajo allí +1
Timtech

3

Perl6: 26 caracteres.

Primero ordena la salida en mayúscula, luego en minúscula, elimina los símbolos / espacios en blanco

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

Si los espacios en blanco / símbolos en la salida también pueden ignorarse, esto es solo 21 caracteres.

say [~] get.comb.sort

Esto clasifica entre mayúsculas y minúsculas, mantiene símbolos (26 caracteres)

say [~] get.comb.sort: &lc

Tiene que clasificar entre mayúsculas y minúsculas, pero puede ignorar espacios en blanco y símbolos si lo prefiere.
Timtech

3

Perl 34

Ahora toma entrada de STDIN.

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

Perl 18

Si la producción incluye mayúsculas primero y símbolos incluidos es aceptable:

print sort<>=~/./g

Sospecho que puede acortarlo aún más tomando la cadena de entrada (según la descripción) en lugar de obtenerla de la línea de cm.
breadbox

Oooh tienes razón!
Dom Hastings

2

Haskell, 88

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

(38 sin importaciones desde lib estándar)


2

k ( 10 9)

Lecturas de stdin

x@<_x:0:0

Ejemplo

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

Actualización: 65

Ejecutable en LinQPad

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

1
Puede eliminar el volcado y establecer que se ejecuta en el modo de expresión de LinqPad :)
Jacob


1

J, 12 caracteres

(/:32|a.i.])

Ignora cualquier carácter no alfa.


Esta tarea solicita un programa. No puedo ver ninguna E / S aquí. Si está utilizando indicadores de intérprete, debe indicarlos y contarlos en el recuento de caracteres.
John Dvorak

@ JanDvorak De acuerdo, ¿una función cuenta f=., o quieres que agregue la 1!:1[1?
Gareth

1!:1[1y echopor favor
John Dvorak

@ JanDvorak ¿Por qué quieres echo?
Gareth

¿El intérprete J genera automáticamente el resultado de la última expresión al ejecutar un archivo de script? ¿O cómo lo ejecutas?
John Dvorak

1

Javascript - 74

Desafortunadamente, debido a la forma en que JS clasifica los caracteres, no podemos usar la función de clasificación estándar:

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

En realidad, esto se puede acortar a:

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

1

F # ( 68 56)

Estoy aprendiendo F #, así que estoy seguro de que esto podría ser más corto:

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

Salida:

> f "Johnny walked the dog to the park."
        .aaddeeeghhhJkklnnoooprtttwy 

1

PHP, 50 bytes

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

no elimina las letras que no son, toma la entrada de STDIN; correr con -R.


0

R, 48 caracteres

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

Ejemplo 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?)

si es suficiente ingresar el código y la entrada directamente en el REPL, es solo asc:

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

el `s#es q poco de notación que indica que la cadena está ordenada (puede ser binaria búsquedas, etc.). si tiene que ir, eso cuesta dos caracteres, haciendo cinco:

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

si desea que se proporcione en stdin, es hora de cambiar a k4 (y nos deshacemos de él `s#de forma gratuita), y es una solución de ocho caracteres:

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

ese, por cierto, funcionará como un archivo de código exactamente como es (aún ocho caracteres, ya que q está bien con no tener la nueva línea final en un archivo de código). normalmente habría problemas con un banner de bienvenida y con el REPL permaneciendo abierto, pero si pasa la entrada como una herejía, todo eso desaparece:

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

no estoy seguro de dónde proviene esa nueva línea adicional en la salida ...


0

Jalea, 3 bytes

ŒlÞ

¡Mi primera solución Jelly en este sitio! ¡Gracias a @LeakyNun y @ErikTheOutgolfer por enseñarme cómo usar Jelly y @Dennis por hacerlo! :RE

Explicación

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

Alternativamente, ŒuÞhace exactamente lo mismo excepto convertir a mayúsculas en su lugar.


0

Powrshell, 36 bytes

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

Script de prueba:

$f = {

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

}

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

Salida:

True: aaddeeeghhhJkklnnoooprtttwy


0

Java 10, 72 bytes (como función lambda)

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

Pruébalo en línea.

Pero dado que es un viejo desafío que establece el 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);}}

Pruébalo en línea.

Explicación:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.