piで最初に出現する数字でソートする


17

負でない数を指定するとnpin内の最初の出現によっての数字をソートします。

入力は、関数cli引数、またはSTDINを介して、文字列、char []または整数として取得できます。戻り値、終了ステータス、またはSTDOUTを介して出力できます。



入力と出力を文字列として、または数字の配列として取得できますか?
-ETHproductions

@ETHproductionsが明確になりました。
ローマングラフ

19
いくつかのテストケースがいいでしょう。
デニス

1
12の回答がすでに存在し、それらすべてが同じことを実行しているので、何が尋ねられているのかまだ不明な場合、それは問題の問題ではありません。
漏れの修道女

回答:


14

Pyth、8 6バイト

ox+.n0

ここで試してみてください。

-1 Leaky Nunに感謝:入力は、0必要に応じて提供します。ジャクベの
おかげで些細な-1 :バックティックは必要ありません(ああ、どうやってそれを見逃したのですか?!?)。


ウーフー、これは05AB1Eにも勝っています!編集:05AB1Eに勝るものではなく、盗みたくない:(
Erik the Outgolfer

3
見つけた。0最後に必要はありません。入力がある場合は00入力によって提供されることになります。入力にがなければ0、それは問題になりません。
リーキー修道女

3
@LeakyNunそしてバックox+.n0
ティックを

最初のコメントは無視してください。LeakyNunとJakubeのおかげで、私は再び05AB1Eを破りました。今回は良いことを願っています。
エリックアウトゴルファー

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バイト
リーキー修道女

@LeakyNun:ああ、そう、重複は関係ありません。ありがとう:)
エミグナ

3
žq代わりに使用できます13žsか?
アドナン

@Adnanうまくいかないようです。
エリックアウトゴルファー

2
@Adnan:もちろんです。私は別のパイ定数があることに気づかなかった:)
エミグナ

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

31459268704桁のbase-250文字列として表すことができると思います(10ではなく6バイトを必要とします)が、そのように圧縮する方法がわかりません。
-ETHproductions

Jellyにはpiの組み込み機能がありませんか?
数学中毒

@mathjunkieしかし、ゼリーは、文字列の操作には非常に効率的ではありません
漏れ修道女

@mathjunkieはい、しかし、リストへの操作は、あまりにも多くのバイトを取る
fireflame241

“ṀSṪw’あなたに与えます3145926870
リーキー修道女

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 バイト

デニスのおかげで-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 of 14592468760081)はまだ3baseの数字250です。
ジョナサンアラン

あなたの説明では、紛失しています。
エリックアウトゴルファー

@EriktheOutgolfer-ありがとう、調整済み。
ジョナサンアラン

6

CJam15 12 10 8バイト

r{P`#c}$

オンラインでお試しください!

-3:Pリテラルではなく、pi変数に基づいた文字列を使用します。
-2:インデックスを見つけるにはとにかく最初に出現するため、一意化する必要はまったくありません。 -2:x mod 65536を使用した興味深いアプローチについては、jimmy23013に感謝します。

説明:

r {P`#c} $ e#入力トークンを受け取ります
re#整数を文字列として受け取ります
 {P`#c} e#ソートキー:
  P e#Push P(デフォルトは3.141592653589793)
   `e#文字列表現に変換
    #e#作成した文字列でcharのインデックスを検索
         e#A '。' 整数で検出されることはありませんが、シフトは理想的なソートを保持するため、問題ではありません。
         e#「0」は-1としてインデックス付けされます。
     ce#インデックスをcharに変換
         e#これは最初にインデックス%65536を計算し、次にcharに変換します。そうしないと、0が-1、つまり最小のインデックスとしてインデックス付けされるためです。
         e#辞書編集ソートを使用できるため、整数に戻す必要はありません。
       $ e#キーで並べ替え


1
イェイ、MATLを破る:)
エリックアウトゴルファー


@ jimmy23013うわー、それは賢いです。int(x)%65536の組み込みがありci、整数に戻すことさえあるようです。
エリックアウトゴルファー

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バイトまで下げることができるかもしれません;)
クリストフ

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*pしてchar*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#Interactive、 37 36バイト

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

実際には、適切な結果を得るためにC#インタラクティブでこれを実行する必要がありますが、これはあなたが意図したものだと思います exit statusでます。変数iは、実際には入力変数(たとえば、文字列)であるため、基本的にはメソッドパラメーターです。

コード自体はかなり単純だと思います。


どこ3ですか?
ポール

1
@Paulは、要素が見つからない場合に-1を返すため、必要ではありません。
メタコロン

これは単なるコードのスニペットですが、インタラクティブな場合でも、i入力として受け取ることができるように、どこにあるのかを指定する必要があります。また、C#と言っている場合はusing System.Linq;、バイトカウントに含める必要があります。ただし、これがInteractiveの場合は、C#だけでなくC#Interactiveとして言語を指定する必要があります。
TheLethalCoder

@TheLethalCoder C#Interactiveに更新しました。自動的に含まれているので、使用はインタラクティブでは必要ありません。
メタコロン

2

05AB1E5 6バイト(非競合)

0標準長パイ定数には存在しないことを認識しなければなりませんでした。

Σтžsyk

オンラインでお試しください!

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

この非競合をΣチャレンジよりも新しいものとしてマークする必要があります。
エミグナ

@Emignaがマークしました、ありがとう。しかし、必要な修正後は、とにかく勝利の答えよりも短くはありません):
kalsowerus

残念ながら、このメソッドにはそのゼロが必要です。少なくともこの言語には最適なはずです。それ以上要求することはできません:)
エミグナ

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現時点でしか見られない代替手段として
ヨルクヒュルサーマン

1
_3145926870`" 3145926870 "の代わりに1バイトを節約
ヨルグヒュルザーマン

for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);代替手段でもあります
ヨルクヒュルサーマン


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.