以字母顺序显示句子


14

编写一个程序,该程序需要一个字符串,并按字母顺序输出所有字符。可以忽略或删除空格和符号,但是大写和小写字母必须保持大小写相同。

输入样例:

Johnny walked the dog to the park.

样品输出

aaddeeeghhhJklnnoooprtttwy

规则:

•任何语言

•最短的代码获胜。


5
如何对大写/小写字母进行排序?上部先于下部,反之亦然或与输入稳定吗?
霍华德

是否需要处理基本拉丁字母(“英语字母”)以外的任何字母?
塞巴斯蒂安·内格拉苏斯

3
从标题开始,我希望我能显示“按字母顺序排列的句子”。或“ ceeennst”。(如果您坚持正确的大小写和ASCII顺序,则可以,“ Sceeennt”。)
keshlam 2014年

当您使用时Spaces and symbols can be ignored or deleted,是否必须忽略?还是, .aaddeeeff允许输出 ?
blutorange

4
输出中应该没有2 ks吗?
HyperNeutrino

Answers:


1

MathGolf,2个字节

áδ

在线尝试!

输出示例

      .aaddeeeghhhJkklnnoooprtttwy

删除非字母字符

要删除所有非字母字符,此解决方案有效:

áδgÆ∞_δ¡

它与上面的代码相同,然后进行过滤,其中每个字符首先加倍,然后比较其自身的大小写。例如,字符串"a"转换为"aa",然后大写为"Aa",不等于"aa"。以同样的方式,将字符串"B"转换为"BB"并大写为"Bb",这不等于"BB"。但是,大写时"."会转换为"..",并且不变,因此它将被滤除。

说明

我真的需要在MathGolf中进行更多的字符串处理...现在甚至没有运算符可以转换为小写/大写形式。我唯一可以使用的是大写运算符,它对长度为1的字符串使用大写运算符。此解决方案还对非字母字符进行排序,但是可以忽略这些字符。字母字符保留大小写,并以正确的顺序输出。

á    sort by comparator
 δ   capitalize string

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

如果“字母化”可以解释为“ ASCII顺序还可以,则可以简化为{}$
McKay 2014年

@McKay这个问题明确地陈述了不同的观点。并且{}$将等效于$
2014年

哦耶。谢谢,我正在尝试学习golfscript
McKay

8

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 -1grep -o \\w的+4个字符。

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

由于萤火虫对推荐grep -osed,并为Wumpus fold -1。;-)


这不是字母顺序,大写字母J仍应与其他小写字母按字母顺序排序。
阿克斯。

哦,好点的。我必须添加-f(折叠)sort以忽略大小写。
joeytwiddle

6

C,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位。



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

这不是问题所要求的程序
2014年

你不需要ToCharArray; String工具IEnumerable<char>
Rik 2014年

@howard那么脚本会算作程序吗?
拉尔夫·德克莱因2014年

1
不含符号的解决方案仅适用于示例输入。该输入只是一个示例(实际输入也可以包含其他符号)。
桑德2014年

1
@RalfdeKleine抱歉,我打错了sal,我认为您不能使用它。但是,您可以使用摆脱变量分配"$([string[]][char[]](Read-Host)|sort)"
克里斯·哈珀

4

Perl6:26个字符

首先对输出进行大写排序,然后对小写进行排序,删除符号/空格

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

如果输出中的空格/符号也可以忽略,则仅为21个字符。

say [~] get.comb.sort

这不区分大小写地排序,保留符号(26个字符)

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

它必须不区分大小写地排序,但是如果需要,可以忽略空格和符号。
Timtech,2014年

4

杀伤人员地雷16

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

这不符合要求的,因为j没有前,d,E等来了
Timtech

那里的出色工作+1
Timtech

3

Perl 34

现在从中获取输入STDIN

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

Perl 18

如果输出包括大写字母和包括符号的内容是可接受的:

print sort<>=~/./g

我怀疑您可以通过从输入中获取字符串(按照说明)而不是从cmdline来进一步缩短它。
面包盒

哦,你是对的!
Dom Hastings 2014年


2

哈斯克尔,88

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

(38个未从标准库导入)


2

k(10 9)

从stdin读取

x@<_x:0:0

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

更新:65

可在LinQPad中执行

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

1
您可以删除转储,并声明其在LinqPad的Expression Mode中运行:)
Jacob

1

J,12个字符

(/:32|a.i.])

忽略任何非字母字符。


此任务要求一个程序。我在这里看不到任何I / O。如果使用任何解释器标志,则必须声明它们-并将它们计入字符数。
约翰·德沃夏克

@JanDvorak好的,函数会计数- f=.,还是让我添加1!:1[1??
Gareth 2014年

1!:1[1echo
John Dvorak 2014年

@JanDvorak你为什么要echo
Gareth 2014年

运行脚本文件时,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("")

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


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

0

q / k4(3?5?8?)

如果足以将代码和输入直接输入到REPL中,那就是asc

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

`s#为q的符号的位,表示该字符串以排序的顺序(可以是二进制搜索,等等)。如果必须这样做,则需要花费两个字符,即五个字符:

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"

btw将完全按原样作为代码文件工作(仍为8个字符,因为q很好,因为代码文件中没有最后的换行符)。通常,欢迎标语和REPL保持打开状态会出现问题,但是如果您将输入作为herestring传递,那么一切都会消失:

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

实际上不确定输出中的多余换行符是从哪里来的。


0

果冻,3个字节

ŒlÞ

我在该网站上的第一个果冻解决方案!感谢@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Þ除了转换为大写字母外,执行完全相同的操作。


0

Java 10,72个字节(作为lambda函数)

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

0

05AB1E3 2 字节

Σl

忽略非字母字符,因此有些在前导而有些在尾随。

在线尝试

删除非字母字符的版本是3 个字节

áΣl

在线尝试

说明:

á    # Optional: only leave the letters ([a-zA-Z]) of the (implicit) input-string
 Σ   # Sort the characters in the string by (sorted by their ASCII unicode value):
  l  #  Their lowercase equivalent (in case of the letters)
     # (And output the result implicitly)

0

Powershell,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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.