Показать предложение в алфавитном порядке

13

Напишите программу, которая принимает строку и выводит все символы в алфавитном порядке. Пробелы и символы можно игнорировать или удалять, но заглавные и строчные буквы должны оставаться в одном и том же регистре.

Пример ввода:

Johnny walked the dog to the park.

Образец вывода

aaddeeeghhhJklnnoooprtttwy

Правила:

• Любой язык

• Самый короткий код выигрывает.

АКС.
источник
5
Как сортировать прописные / строчные буквы? Верхний перед нижним, наоборот или стабильный со входом?
Говард
Нужно ли обрабатывать какие-либо буквы за пределами основного латинского алфавита («английского алфавита»)?
Себастьян Неграсус
3
Из названия я надеялся, что смогу показать «Приговор в алфавитном порядке». Или "Ceeennst". (ОК, "Sceeennt", если вы настаиваете на правильной прописной
букве
Когда вы Spaces and symbols can be ignored or deleted, это значит, должны игнорироваться; или вывод такой как , .aaddeeeffразрешенный?
Blutorange
2
Разве не должно быть 2 kс на выходе?
HyperNeutrino

Ответы:

2

MathGolf , 2 байта

áδ

Попробуйте онлайн!

Пример вывода

      .aaddeeeghhhJkklnnoooprtttwy

Удаление не алфавитных символов

Чтобы удалить все не алфавитные символы, это решение работает:

áδgÆ∞_δ¡

Это то же самое, что и приведенный выше код, за которым следует фильтрация, где каждый символ сначала удваивается, а затем сравнивается его собственная заглавная буква. Например, строка "a"преобразуется в, "aa"а затем в заглавную "Aa", что не равно "aa". Таким же образом, строка "B"преобразуется в "BB"и с большой буквы "Bb", что не равно "BB". Однако "."он преобразуется в ".."и не изменяется при использовании заглавных букв, поэтому он будет отфильтрован.

объяснение

Мне действительно нужно больше обработки строк в MathGolf ... Сейчас даже нет оператора для преобразования в строчные / прописные буквы. Единственной вещью, которую я мог использовать, был оператор капитализации, который работает как оператор верхнего регистра для строк длины 1. Это решение также сортирует не алфавитные символы, но их можно игнорировать. Буквы алфавита сохраняют свой регистр и выводятся в правильном порядке.

á    sort by comparator
 δ   capitalize string
maxb
источник
12

GolfScript, 24/6 символов

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

Пример:

> Johnny walked the dog to the park.
aaddeeeghhhJkklnnoooprtttwy  

Если ввод ограничен печатной ASCII, код может быть сокращен на три символа, используя в {95&.64>\91<&},качестве фильтра.

Можно проверить здесь .

Версия, которую можно игнорировать, еще короче (6 символов):

{31&}$

и дает выход

> Johnny walked the dog to the park.
      aaddeeeghhhJkkl.nnoooprtttwy
Говард
источник
и если «alphabetize» можно истолковать как «порядок ASCII в порядке», его можно просто уменьшить до{}$
McKay
@McKay Вопрос явно гласит иначе. И {}$будет эквивалентно $.
Говард
О, да. Спасибо, я пытаюсь выучить гольф-сценарий
МакКей,
7

Утилиты ядра GNU - 25 символов (29 сбрасываемых символов)

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

Пример (из GNU bash 3):

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

Из вопроса:

Пробелы и символы можно игнорировать или удалять

Я решил оставить их в! Чтобы сохранить только буквенные символы, заменить fold -1с grep -o \\wна +4 символов.

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

Благодаря Firefly для рекомендуя grep -oболее sedи Wumpus для fold -1. ;-)

joeytwiddle
источник
Это не алфавитный порядок, заглавные буквы J все равно должны быть отсортированы по алфавиту с другими строчными буквами.
Акс.
О, хороший момент, Акс. Я должен добавить -f(сложить), sortчтобы игнорировать регистр.
Joeytwiddle
6

С, 121

Это довольно долго по сравнению с другими записями, но оно не зависит от встроенных функций сортировки или 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);}

Более читаемая версия:

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

Это реализация сортировки вставкой с нечувствительным к регистру сравнением между элементами (с использованием |32побитовой операции). Это связано с тем, что в кодировке ASCII заглавные и строчные буквы отличаются только на 2 5 бит.

user12205
источник
5

Рубин - 33 символа

$><<gets.chars.sort(&:casecmp)*''
Сива
источник
Где выходной код?
Джон Дворжак
Вы можете сэкономить 2 символа, используя *""вместо .join.
manatwork
Вы могли бы использовать p, но это сомнительно, так что просто используйте puts. Кроме того , $<это ярлык для ФГДДА
Shelvacu
@manatwork отредактировал ...
Сива
Вы можете сэкономить 1 символ, используя $><<вместо того, putsчтобы разделительное пространство можно было удалить.
manatwork
5

PowerShell: 39

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

Результат

  .aaddeeeghhhJkklnnoooprtttwy

C #: 100

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

Результат

aaddeeeghhhJkklnnoooprtttwy
Ральф де Кляйн
источник
Это не программа, как того требует вопрос.
Говард
Вам не нужно ToCharArray; StringреализуетIEnumerable<char>
Рик
@howard, так как скрипты считаются программой?
Ральф де Кляйн
1
Ваши решения, исключающие символы, работают только для ввода образца. Этот вход был только примером (реальный вход может включать и другие символы).
Сандер
1
@RalfdeKleine Извините, я неправильно сказал sal, я не думаю, что вы можете использовать это. Но вы можете избавиться от назначения переменной с помощью "$([string[]][char[]](Read-Host)|sort)".
Крис Харпер
4

APL 16

      ⍞←A[⍋48|⎕av⍳A←⍞]
Johnny walked the dog to the park.
      aaddeeeghhhJkklnnoooprtttwy.
Марк Плотник
источник
Это не соответствует требованиям, потому что J не предшествует a, d, e и т. Д.
Timtech
Отличная работа там +1
Timtech
3

Perl6: 26 символов

Сначала сортирует строчные буквы, затем строчные, удаляет символы / пробелы

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

Если пробел / символы в выходных данных также можно игнорировать, это всего 21 символ.

say [~] get.comb.sort

Это сортирует без учета регистра, сохраняет символы (26 символов)

say [~] get.comb.sort: &lc
Ayiko
источник
Он должен сортировать без учета регистра, но при желании может игнорировать пробелы и символы.
Timtech
3

Perl 34

Теперь принимает данные от STDIN.

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

Perl 18

Если вывод, включающий заглавные буквы и включенные символы, является приемлемым

print sort<>=~/./g
Дом Гастингс
источник
Я подозреваю, что вы можете сократить его дальше, взяв строку из ввода (согласно описанию) вместо того, чтобы получить ее из cmdline.
хлебница
Ооо, ты прав!
Дом Гастингс
2

Хаскелл, 88

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

(38 без импорта из стандартной библиотеки)

Vektorweg
источник
2

к ( 10 9)

Читает со стандартного ввода

x@<_x:0:0

пример

x@<_x:0:0
Johhny walked the dog to the park.
"      .aaddeeeghhhhJkklnoooprtttwy"
skeevey
источник
2

C #: 83

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

Обновление: 65

Исполняемый в LinQPad

new string(Console.ReadLine().OrderBy(i=>i+"").ToArray()).Dump();
Аббас
источник
1
Вы можете удалить дамп и указать, что он работает в режиме выражения LinqPad :)
Джейкоб
1

Питон 3: 45

print(''.join(sorted(input(),key=str.lower)))
evuez
источник
Я не в Python, но ваш код удаляет пробелы в период?
Ральф де Кляйн
Нет, но "Пробелы и символы можно игнорировать или удалять", поэтому я просто игнорирую их!
Евес
Ах, чтение трудно;)
Ральф де Кляйн
Использование лямбды экономит несколько байтов: попробуйте онлайн
Ведант Кандой
1

J, 12 символов

(/:32|a.i.])

Игнорирует любые не-буквенные символы.

Гарет
источник
Эта задача требует программы. Я не вижу здесь ввода / вывода. Если вы используете какие-либо флаги интерпретатора, вы должны указать их - и подсчитать их до количества символов.
Джон Дворак
@JanDvorak Хорошо, будет ли функция считать - f=.или вы хотите, чтобы я добавил 1!:1[1?
Гарет
1!:1[1и, echoпожалуйста,
Джон Дворжак
@JanDvorak Почему вы хотите echo?
Гарет
Интерпретатор J автоматически выводит результат последнего выражения при запуске файла сценария? Или как ты это делаешь?
Джон Дворак
1

Javascript - 74

К сожалению, из-за способа сортировки символов в JS мы не можем использовать стандартную функцию сортировки:

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

На самом деле это может быть сокращено до:

prompt().split("").sort((a,b)=>a.localeCompare(b)).join("")
eithed
источник
1

F # ( 68 56)

Я изучаю F #, поэтому я уверен, что это может быть короче:

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

Выход:

> f "Johnny walked the dog to the park."
        .aaddeeeghhhJkklnnoooprtttwy 
Рик
источник
1

PHP, 50 байт

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

не удаляет не-буквы, принимает данные из STDIN; беги с -R.

Titus
источник
0

R, 48 символов

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

Пример использования:

> cat(sort(unlist(strsplit(scan(,""),""))),sep="")
1: Johnny walked the dog to the park.
8: 
Read 7 items
.aaddeeeghhhJkklnnoooprtttwy
plannapus
источник
0

q / k4 (3? 5? 8?)

если достаточно ввести код и ввод непосредственно в REPL, это просто asc:

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

`s#является немного д обозначений , что указывает на то, что строка находится в отсортированном порядке (может быть двоичным поиск, и т.д.). если он должен идти, то стоит два символа, получая пять:

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

если вы хотите, чтобы он был предоставлен в stdin, пришло время переключиться на k4 (и мы избавились от него `s#бесплатно), и это решение из восьми символов:

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

этот, кстати, будет работать как файл кода точно так же, как есть (по-прежнему восемь символов, так как q хорошо, если в кодовом файле нет последней новой строки). обычно бывают проблемы с приветственным баннером и с открытым REPL, но если вы передадите входные данные в виде строки, все это исчезнет:

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

на самом деле не уверен, откуда взялся этот дополнительный символ новой строки ....

Аарон Дэвис
источник
0

Желе, 3 байта

ŒlÞ

Мое первое решение Jelly на этом сайте! Спасибо @LeakyNun и @ErikTheOutgolfer за то, что научили меня, как использовать Jelly и @Dennis для этого! : D

объяснение

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

Или же ŒuÞделает то же самое, кроме преобразования в верхний регистр.

HyperNeutrino
источник
0

Powrshell, 36 байт

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

Тестовый скрипт:

$f = {

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

}

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

Выход:

True: aaddeeeghhhJkklnnoooprtttwy
Mazzy
источник
0

Java 10, 72 байта (как лямбда-функция)

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

Попробуйте онлайн.

Но так как это старая проблема, заявив полную программу:

Java 10, 126 байт (как полная программа)

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

Попробуйте онлайн.

Объяснение:

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
Кевин Круйссен
источник