按自定义字母排序


9

面临的挑战是要创建一个对单词列表进行排序的程序,只需要使单词按随机给定的字母顺序排列即可。

您的程序将接受一串用逗号分隔的单词和一个新字母。
您的程序将以新的排序顺序以相同的方式输出每个单词。

例:

输入:

home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxzaeiouy

输出:

cat,green,home,network,egg,oval

这是一个 ,因此获胜者是程序最短的人。

这是我的第一个挑战,因此对问题/挑战的任何改进表示赞赏。


1.从您的例子中,我认为字母和单词之间用空格隔开。那是对的吗?2.单词总是小写吗?
丹尼斯

@丹尼斯对两个人都
同意

1
那是一个错误。我将对其进行编辑。
Mathetic

+1 OK问题(第一次尝试;-)。但是我看不到标题的相关性-也许您可以将其重命名为Sort by custom alphabet或更具创意?
Digital Trauma 2014年

@DigitalTrauma是的,可能会更好。我试着玩些话。我旨在参考ascii和utf-8等以询问它是哪个。但是那个失败了。我将其更改为您的建议,更好。
Mathetic

Answers:


2

CJam,26 19 17字节

rr:A;',/{Af#}$',*

在线尝试。

测试用例

$ cjam sort.cjam <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

怎么运行的

rr                    " Read two whitespace-separated tokens from STDIN. ";
  :A;                 " Save the second token (the alphabet) in A.       ";
     ',/              " Split the remaining token at commas.             ";
        {Af#}$        " Sort by the chunks' characters' indexes in A.    ";
               ',*    " Join, separating by commas.                      ";

好吧,由于您也使用了相同的方法,所以我的现在真的没有任何意义。
Optimizer

@Optimizer:你击败了我八秒钟。如果您不删除答案,我会回退。
丹尼斯2014年

不,我认为这是一个微不足道的变化。首先发布答案之前,我应该查看您的更新:)
优化程序

4

Bash + coreutils,37个字节

tr ,$2 \\na-z<<<$1|sort|tr \\na-z ,$2

输出:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 

1
处理逗号的好方法!
丹尼斯

2

Pyth,19个字符

j\,o_mx_zdNchczd\,

测试:

$ pyth -c "j\,o_mx_zdNchczd\," <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

说明:

                            Implicit: d=" "
                            Implicit: z=input()
j\,                         ",".join(
   o                                 order_by(lambda N:
    _                                                  rev(
     m                                                     map(lambda d:
      x_zd                                                              rev(z).index(d),
      N                                                                 N),
    chczd\,                                            z.split(" "[0].split(",")

本质上,它使用字符串中字符索引列表的键对块进行排序,然后将它们以逗号连接。逆转业务比重新分割字符串要短。


18个字节:j\,_omx_zdNchczd\,
丹尼斯

@丹尼斯非常聪明,谢谢。
isaacg 2014年

1

Ruby,53个 50字节

a,b=$*
$><<a.split(?,).sort_by{|w|w.tr b,'a-z'}*?,

我在排序之前使用Ruby tr替换自定义字母a-z。通过命令行参数输入。


如果$><<用于打印到屏幕,则可以删除一个字节(然后可以删除空格)。您可以通过如下分配$*变量来削掉另外两个字节:a,b=$*并使用#sort_by代替#sort_by!
britishtea 2014年

@britishtea谢谢。我以为我需要*$*(起初有,长度是一样的)。
Martin Ender 2014年

0

Python,131

w,a=input().split()
print(",".join(sorted(w.split(","),key=lambda s:"".join(["abcdefghijklmnopqrstuvwxyz"[a.find(c)]for c in s]))))

应该有足够的改进空间。


您不必使用键作为排序功能-只需a.find(c)直接使用list 。
isaacg 2014年

0

JavaScript(E6)102 102119

根据变量'a'中的字母,使用带有IO的弹出式窗口(提示+警报)使用映射函数'M'进行排序

x=prompt().split(/[ ,]/),
a=x.pop(),
M=w=>[10+a.search(c)for(c of w)]+'',
alert(x.sort((a,b)=>M(a)>M(b)))

作为具有1个字符串参数的(可测试)函数,返回一个字符串数组(92)

F=x=>(
  M=w=>[10+a.search(c)for(c of w)],
  x=x.split(/[ ,]/),
  a=x.pop(),
  x.sort((a,b)=>M(a)>M(b))
)

在FireFox / FireBug控制台中测试

F('home,oval,cat,egg,network,green zyxwvtsrqpnmlkjhgfdcbaeiou')

输出量

["network", "home", "green", "cat", "egg", "oval"]

1
-4,如果您将排序功能替换为(M(a)>M(b))-(M(a)<M(b))
DocMax 2014年

@DocMax非常好。事实证明,它比这更简单(stackoverflow.com/a/7232172/3640407
edc65

如果将提示重新用于输入,输出和别名,则可以通过分开输入来避免拆分调用。我认为应该节省一些字符。
IngoBürk2014年

我现在也只在电话里,为什么M这么复杂?使用不行M=w=>[...a].indexOf(w)吗?不幸的是,我现在无法测试。
IngoBürk,2014年

@IngoBürkw是一个单词,而不是一个字符。M将w中的每个字符替换为a中的位置。
edc65 2014年

0

Clojure,115字节

#(apply str(butlast(interleave(sort-by(fn[w](apply str(map(zipmap(sort %2)%2)w)))(re-seq #"[a-z]+"%))(repeat \,))))

哇,这本来可以很好地开始的,(sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))但是后来我意识到vec,排序的方式与字符串不同,所以插入这些逗号也需要大量的代码。

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.