按数字在pi中的首次出现对它们进行排序


17

给定一个非负数n,请npi中第一个出现的数字对其进行排序。

输入可以通过函数cli参数或STDIN获取,并可以作为字符串,char []或整数。您可以通过返回值,退出状态或STDOUT输出。



我们可以将输入和输出视为字符串还是数字数组?
ETHproductions'Apr

@ETHproductions已澄清。
罗曼·格拉夫(RomanGräf)

19
一些测试用例会很好。
丹尼斯,

1
现在已经存在12个答案,所有这些答案都执行相同的操作,如果您仍然不清楚要问什么,那么这不是问题的问题。
Leaky Nun

Answers:


14

Pyth,8个 6字节

ox+.n0

在这里尝试。

-1感谢Leaky Nun0如果需要,输入将提供。
感谢Jakube的琐碎-1 :不需要反引号(啊,我怎么想念它,怎么办?!?)。


哇,这甚至击败了05AB1E!编辑:它没有击败05AB1E,我也不想偷:(
Erik the Outgolfer

3
我找到了。最后,您不需要0。如果输入中包含0,则输入0将提供;如果输入不带0,则无所谓。
Leaky Nun

3
@LeakyNun,甚至可以保存反勾号:ox+.n0
Jakube '17

好吧,无视第一个评论,多亏LeakyNun和Jakube,我再次击败了05AB1E,希望这次好。
Erik the Outgolfer '17

1
大量的隐式输入。
isaacg


18

05AB1E10 9 7字节

感谢Leaky Nun节省了1个字节,因为它不需要过滤出重复项。
感谢Adnan节省了2个字节。

žqRvy†J

在线尝试!

说明

žq       # push pi to 15 decimals (contains all digits but 0)
  R      # reverse
   vy    # for each char in pi
     †J  # move it's occurrences in the input to the front

13žsRvy†J9个字节
Leaky Nun

@LeakyNun:是的,重复没有关系。谢谢:)
Emigna

3
可以žq代替使用13žs吗?
阿德南

@Adnan似乎不起作用。
Erik the Outgolfer

2
@Adnan:当然可以。我没有意识到还有另一个pi常量:)
Emigna '17

8

果冻,10字节

“ṀSṪw’ṾiµÞ

在线尝试!

将输入作为一串数字。

@ETHproductions --3个字节

说明

“ṀSṪw’ṾiµÞ
        µ  - Separate chain into function “ṀSṪw’Ṿi and sort atom Þ.
         Þ - Sort the input by
       i   - Each digit's index in: 
“ṀSṪw’     - the literal 3145926870 ...
      Ṿ    - transformed into the list 3,1,4,5,9,2,6,8,7,0

我认为3145926870可以将其表示为4位基数250的字符串(这意味着它将占用6个字节而不是10个字节),但是我不确定如何将其压缩。
ETHproductions'Apr

果冻没有pi的内置函数吗?
数学迷

@mathjunkie但Jelly在字符串处理方面不是很有效
Leaky Nun

@mathjunkie是的,但是对列表的操作占用了太多字节
fireflame241

“ṀSṪw’会给你的3145926870
Leaky Nun

8

Japt10 9字节

8个字节的代码,-P标志+1 。

–!bMP+U

在线尝试!将输入作为字符串。

说明

–!bMP+'0  // Implicit input

¬          // Split the input into chars.
 ñ         // Sort each char in the resulting list by
  !b       //   its index in
    MP+U   //     Math.PI + the input.
-P         // Join the result back into a single string.
           // Implicit: output result of last expression

7

JavaScript(ES6),54个字节

f=
s=>[...s].sort((a,b)=>k[a]-k[b],k=`9150236874`).join``
<input oninput=o.textContent=f(this.value)><pre id=o>

将字符串用于I / O。


7

果冻 8  7 字节

得益于Dennis,它为-1个字节(0聪明地使用了输入中存在的任何内容)。

ØP;ṾiµÞ

在线尝试!

怎么样?

ØP;ṾiµÞ - Main link: string s (char list)
     µÞ - sort the characters, c, of s by:
    i   -   first index of c in:
ØP      -     pi yield: 3.141592653589793
  ;     -     concatenate with left: [3.141592653589793, c]
   Ṿ    -     un-evaluate: "3.141592653589793,c" (a char list with the digit character c)
                                if any c is 0 ^ it will then be to the right of all others

...然后我正在搜索平方-的3820009(sqrt 14592468760081)仍然3是base中的数字250
乔纳森·艾伦,

在你的解释是错误的。
Erik the Outgolfer '17

@EriktheOutgolfer-谢谢,调整了。
乔纳森·艾伦

6

CJam 15 12 10 8字节

r{P`#c}$

在线尝试!

-3:使用基于 P pi变量而不是文字。
-2:决定我根本不需要进行唯一性化,因为找到索引无论如何都是第一次出现。 -2:感谢jimmy23013使用x mod 65536的有趣方法。

说明:

r {P`#c} $ e#接受输入令牌
re#以整数作为字符串
 {P`#c} e#排序键:
  P e#按下P(默认为3.141592653589793)
   `e#转换为字符串表示形式
    #e#在我们创建的字符串中查找char的索引
         e#A'。' 永远不会在整数中找到,但没关系,因为移位保留了理想的排序。
         e#一个“ 0”将被索引为-1。
     ce#将索引转换为char
         e#这首先计算索引%65536,然后转换为char。我们需要这样做,因为否则0将被索引为-1,即最小索引。
         e#我们不需要转换回整数,因为我们可以使用字典排序。
       $ e#用键排序


1
耶(Yay),击败MATL():)
外来客埃里克(Erik the Outgolfer)'17


@ jimmy23013哇,这很聪明。几乎就像int(x)%65536有一个内置函数,ci甚至可以转换回整数。
大公埃里克(Erik the Outgolfer)'17年

5

PHP,71字节

正则表达式溶液较短

for(;~$c=_3145926870[$i++];)echo str_repeat($c,substr_count($argn,$c));

要么

for(;~$c=_3145926870[$i++];)echo str_pad("",substr_count($argn,$c),$c);

在线版本

PHP,78字节

for(;~$c=$argn[$i++];)$j[strpos("3145926870",$c)].=$c;ksort($j);echo join($j);

PHP,112字节

$a=str_split($argn);usort($a,function($x,$y){return strpos($d="3145926870",$x)<=>strpos($d,$y);});echo join($a);

在线版本


我添加了一个69字节的解决方案。也许我们可以将其减少到66个字节;)
Christoph

5

C,103 97字节

char*p="3145926870";s(*a,*b){return strchr(p,*a)-strchr(p,*b);}f(char*t){qsort(t,strlen(t),1,s);}

在线尝试


谢谢@ ceilingcat,MSVC根本不喜欢这种方式,我想我应该使用gcc作为原型:-)
Johan du Toit

MSVC可能会不喜欢的事实,GCC可以让你沟charchar*pchar*t
ceilingcat


3

MATL,14个字节

YP99Y$uj!y=sY"

在线尝试!

举例说明

该符号;用作矩阵中的行分隔符。因此[1 2 3],行向量,[1; 2; 3]列向量和[1 2; 3 4]方矩阵都是。为了清楚起见,后者也可以表示为

[1 2;
 3 4]

以输入2325为例。

YP     % Push approximation of pi as a double (predefined literal)
       % 3.14159265358979
99Y$   % Variable-precision arithmetic with 99 digits. Gives a string.
       % The input 3.14159265358979 is recognized as representing pi
       % STACK: '3.141592653589793238462 ··· 707'
u      % Unique entries, keeping order of their first appearance
       % STACK: '3.145926870'
j      % Input line as a string
       % STACK: '3.145926870', '2352'
!      % Transpose
       % STACK: '3.145926870', ['2'; '3';'5'; '2']
y      % Duplicate the second-top element in the stack
       % STACK: '3.145926870', ['2'; '3';'5'; '2'], '3.145926870'
=      % Test for equality, with broadcast. This gives a matrix with
       % all pairwise comparisons)
       % STACK: '3.145926870', [0 0 0 0 0 0 1 0 0 0 0;
       %                        1 0 0 0 0 0 0 0 0 0 0;
       %                        0 0 0 0 1 0 0 0 0 0 0;
       %                        0 0 0 0 0 0 1 0 0 0 0]
s      % Sum of each column
       % STACK: '3.145926870', [1 0 0 0 1 0 2 0 0 0 0]
Y"     % Run-length decoding. Implicitly display
       % STACK: '3522'


2

C#交互式,37 36字节

i.OrderBy(c=>"145926870".IndexOf(c))

实际上,您必须在C#交互中执行此操作才能获得正确的结果,但是我想这就是您对exit status的含义。变量实际上是输入变量(例如可以是字符串),因此基本上是方法参数。

我认为代码本身非常简单。


哪里3呢?
保罗

1
@Paul并不是必须的,因为如果找不到该元素,它将返回-1。
MetaColon'5

不过,这只是一小段代码,我敢肯定,即使在交互式环境中,您也必须指定为什么i在某处,以便可以将其用作输入。另外,如果您要说的是C#,则必须将其包括using System.Linq;在字节数中。但是,如果这是Interactive,则应将语言指定为C#Interactive,而不仅仅是C#。
TheLethalCoder

@TheLethalCoder我将其更新为C#Interactive。交互中不需要使用,因为它是自动包含的。
MetaColon

2

05AB1E5 6字节(非竞争)

不得不意识到0在标准长度pi中不存在常数。

Σтžsyk

在线尝试!

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi

您应该将此不竞争标记为Σ比挑战新的竞争。
艾米娜(Emigna)'17年

@Emigna标记了它,谢谢。但是经过所需的修复后,它无论如何都不会比获胜的答案更短了):
kalsowerus

太糟糕了,您需要该方法使用零。至少对于这种语言来说应该是最佳的。不能要求更多:)
艾米娜(Emigna)'17年

2

PHP,66 65字节

感谢Titus,节省了1个字节。

while(~$d=_3145926870[++$i])echo preg_filter("/[^$d]/",'',$argn);

1

Java 7,110字节

String c(String s){String r="";for(char i:"3145926870".toCharArray())r+=s.replaceAll("[^"+i+"]","");return r;}

说明:

String c(String s){                       // Method with String parameter and String return-type
  String r="";                            //  Result String
  for(char i:"3145926870".toCharArray())  //  Loop over the characters of "3145926870"
    r+=s.replaceAll("[^"+i+"]","");       //   Append the result-String with all the occurrences of the current character
                                          //  End of loop (implicit / single-line body)
  return r;                               //  Return the result-String
}                                         // End of method

测试代码:

在这里尝试。

class M{
  static String c(String s){String r="";for(char i:"3145926870".toCharArray())r+=s.replaceAll("[^"+i+"]","");return r;}

  public static void main(String[] a){
    System.out.println(c("12345678908395817288391"));
  }
}

输出:

33311145599922688888770

1

Clojure,38个字节

#(sort-by(zipmap"3145926870"(range))%)

以字符串输入,返回一个字符序列。zipmap创建一个“字典”对象,该对象也可以在函数上下文中使用。

(f "1234")
(\3 \1 \4 \2)

如果保证输入数字是唯一的,那么您就可以这样做#(filter(set %)"3145926870")


1

PHP,69 68

for(;(~$d=$argn[$j++])||~$c=_3145926870[$i+++$j=0];)$c==$d&&print$d;

仍然被preg_filter击败,但我认为它本身还不错。也许有人可以打一些字节。


$c!=$d?:print$d作为替代的$c==$d&&print$d,我只看到在当下
约尔格Hülsermann

1
_3145926870而不是` “3145926870”节省1个字节
约尔格Hülsermann

for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);也是工作的替代
约尔格Hülsermann


0

k,19个字节

{x@<"3145926870"?x}

说明:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
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.