Sắp xếp các chữ số theo lần xuất hiện đầu tiên của chúng trong số pi


17

Cho một số không âm n, sắp xếp các chữ số của nlần xuất hiện đầu tiên của chúng trong số pi .

Đầu vào có thể được lấy thông qua đối số cli hàm, hoặc STDIN và dưới dạng chuỗi, char [] hoặc số nguyên. Bạn có thể xuất thông qua giá trị trả về, trạng thái thoát hoặc STDOUT.



Chúng ta có thể lấy đầu vào và đầu ra dưới dạng chuỗi hoặc là mảng các chữ số không?
Sản xuất ETH

@ETHproductions Làm rõ.
Roman Gräf

19
Một vài trường hợp thử nghiệm sẽ tốt đẹp.
Dennis

1
Bây giờ đã có 12 câu trả lời, tất cả đều thực hiện cùng một điều, nếu bạn vẫn chưa rõ những gì đang được hỏi, thì đó không phải là vấn đề của câu hỏi.
Leaky Nun

Câu trả lời:


14

Bình thường, 8 6 byte

ox+.n0

Hãy thử nó ở đây.

-1 nhờ Leaky Nun : Đầu vào sẽ cung cấp 0nếu cần thiết.
Tầm thường -1 nhờ Jakube : Backtick không cần thiết (ah, làm thế nào tôi bỏ lỡ điều đó, LÀM THẾ NÀO?!?).


Woohoo, điều này thậm chí còn đánh bại 05AB1E! Chỉnh sửa: nó không đánh bại 05AB1E và tôi không muốn đánh cắp :(
Erik the Outgolfer

3
Tôi tìm thấy nó. Bạn không cần 0cuối cùng. Nếu đầu vào có a 0, đầu vào 0sẽ được cung cấp; nếu đầu vào không có a 0, nó sẽ không thành vấn đề.
Leaky Nun

3
@LeakyNun và bạn thậm chí có thể lưu backtick:ox+.n0
Jakube

OK, bỏ qua bình luận đầu tiên, nhờ LeakyNun và Jakube, tôi lại đánh bại 05AB1E, tôi hy vọng điều này sẽ tốt trong lần này.
Erik the Outgolfer

1
Đó là một lượng đẹp của đầu vào ngầm.
isaacg


18

05AB1E , 10 9 7 byte

Đã lưu 1 byte nhờ Leaky Nun lưu ý rằng việc lọc ra các bản sao là không cần thiết.
Đã lưu 2 byte nhờ Adnan .

žqRvy†J

Hãy thử trực tuyến!

Giải trình

ž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†Jcho 9 byte
Leaky Nun

@LeakyNun: Ồ vâng, trùng lặp không thành vấn đề. Cảm ơn :)
Emigna

3
Bạn có thể sử dụng žqthay vì 13žs?
Ad Nam

@Adnan Nó dường như không hoạt động.
Erik the Outgolfer

2
@Ad Nam: Vâng tất nhiên. Tôi đã không nhận ra có một hằng số pi khác :)
Emigna

8

Thạch , 10 byte

“ṀSṪw’ṾiµÞ

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi các chữ số.

-3 byte nhờ @ETHproductions

Giải trình

“Ṁ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

Tôi nghĩ 3145926870có thể được biểu diễn dưới dạng một chuỗi cơ sở gồm 4 chữ số (có nghĩa là nó chiếm tới 6 byte thay vì 10), nhưng tôi không chắc cách nén nó như vậy.
Sản phẩm ETH

Jelly không có tích hợp cho pi?
nghiện toán học

@mathjunkie nhưng Jelly không hiệu quả lắm khi thao tác chuỗi
Leaky Nun

@mathjunkie Có, nhưng các thao tác trong danh sách mất quá nhiều byte
fireflame241

“ṀSṪw’sẽ cung cấp cho bạn 3145926870.
Leaky Nun

8

Japt , 10 9 byte

8 byte mã, +1 cho -Pcờ.

–!bMP+U

Hãy thử trực tuyến! Đưa đầu vào dưới dạng một chuỗi.

Giải trình

–!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 byte

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

Sử dụng chuỗi cho I / O.


7

Thạch ,  8  7 byte

-1 byte nhờ Dennis (sử dụng bất kỳ thông tin nào có sẵn 0trong đầu vào, thông minh.)

ØP;ṾiµÞ

Hãy thử trực tuyến!

Làm sao?

Ø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

... và ở đó tôi đã tìm kiếm các hình vuông - 3820009(sqrt of 14592468760081) vẫn là các 3chữ số trong cơ sở 250.
Jonathan Allan

Trong lời giải thích của bạn là thất lạc.
Erik the Outgolfer

@EriktheOutgolfer - cảm ơn, điều chỉnh.
Jonathan Allan

6

CJam , 15 12 10 8 byte

r{P`#c}$

Hãy thử trực tuyến!

-3: Sử dụng một chuỗi dựa trên Pbiến pi thay vì bằng chữ.
-2: Quyết định tôi không cần phải xác định lại tất cả, vì việc tìm kiếm một chỉ mục sẽ xảy ra lần đầu tiên. -2: Cảm ơn jimmy23013 về cách tiếp cận thú vị bằng x mod 65536.

Giải trình:

r {P` # c} $ e # Nhận mã thông báo đầu vào
re # Lấy số nguyên dưới dạng chuỗi
 {P` # c} e # Phím sắp xếp:
  P e # Đẩy P (mặc định là 3.141592653589793)
   `e # Chuyển đổi thành biểu diễn chuỗi
    # e # Tìm chỉ mục của char trong chuỗi chúng tôi đã tạo
         e # A '.' sẽ không bao giờ được tìm thấy trong một số nguyên, nhưng nó không thành vấn đề, vì sự thay đổi bảo tồn sự sắp xếp lý tưởng.
         e # A '0' sẽ được lập chỉ mục là -1.
     ce # Chuyển đổi chỉ mục sang char
         e # Đầu tiên, tính toán chỉ số% 65536 và sau đó chuyển đổi thành char. Chúng ta cần điều này bởi vì nếu không thì 0 sẽ được lập chỉ mục là -1, tức là chỉ số nhỏ nhất.
         e # Chúng ta không cần phải chuyển đổi trở lại số nguyên, vì chúng ta có thể sử dụng sắp xếp từ vựng.
       $ e # Sắp xếp theo khóa


1
Yay, đánh bại MATL :)
Erik the Outgolfer


@ jimmy23013 Wow thật thông minh. Nó gần giống như có một tích hợp cho int (x)% 65536 và cithậm chí sẽ chuyển đổi trở lại thành số nguyên.
Erik the Outgolfer

5

PHP, 71 byte

Các giải pháp regex là ngắn hơn

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

hoặc là

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

Phiên bản trực tuyến

PHP, 78 byte

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

PHP, 112 byte

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

Phiên bản trực tuyến


Tôi đã thêm một giải pháp 69 byte . Có lẽ chúng ta có thể giảm xuống còn 66 byte cùng nhau;)
Christoph

5

C, 103 97 byte

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

Dùng thử trực tuyến


Cảm ơn, @ceilingcat, MSVC hoàn toàn không thích điều này, tôi cho rằng tôi nên thay vì nguyên mẫu với gcc :-)
Johan du Toit

MSVC có lẽ sẽ không thích thực tế là gcc cho phép bạn bỏ charvào char*pchar*t
trần nhà


3

MATL , 14 byte

YP99Y$uj!y=sY"

Hãy thử trực tuyến!

Giải thích với một ví dụ

Biểu tượng ;được sử dụng như dấu phân cách hàng trong ma trận. Vậy [1 2 3]là một vectơ hàng, [1; 2; 3]là một vectơ cột và [1 2; 3 4]là một ma trận vuông. Cái sau cũng có thể được đại diện, cho rõ ràng, như

[1 2;
 3 4]

Hãy xem xét đầu vào 2325là một ví dụ.

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 # Tương tác, 37 36 byte

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

Trên thực tế, bạn phải thực hiện điều này trong tương tác C # để có kết quả phù hợp, nhưng tôi đoán đây là ý nghĩa của bạn với trạng thái thoát . Biến i thực sự là biến đầu vào (ví dụ có thể là một chuỗi), vì vậy về cơ bản nó là tham số phương thức.

Tôi nghĩ rằng bản thân mã là khá thẳng về phía trước.


Ở đâu 3?
Paul

1
@Paul nó không cần thiết, vì nó trả về -1 nếu phần tử không được tìm thấy.
MetaColon

Đây chỉ là một đoạn mã, tôi khá chắc chắn ngay cả khi tương tác bạn cũng phải xác định lý do tại sao inó lại được sử dụng làm đầu vào. Ngoài ra nếu bạn đang nói C #, bạn phải đưa using System.Linq;vào số byte. Tuy nhiên, nếu đây là Tương tác, bạn nên chỉ định ngôn ngữ là C # Interactive không chỉ C #.
TheLethalCoder

@TheLethalCoder Tôi đã cập nhật nó lên C # Interactive. Việc sử dụng không cần thiết trong tương tác, vì nó được bao gồm tự động.
MetaColon

2

05AB1E , 5 6 byte (không lọc)

Phải nhận ra rằng 0không có trong hằng số pi chiều dài tiêu chuẩn.

Σтžsyk

Hãy thử trực tuyến!

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

Bạn nên đánh dấu việc không cạnh tranh Σnày là mới hơn so với thử thách.
Emigna

@Emigna đánh dấu nó, cảm ơn. Nhưng sau khi sửa lỗi bắt buộc, nó không còn ngắn hơn câu trả lời chiến thắng nữa):
kalsowerus

Quá tệ, bạn cần số không cho phương pháp này. Nó nên được tối ưu cho ngôn ngữ này ít nhất. Không thể yêu cầu nhiều hơn thế :)
Emigna

2

PHP, 66 65 byte

Lưu được 1 byte nhờ Titus.

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

1

Java 7, 110 byte

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

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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"));
  }
}

Đầu ra:

33311145599922688888770

1

Clojure, 38 byte

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

Nhập vào chuỗi, trả về một chuỗi các ký tự. zipmaptạo một đối tượng "từ điển", cũng có thể được sử dụng trong ngữ cảnh hàm.

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

Nếu các chữ số đầu vào được đảm bảo là duy nhất thì bạn chỉ cần làm #(filter(set %)"3145926870").


1

PHP, 69 68

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

Vẫn bị preg_filter đánh bại nhưng tôi nghĩ bản thân nó cũng khá đẹp. Có lẽ ai đó có thể chơi golf một số byte.


$c!=$d?:print$dthay thế cho $c==$d&&print$dtôi chỉ thấy trong thời điểm này
Jörg Hülsermann

1
_3145926870thay vì `" 3145926870 "lưu 1 Byte
Jörg Hülsermann

for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);cũng là một giải pháp thay thế hoạt động
Jörg Hülsermann

0

Perl 6 , 34 byte

*.comb.sort:{3145926870.index: $_}

Thử nó

*\       # WhateverCode lambda (this is the parameter)
.comb    # split into digits
.sort: { # sort by

  3145926870.index: $_ # its index in this number
}

0

k, 19 byte

{x@<"3145926870"?x}

Giải trình:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.