Urutkan digit berdasarkan kemunculan pertama mereka di pi

17

Diberi angka non-negatif n, urutkan digit nberdasarkan kemunculan pertama mereka di pi .

Input dapat diambil melalui argumen fungsi cli, atau STDIN dan sebagai string, char [] atau integer. Anda dapat menampilkan melalui nilai balik, status keluar atau STDOUT.

Roman Gräf
sumber
Terkait
Stewie Griffin
Bisakah kita mengambil input dan output sebagai string, atau sebagai array digit?
ETHproductions
@ ETHProduk Klarifikasi.
Roman Gräf
19
Beberapa test case akan menyenangkan.
Dennis
1
Sekarang 12 jawaban sudah ada, yang semuanya melakukan hal yang sama, jika Anda masih tidak jelas apa yang ditanyakan, maka itu bukan masalah pertanyaan.
Leaky Nun

Jawaban:

14

Pyth, 8 6 byte

ox+.n0

Coba di sini.

-1 terima kasih kepada Leaky Nun : Input akan memberikan 0jika diperlukan.
Sepele -1 berkat Jakube : Backtick tidak diperlukan (ah, bagaimana saya melewatkan itu, BAGAIMANA?!?).

Erik the Outgolfer
sumber
Woohoo, ini bahkan mengalahkan 05AB1E! Sunting: itu tidak mengalahkan 05AB1E, dan saya tidak ingin mencuri :(
Erik the Outgolfer
3
Aku menemukannya. Anda tidak perlu 0pada akhirnya. Jika input memiliki 0, maka 0akan disediakan oleh input; jika input tidak memiliki 0, tidak masalah.
Leaky Nun
3
@ LeakyNun dan Anda bahkan dapat menyimpan backtick:ox+.n0
Jakube
OK, abaikan komentar pertama, terima kasih kepada LeakyNun dan Jakube, saya kembali mengalahkan 05AB1E, saya berharap untuk kebaikan kali ini.
Erik the Outgolfer
1
Itu adalah jumlah input implisit yang indah.
isaacg
21

Python 3 , 40 39 byte

Terima kasih 1 byte untuk Jonathan Allan.

lambda s:sorted(s,key="145926870".find)

Cobalah online!

Biarawati Bocor
sumber
6
Anda dapat menjatuhkan 3, karena find akan kembali -1ketika item tidak ditemukan.
Jonathan Allan
18

05AB1E , 10 9 7 byte

Disimpan 1 byte berkat Leaky Nun mencatat bahwa menyaring duplikat tidak perlu.
Disimpan 2 byte berkat Adnan .

žqRvy†J

Cobalah online!

Penjelasan

ž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
Emigna
sumber
13žsRvy†Juntuk 9 byte
Leaky Nun
@ LeakyNun: Oh yeah, duplikat tidak masalah. Terima kasih :)
Emigna
3
Bisakah Anda menggunakan žqbukan 13žs?
Adnan
@ Adnan Sepertinya tidak berhasil.
Erik the Outgolfer
2
@ Adnan: Ya tentu saja. Saya tidak menyadari ada pi konstan lain :)
Emigna
8

Jelly , 10 byte

“ṀSṪw’ṾiµÞ

Cobalah online!

Mengambil input sebagai string angka.

-3 byte terima kasih kepada @ETHproductions

Penjelasan

“Ṁ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
fireflame241
sumber
Saya pikir 3145926870dapat direpresentasikan sebagai string dasar-250 4-digit (artinya membutuhkan 6 byte, bukan 10), tapi saya tidak yakin bagaimana cara mengompresnya.
ETHproductions
Apakah Jelly tidak memiliki builtin untuk pi?
pecandu matematika
@mathjunkie tetapi Jelly tidak terlalu efisien dalam manipulasi string
Leaky Nun
@ mathjunkie Ya, tetapi manipulasi pada daftar membutuhkan terlalu banyak byte
fireflame241
“ṀSṪw’akan memberimu 3145926870.
Leaky Nun
8

Japt , 10 9 byte

8 byte kode, +1 untuk -Pbendera.

–!bMP+U

Cobalah online! Mengambil input sebagai string.

Penjelasan

–!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
Produksi ETH
sumber
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>

Menggunakan string untuk I / O.

Neil
sumber
7

Jelly ,  8  7 byte

-1 byte berkat Dennis (gunakan yang ada 0di input, pintar.)

ØP;ṾiµÞ

Cobalah online!

Bagaimana?

Ø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
Jonathan Allan
sumber
... dan di sana saya sedang mencari kotak - 3820009(sqrt 14592468760081) masih 3digit di pangkalan 250.
Jonathan Allan
Dalam penjelasan Anda salah tempat.
Erik the Outgolfer
@EriktheOutgolfer - terima kasih, disesuaikan.
Jonathan Allan
6

CJam , 15 12 10 8 byte

r{P`#c}$

Cobalah online!

-3: Gunakan string yang didasarkan pada Pvariabel pi bukan literal.
-2: Memutuskan saya tidak perlu menyamaratakan sama sekali, karena menemukan indeks mengambil kejadian pertama. -2: Terima kasih kepada jimmy23013 untuk pendekatan yang menarik menggunakan x mod 65536.

Penjelasan:

r {P` # c} $ e # Mengambil token input
re # Ambil integer sebagai string
 {P` # c} e # Kunci penyortiran:
  P e # Dorong P (default ke 3.141592653589793)
   `e # Konversi ke representasi string
    # e # Temukan indeks char dalam string yang kami buat
         e # A '.' tidak akan pernah ditemukan dalam bilangan bulat, tetapi tidak masalah, karena pergeseran mempertahankan penyortiran ideal.
         e # A '0' akan diindeks sebagai -1.
     ce # Konversi indeks menjadi char
         e # Ini pertama-tama menghitung indeks% 65536, dan kemudian mengonversi menjadi char. Kita memerlukan ini karena jika 0 akan diindeks sebagai -1, yaitu indeks terkecil.
         e # Kita tidak perlu mengonversi kembali ke integer, karena kita dapat menggunakan pengurutan leksikografis.
       $ e # Sortir dengan kunci

Erik the Outgolfer
sumber
1
Yay, ketuk MATL :)
Erik the Outgolfer
@ jimmy23013 Wow itu pintar. Hampir seperti ada builtin untuk int (x)% 65536, dan cibahkan akan dikonversi kembali ke integer.
Erik the Outgolfer
5

PHP, 71 Bytes

The solusi regex lebih pendek

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

atau

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

Versi Online

PHP, 78 Bytes

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

PHP, 112 Bytes

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

Versi Online

Jörg Hülsermann
sumber
Saya telah menambahkan solusi 69 byte . Mungkin kita bisa menurunkannya menjadi 66 byte bersama;)
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);}

Cobalah online

Johan du Toit
sumber
Terima kasih, @ceilingcat, MSVC tidak suka ini sama sekali, saya kira saya lebih suka prototipe dengan gcc :-)
Johan du Toit
MSVC mungkin tidak akan menyukai kenyataan bahwa gcc memungkinkan Anda charmasuk char*pdanchar*t
ceilingcat
4

Ruby, 50 byte

n=gets;"3145926870".each_char{|c|$><<c*n.count(c)}
Peter Lenkefi
sumber
3

MATL , 14 byte

YP99Y$uj!y=sY"

Cobalah online!

Penjelasan dengan sebuah contoh

Simbol ;digunakan sebagai pemisah baris dalam matriks. Jadi [1 2 3]adalah vektor baris, [1; 2; 3]adalah vektor kolom, dan [1 2; 3 4]merupakan matriks persegi. Yang terakhir juga dapat diwakili, untuk kejelasan, seperti

[1 2;
 3 4]

Pertimbangkan input 2325sebagai contoh.

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'
Luis Mendo
sumber
2

C # Interactive, 37 36 Bytes

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

Sebenarnya Anda harus menjalankan ini di C # interaktif untuk hasil yang tepat, tapi saya kira ini yang Anda maksud dengan status keluar . Variabel i sebenarnya adalah variabel input (bisa berupa string), jadi pada dasarnya parameter metode.

Saya pikir kode itu sendiri cukup lurus ke depan.

MetaColon
sumber
Dimana 3?
Paul
1
@ Paul itu tidak perlu, karena mengembalikan -1 jika elemen tidak ditemukan.
MetaColon
Ini hanya potongan kode, saya cukup yakin bahkan secara interaktif Anda harus menentukan mengapa iada di suatu tempat sehingga dapat diambil sebagai input. Juga jika Anda mengatakan C # Anda harus memasukkan using System.Linq;ke dalam jumlah byte. Namun, jika ini Interaktif Anda harus menentukan bahasa sebagai C # Interaktif bukan hanya C #.
TheLethalCoder
@TheLethalCoder Saya memperbaruinya ke C # Interactive. Penggunaannya tidak perlu di interaktif, karena sudah termasuk secara otomatis.
MetaColon
2

05AB1E , 5 6 byte (tidak bersaing)

Harus menyadari bahwa 0tidak hadir dalam pi panjang standar konstan.

Σтžsyk

Cobalah online!

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi
kalsowerus
sumber
Anda harus menandai ini sebagai non-bersaing karena Σlebih baru dari tantangan.
Emigna
@ Emigna menandainya, terima kasih. Tetapi setelah perbaikan yang diperlukan itu tidak lagi lebih pendek dari jawaban yang menang):
kalsowerus
Sayang sekali Anda membutuhkan nol untuk metode ini. Setidaknya harus optimal untuk bahasa ini. Tidak bisa meminta lebih dari itu :)
Emigna
2

PHP, 66 65 byte

Disimpan 1 byte berkat Titus.

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

Java 7, 110 byte

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

Penjelasan:

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

Kode uji:

Coba di sini.

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

Keluaran:

33311145599922688888770
Kevin Cruijssen
sumber
1

Clojure, 38 byte

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

Input dalam string, mengembalikan urutan karakter. zipmapmembuat objek "kamus", yang dapat digunakan dalam konteks fungsi juga.

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

Jika digit input dijamin unik maka Anda bisa melakukannya #(filter(set %)"3145926870").

NikoNyrh
sumber
1

PHP, 69 68

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

Masih dikalahkan oleh preg_filter tapi saya pikir itu cukup bagus. Mungkin seseorang dapat bermain golf beberapa byte.

Christoph
sumber
$c!=$d?:print$dsebagai alternatif karena $c==$d&&print$dsaya hanya melihat pada saat ini
Jörg Hülsermann
1
_3145926870alih-alih `" 3145926870 "simpan 1 Byte
Jörg Hülsermann
for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d); juga merupakan alternatif kerja
Jörg Hülsermann
0

Perl 6 , 34 byte

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

Cobalah

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

  3145926870.index: $_ # its index in this number
}
Brad Gilbert b2gills
sumber
0

k, 19 byte

{x@<"3145926870"?x}

Penjelasan:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
zgrep
sumber