Sortuj cyfry według ich pierwszego wystąpienia w pi

17

Biorąc pod uwagę liczbę nieujemną n, posortuj cyfry nwedług ich pierwszego wystąpienia w pi .

Dane wejściowe mogą być pobierane za pomocą argumentu funkcji cli lub STDIN i jako ciąg znaków, char [] lub liczba całkowita. Możesz wyprowadzać dane poprzez wartość zwracaną, status wyjścia lub STDOUT.

Roman Gräf
źródło
Powiązane
Stewie Griffin
Czy możemy przyjmować dane wejściowe i wyjściowe jako ciągi znaków lub jako tablice cyfr?
ETHprodukcje
@ETHproductions Wyjaśnione.
Roman Gräf
19
Przydałoby się kilka przypadków testowych.
Dennis
1
Teraz, gdy już dostępnych jest 12 odpowiedzi, z których wszystkie wykonują to samo, jeśli nadal nie jest jasne, o co się pyta, to nie jest problem z pytaniem.
Leaky Nun

Odpowiedzi:

14

Pyth, 8 6 bajtów

ox+.n0

Wypróbuj tutaj.

-1 dzięki Leaky Nun : Dane wejściowe zapewnią, 0jeśli będą kiedykolwiek potrzebne.
Trywialne -1 dzięki Jakube : Backtick nie jest potrzebny (ach, jak mi tego brakowało, JAK?!?).

Erik the Outgolfer
źródło
Woohoo, to nawet bije 05AB1E! Edycja: nie bije 05AB1E i nie chcę kraść :(
Erik the Outgolfer
3
Znalazłem to. Na 0koniec nie potrzebujesz . Jeśli wejście ma a 0, 0zostanie ono dostarczone przez wejście; jeśli wejście nie ma 0, to nie będzie miało znaczenia.
Leaky Nun
3
@LeakyNun i możesz nawet zapisać backtick:ox+.n0
Jakube
OK, zignoruj ​​pierwszy komentarz, dzięki LeakyNun i Jakube ponownie pokonałem 05AB1E, tym razem mam nadzieję na dobre.
Erik the Outgolfer
1
To piękna ilość niejawnego wkładu.
isaacg
21

Python 3 , 40 39 bajtów

1 bajt dzięki Jonathan Allan.

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

Wypróbuj online!

Leaky Nun
źródło
6
Możesz upuścić 3, ponieważ find zwróci się, -1gdy element nie zostanie znaleziony.
Jonathan Allan
18

05AB1E , 10 9 7 bajtów

Zaoszczędzono 1 bajt dzięki Dziurawej Zakonnicy , która zauważyła, że ​​odfiltrowywanie duplikatów nie jest konieczne.
Zaoszczędzono 2 bajty dzięki Adnan .

žqRvy†J

Wypróbuj online!

Wyjaśnienie

ž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
źródło
13žsRvy†Jna 9 bajtów
Leaky Nun
@LeakyNun: O tak, duplikaty nie mają znaczenia. Dzięki :)
Emigna
3
Czy możesz użyć žqzamiast 13žs?
Adnan
@Adnan To nie działa.
Erik the Outgolfer
2
@Adnan: Tak, oczywiście. Nie zdawałem sobie sprawy, że istnieje inna stała pi :)
Emigna 29.04.17
8

Galareta , 10 bajtów

“ṀSṪw’ṾiµÞ

Wypróbuj online!

Pobiera dane wejściowe jako ciąg cyfr.

-3 bajty dzięki produktom @ETH

Wyjaśnienie

“Ṁ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
źródło
Myślę, że 3145926870może być reprezentowany jako 4-cyfrowy ciąg base-250 (co oznacza, że ​​zajmuje 6 bajtów zamiast 10), ale nie jestem pewien, jak go skompresować.
ETHprodukcje
Czy Jelly nie ma wbudowanego pi?
ćpun matematyki
@mathjunkie, ale Jelly nie jest bardzo skuteczna w manipulowaniu strunami
Leaky Nun
@mathjunkie Tak, ale manipulacje na liście zajmują zbyt wiele bajtów
fireflame241
“ṀSṪw’da ci 3145926870.
Leaky Nun
8

Japt , 10 9 bajtów

8 bajtów kodu, +1 dla -Pflagi.

–!bMP+U

Wypróbuj online! Pobiera dane wejściowe jako ciąg.

Wyjaśnienie

–!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
ETHprodukcje
źródło
7

JavaScript (ES6), 54 bajty

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

Używa ciągów dla I / O.

Neil
źródło
7

Galaretka ,  8  7 bajtów

-1 bajt dzięki Dennisowi (użyj dowolnego istniejącego 0na wejściu, sprytne).

ØP;ṾiµÞ

Wypróbuj online!

W jaki sposób?

Ø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
źródło
... i tam szukałem kwadratów - 3820009(sqrt z 14592468760081) wciąż zawiera 3cyfry w bazie 250.
Jonathan Allan
W swoim wyjaśnieniem jest niesłuszna.
Erik the Outgolfer
@EriktheOutgolfer - dzięki, dostosowano.
Jonathan Allan
6

CJam , 15 12 10 8 bajtów

r{P`#c}$

Wypróbuj online!

-3: Użyj ciągu opartego na Pzmiennej pi zamiast literału.
-2: Zdecydowałem, że wcale nie muszę jednoznacznie identyfikować, ponieważ znalezienie indeksu i tak zajmuje pierwsze wystąpienie. -2: Dzięki jimmy23013 za ciekawe podejście przy użyciu x mod 65536.

Wyjaśnienie:

r {P` # c} $ e # Pobiera token wejściowy
re # Weź liczbę całkowitą jako ciąg
 {P` # c} e # Klawisz sortowania:
  P e # Push P (domyślne ustawienie to 3.141592653589793)
   `e # Konwertuj na reprezentację ciągu
    # e # Znajdź indeks char w utworzonym przez nas ciągu
         e # A '.' nigdy nie zostanie znalezione w liczbie całkowitej, ale to nie ma znaczenia, ponieważ przesunięcie zachowuje idealne sortowanie.
         e # A „0” będzie indeksowane jako -1.
     ce # Konwertuj indeks na char
         e # Najpierw oblicza indeks% 65536, a następnie konwertuje na char. Potrzebujemy tego, ponieważ w przeciwnym razie 0 byłoby indeksowane jako -1, czyli najmniejszy indeks.
         e # Nie musimy konwertować z powrotem na liczbę całkowitą, ponieważ możemy zastosować sortowanie leksykograficzne.
       $ e # Sortuj za pomocą klucza

Erik the Outgolfer
źródło
1
Tak, bije MATL :)
Erik the Outgolfer
@ jimmy23013 Wow, to sprytne. To prawie tak, jakby był wbudowany int (x)% 65536, a cinawet konwertowałby z powrotem na liczbę całkowitą.
Erik the Outgolfer
5

PHP, 71 bajtów

Rozwiązanie wyrażenia regularnego jest krótsze

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

lub

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

Wersje online

PHP, 78 bajtów

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

PHP, 112 bajtów

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

Wersja online

Jörg Hülsermann
źródło
Dodałem 69-bajtowe rozwiązanie . Może uda nam się to razem zmniejszyć do 66 bajtów;)
Christoph
5

C, 103 97 bajtów

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

Wypróbuj online

Johan du Toit
źródło
Dzięki, @ceilingcat, MSVC w ogóle tego nie lubi, przypuszczam, że powinienem raczej prototypować z gcc :-)
Johan du Toit
MSVC prawdopodobnie nie podoba się fakt, że gcc pozwala rowu charw char*pichar*t
ceilingcat
4

Rubinowy, 50 bajtów

n=gets;"3145926870".each_char{|c|$><<c*n.count(c)}
Peter Lenkefi
źródło
3

MATL , 14 bajtów

YP99Y$uj!y=sY"

Wypróbuj online!

Wyjaśnienie na przykładzie

Symbol ;jest używany jako separator wierszy w macierzach. Podobnie [1 2 3]jak wektor rzędowy, wektor [1; 2; 3]kolumnowy i [1 2; 3 4]macierz kwadratowa. Te ostatnie można również przedstawić, dla jasności, jako

[1 2;
 3 4]

Rozważ dane wejściowe 2325jako przykład.

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
źródło
2

C # Interactive, 37 36 bajtów

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

Actually you have to execute this in the C# interactive for proper results, but I guess this is what you meant with exit status. The variable i actually is the input variable (it can be for example a string), so it's basically the method parameter.

I think the code itself is pretty straight forward.

MetaColon
źródło
Where's the 3?
Paul
1
@Paul it's not neccessary, as it returns -1 if the element isn't found.
MetaColon
To tylko fragment kodu, ale jestem pewien, że nawet w trybie interaktywnym musisz określić, dlaczego igdzieś jest, aby można go było traktować jako dane wejściowe. Również jeśli mówisz C #, musisz uwzględnić using System.Linq;w liczbie bajtów. Jeśli jednak jest to Interactive, należy określić język jako C # Interactive, a nie tylko C #.
TheLethalCoder
@TheLethalCoder Zaktualizowałem go do C # Interactive. Korzystanie nie jest konieczne w interaktywnym, ponieważ jest uwzględniane automatycznie.
MetaColon
2

05AB1E , 5 6 bajtów (niekonkurencyjny)

Musiałem zdać sobie sprawę, że 0nie występuje w standardowej stałej stałej pi.

Σтžsyk

Wypróbuj online!

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi
kalsowerus
źródło
You should mark this non-competing as Σ is newer than the challenge.
Emigna
@Emigna marked it, thanks. But after the required fix it's not anymore shorter than the winning answer anyway ):
kalsowerus
Too bad you needed that zero for this method. It should be optimal for this language at least. Can't ask for more than that :)
Emigna
2

PHP, 66 65 bytes

Saved 1 byte thanks to Titus.

while(~$d=_3145926870[++$i])echo preg_filter("/[^$d]/",'',$argn);
user63956
źródło
1

Java 7, 110 bytes

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

Explanation:

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

Test code:

Try it here.

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

Output:

33311145599922688888770
Kevin Cruijssen
źródło
1

Clojure, 38 bytes

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

Input in string, returns a sequence of characters. zipmap creates a "dictionary" object, which can be used in a function context as well.

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

If input digits were guaranteed to be unique then you could simply do #(filter(set %)"3145926870").

NikoNyrh
źródło
1

PHP, 69 68

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

Still beaten by preg_filter but I thought it was quite nice itself. Maybe someone can golf off some bytes.

Christoph
źródło
$c!=$d?:print$d as alternative for $c==$d&&print$d I only see in the moment
Jörg Hülsermann
1
_3145926870 instead of `"3145926870" save 1 Byte
Jörg Hülsermann
for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d); is also a working alternative
Jörg Hülsermann
0

Perl 6, 34 bytes

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

Try it

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

  3145926870.index: $_ # its index in this number
}
Brad Gilbert b2gills
źródło
0

k, 19 bytes

{x@<"3145926870"?x}

Explanation:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
zgrep
źródło