PHP,141字节
for($a=count_chars($argn);$c=ord($s[++$p]?:$s=[OWU,W,HG,U,FU,X,SX,G,N17.$p=0][$i-print str_repeat($i++,$x)]);)$x=$a[$i+48]+=($p?-1:1)*$a[$c];
较早的版本,151个字节:
for($a=count_chars($argn,1);$s=[OWU,W,HG,U,FU,X,SX,G,N17][+$i++];print str_repeat($i,$a[$i+48]))for($p=0;$c=ord($s[$p]);)$a[$i+48]+=($p++?-1:1)*$a[$c];
循环从1到9的数字,对单词中的唯一字符进行计数,然后减去非唯一字符的计数,即可随时随地打印数字。
尽管它是随时随地打印的,但必须存储数字计数才能使9
表壳起作用。
与管道一起运行-nR
或在线尝试。
它将另外节省4个字节来存储数字计数$a[$i]
,$a[$i+48]
并使用ASCII 1
和7
(用引号引起来)而不是数字字符本身。
分解
for(
$a=count_chars($argn,1); # count character occurences in input
$s=[OWU,W,HG,U,FU,X,SX,G,N17][+$i++]; # loop through digit names
print str_repeat($i,$a[$i+48]) # print digit repeatedly
)
for($p=0;$c=ord($s[$p]);) # loop through name
$a[$i+48]+= # add to digit count
($p++?-1:1)* # (add first, subtract other)
$a[$c]; # character occurences
ONE
不是带有的唯一单词O
,因此它需要减去W
(仅出现在中TWO
)和U
(仅出现在中FOUR
)的计数,依此类推。
NINE
之所以很特别,是因为如果我使用字母(这将需要I-X-G-F+U
或N-O-S+W+U+X
),就无法直接减去,因此我会使用数字计数。
PHP,160字节
$a=count_chars($argn);foreach([W2O,U4FOR,X6SI,G8I,F5I,O1,R3,S7,I9]as$s)for(${$s[$p=1]}+=$n=$a[ord($s)];$c=ord($s[++$p]);)$a[$c]-=$n;while($$i--?print$i:$i++<9);
假定所有大写输入;字符可能会乱七八糟。
与管道一起运行-nR
或在线尝试。
说明
循环遍历数字字,计算其唯一字符在输入中的出现次数,并在此过程中减少其他字符的计数。“其他字符” 可能表示单词中的所有其他字符;但仅考虑到以后需要的那些,才节省了19个字节。
将str_repeat
循环转换为组合循环可节省5个字节。
使用变量变量进行数字计数又节省了8。
分解
$a=count_chars($argn); # count character occurences in input
foreach([W2O,U4FOR,X6SI,G8I,F5I,O1,R3,S7,I9]as$s) # loop through digit names
for(${$s[$p=1]}+= # 2. add to digits count
$n=$a[ord($s)]; # 1. get count of unique character
$c=ord($s[++$p]);) # 3. loop through other characters
$a[$c]-=$n; # reduce character count
while(
$$i--?print$i # print digit repeatedly
:$i++<9); # loop through digits