字母整数


19

字母整数

对于给定的一组数字,将其拼写时按字母顺序排列(即1:1、2:2、90:90、19:19)。您的代码应适用于该范围[-999999, 999999]。输出必须在数字之间有一个定界符。空格将起作用,空格和逗号也将起作用,如下例所示。输入可以是整数数组,带分隔符的数字字符串,或者您认为合适。假定所有整数都是唯一的。

在本次挑战中,数字不带连字符,空格在其他任何字符之前按字母顺序排列。假定使用单词表示负数minus。例如,four将在之前four thousand,数字-40将使用字符串进行排序minus forty。假设所有数字将仅由数字单词组成,不包含连词(例如,使用two thousand forty two代替two thousand and forty two)。


测试用例

单位数整数:

输入:

1, 2, 3, 4, 5

输出:

5, 4, 1, 3, 2

多个数字整数:

输入:

-1002, 5, 435012, 4, 23, 81, 82

输出:

81, 82, 5, 4, 435012, -1002, 23

单词之间的空格,不能使用连字符,逗号或“和”:

输入:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

输出:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

请记住,这是,所以字节最少的代码将获胜。不允许有漏洞!


这是相关沙箱帖子的链接
wubs

输入是否会包含多个单个整数?
ETHproductions's

@ETHproductions不,不会。我将在问题中指定。
wubs 2013年

8
欢迎来到PPCG。好的头像。:D不错的第一个问题。
AdmBorkBork

@TimmyD谢谢!我期待PowerShell在这里提供我所能解决的一切。
wubs 2016年

Answers:


5

的JavaScript(ES6),189个 179 186字节

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

基本思想是将每个输入数字转换为与所有其他数字-字符串对相比处于正确词法位置的短字符串。这是使用的字典:(不要运行代码段;它只是用来隐藏长列表。)

这创建了一种非常简洁的方式来将每个数字映射到其词典正确位置。这就是递归q函数的作用:

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

0在字符串的开头是确保例如100( one hundred,转换为PK0)之前进行排序101one hundred one,转化成PKP)。这会产生一个奇怪的情况,其中0(zero)被排序到数组的前面,因此要解决此问题,在排序函数中,我们首先使用来对右边的零进行排序!x-!y||(...


似乎不适用于[1100, 1000]。我希望输出为1000 (one thousand), 1100 (one thousand one hundred),但输出与输入的顺序相同。
牛奶

@milk Hmm ...我不确定为什么会这样,但是我会调查一下。
ETHproductions's

@milk Ah,1000被解析为one thousand zero; 我会暂时修复此问题。我们是否必须自己支持0?这是一种独特的情况,它将为我的代码增加15个字节左右。
ETHproductions 2016年

11

通知7,214 201 118字节

Inform 7是打高尔夫球的绝对糟糕的语言,所以我想在这里给它机会。

缩进应使用制表符(\t),但HTML不喜欢这些字符。相反,Inform不喜欢缩进的空间,因此,如果从此处复制粘贴代码进行测试,则必须用制表符替换空格。或者只是从Markdown来源复制粘贴。

打高尔夫球:

到X:
    重复表1:
        现在,Q条目是“ [R单词的条目]”;
    以Q顺序对表1进行排序;
    说“ [表1中的R]”。

输入应该是一个Inform表,如下所示(\t在各列之间):

表格1
R(数字)Q(文本)
-1002
5
435012
4
23
81
82

输出:

81,82,5,4,435012,-1002,23

该函数在表格中运行一次,并在新列中添加每个数字的文本表示形式。然后根据文本列对表行进行排序;在Inform中,字符串按字典顺序排序。最后,它以新顺序打印出原始列。方便地,Inform 7的“粗糙但有时有用的”格式用于打印表列,结果完全按照要求是逗号分隔的。

脱节,带有样板显示如何调用该函数:

要按字母顺序打印数字:
    在可排序数字表中重复:
        现在名称条目是“ [单词索引条目]”;
    按名称顺序对可排序数字表进行排序;
    说“ [可排序数字表中的索引列]”。

可排序数字表
索引(编号)名称(文本)
-1002
5
435012
4
23
81
82

有一个房间。
播放开始时:按字母顺序打印数字。

1
我对此有些困惑。是words对Inform 7中内置的数字的拼写版本的引用吗?
帕维尔

1
@帕维尔确实!“(单词中的数字)”返回带有数字文本表示形式的字符串。它方便地对负数使用“减号”,并且在单词之间放置连字符时,它会始终如一地执行,并在所有字母之前按字母顺序对连字符进行字母排序(因此最终结果是相同的)。
Draconis

2
+1选择语言。我必须检查一下,但是我怀疑还有一些打高尔夫球的机会。例如,解析器是否真的需要所有这些“ the”文章?您必须要问问OP,但是我看不出任何明显的原因,为什么“和”不是有效的分隔符。即使不允许,也明确允许使用单个空格,因此就say "[R entry] "足够了。
Ilmari Karonen

我会说“和”结尾很好。我没有说定界符必须统一,因此这是一个完全可以接受的答案。如果我能给出最有趣的答案的分数,我会给您。我真的很喜欢这种语言的可读性,甚至喜欢打高尔夫球。不错的工作!
wubs 2016年

我终于有机会稍微使用了Inform7,并设法将输入的内容重新压缩到仅118个字节。由于在注释中张贴Inform代码效果不佳,因此我继续将其直接编辑为您的答案。希望您不要介意,如果愿意,可以随时恢复和/或调整我的编辑。
Ilmari Karonen

4

Mathematica,67个字节

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

未命名函数,将整数列表作为其参数,并返回整数列表作为其值。#~IntegerName~"Words"是内置的,可将整数更改为其英文名称。IntegerName有时在其输出中包含逗号和连字符,因此该StringReplace调用摆脱了这些。(遗憾的是,连字符实际上是UTF-8中的3字节字符8208。)然后SortBy根据修改后的整数名称的值,按字母顺序对原始列表进行排序。

一个很好的巧合:IntegerName使用negative而不是minus在其输出中使用-但是在这两个单词之间的字母顺序中没有出现在任何允许的数字名称中的单词,因此不需要替换!

(致妮吉特的提示让我想起了Sortby。)


荣誉!我非常接近这个解决方案,但是那破折号让我头疼!
ngenisis '16

您的答案是否实际上使用了正确的连字符?如果我将此处的内容复制到Mathematica中,则不会替换中的连字符IntegerName。Wolfram文档说它是Unicode字符2010
ngenisis '16

可能不是,我试图在此答案中获得正确的连字符,但看起来我没有成功。
格雷格·马丁

我把您的答案减半了;)
J. Antonio Perez

然后一些...您对字符串进行了不必要的修改。
J. Antonio Perez

4

Bash + GNU utils + bsdgames,52

  • @izabera节省了4个字节。
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

I / O是换行符分隔的行。

  • 第一个sed表达式用一个shell命令替换每个数字,该命令输出数字的单词形式(由bsdgamesnumber实用程序给出),:然后是数字的数字形式。
  • 然后sort编辑。
  • 然后,第二个sed去除开头的字符(包括):,并按要求对数字形式进行排序。

number正确处理“减号”,并且其输出足够接近sort所需格式的特定格式。它确实输出“四十四”而不是“四十四”,但是从排序的角度来看这无关紧要。

bsdgames软件包可能需要安装:

sudo apt-get install bsdgames

sedsort公用事业几乎肯定是已经在你的发行版。


-t:是没用的,您可以使用number<<<&
izabera '16

@izabera是的,谢谢,我删除了-t:。但是,sed的eval功能使用来运行命令sh,因此bash之类的功能<<<将不起作用。
Digital Trauma

只要sh是bash,它就可以正常工作:P
izabera '16

@izabera Nope-如果bash在开始sh时尝试尽可能地模仿Posix sh,那么这意味着bashisms <<<已关闭。GNU sedeval功能使用/bin/sh -c ...和不启动命令/bin/bash -c ...。你有尝试过吗?
Digital Trauma

bash永远不会关闭<<<,即使在posix模式下也不会关闭
izabera '16

1

Python +变形,97 91 89字节

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

使用该inflect库将words整数数组转换为其语音/字符串表示形式。存储在k / v对字典中,其中键是数字表示,值是字符串表示。返回按值排序的键列表。

编辑:由于ETHproductions和Alex.S,节省了5和3个字节!


欢迎来到PPCG!您可以通过去除空间来打高尔夫球; 例如,第二行可以是a={x:inflect.engine().number_to_words(x)for x in words}
ETHproductions's

您可以在第二行中使用from inflect import*和抛出来节省两个字节inflect.
Alex.S,2016年

las,看来这也无法正确地对列表40、44、40000、40804、40004、40204进行排序(应保持该顺序)。
Ilmari Karonen

0

Mathematica,30个字节

下面的答案输出一个纯函数,该函数将一个整数列表作为输入,并按其字母名称对它们进行排序。正是医生命令的;)

SortBy[#~IntegerName~"Words"&]

这是非高尔夫版本:

SortBy[IntegerName[#, "Words"]&]

这是一个示例用法:

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

也可以写成

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

它们产生相同的输出-在mathematica中,f[x]等于f@x

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

另一个用户在Mathematica中发布的答案更长。该答案试图纠正在数学运算中对数字进行数字化的方式之间的一些细微差异,以更好地符合OP规定的数字对数字进行运算的方式,但是它们所校正的内容不会影响排序顺序,我的答案与它们的输出相同:

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

很棒的调查!—不幸的是,他们实际上并没有给出相同的命令。TheirF在880,000之前正确地对888进行排序,而在880,000之前MyF则没有。问题可能出在奇怪的连字符的复制粘贴中:您的的版本TheirF可能正在替换普通的连字符(没有这些字符),而实际版本则在替换奇怪的3字节Unicode连字符。(看看是否有必要删除逗号还是很有趣的。)
Greg Martin

我在Range [999999]上进行了测试。看起来不需要消除逗号,但是绝对有必要用“”替换“ [连字符]”。
ngenisis '16

0

Common Lisp,113个字节

无需外部库。

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

输出是否x'(1 2 3 4 5)

(5 4 1 3 2)
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.