Trier les chiffres par leur première occurrence dans pi

17

Étant donné un nombre non négatif n, triez les chiffres de nleur première occurrence dans pi .

L'entrée peut être prise via l'argument de la fonction cli, ou STDIN et sous forme de chaîne, char [] ou entier. Vous pouvez sortir via la valeur de retour, l'état de sortie ou STDOUT.

Roman Gräf
la source
En relation
Stewie Griffin
Pouvons-nous prendre l'entrée et la sortie sous forme de chaînes ou de tableaux de chiffres?
ETHproductions
@ETHproductions Clarified.
Roman Gräf
19
Quelques cas de test seraient bien.
Dennis
1
Maintenant que 12 réponses sont déjà présentes, toutes effectuant la même chose, si vous ne savez toujours pas ce qui est demandé, alors ce n'est pas le problème de la question.
Leaky Nun

Réponses:

14

Pyth, 8 6 octets

ox+.n0

Essayez-le ici.

-1 grâce à Leaky Nun : L'entrée fournira le 0si nécessaire.
Trivial -1 grâce à Jakube : Backtick pas nécessaire (ah, comment ai-je raté ça, COMMENT?!?).

Erik le Outgolfer
la source
Woohoo, cela bat même 05AB1E! Edit: il ne bat pas 05AB1E, et je ne veux pas voler :(
Erik the Outgolfer
3
Je l'ai trouvé. Vous n'avez pas besoin du 0à la fin. Si l'entrée a un 0, le 0serait fourni par l'entrée; si l'entrée n'a pas de 0, cela n'aura pas d'importance.
Leaky Nun
3
@LeakyNun et vous pouvez même enregistrer le backtick:ox+.n0
Jakube
OK, ne tenez pas compte du premier commentaire, grâce à LeakyNun et Jakube, j'ai encore battu 05AB1E, j'espère pour de bon cette fois.
Erik the Outgolfer
1
C'est une belle quantité d'entrée implicite.
isaacg
21

Python 3 , 40 39 octets

1 octet merci à Jonathan Allan.

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

Essayez-le en ligne!

Leaky Nun
la source
6
Vous pouvez supprimer le 3, car find reviendra -1lorsqu'un élément n'est pas trouvé.
Jonathan Allan
18

05AB1E , 10 9 7 octets

Enregistré 1 octet grâce à Leaky Nun notant que le filtrage des doublons n'est pas nécessaire.
Enregistré 2 octets grâce à Adnan .

žqRvy†J

Essayez-le en ligne!

Explication

ž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
la source
13žsRvy†Jpour 9 octets
Leaky Nun
@LeakyNun: Oh oui, les doublons n'ont pas d'importance. Merci :)
Emigna
3
Pouvez-vous utiliser à la žqplace de 13žs?
Adnan
@Adnan Cela ne semble pas fonctionner.
Erik the Outgolfer
2
@Adnan: Oui bien sûr. Je ne savais pas qu'il y avait une autre constante pi :)
Emigna
8

Gelée , 10 octets

“ṀSṪw’ṾiµÞ

Essayez-le en ligne!

Prend l'entrée sous la forme d'une chaîne de chiffres.

-3 octets grâce à @ETHproductions

Explication

“Ṁ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
la source
Je pense que 3145926870peut être représenté comme une chaîne de base 250 à 4 chiffres (ce qui signifie qu'il prend 6 octets au lieu de 10), mais je ne sais pas comment le compresser en tant que tel.
ETHproductions
Jelly n'a-t-il pas de fonction intégrée pour pi?
math junkie
@mathjunkie mais Jelly n'est pas très efficace sur la manipulation des cordes
Leaky Nun
@mathjunkie Oui, mais les manipulations de la liste prennent trop d'octets
fireflame241
“ṀSṪw’vous donnera 3145926870.
Leaky Nun
8

Japt , 10 9 octets

8 octets de code, +1 pour le -Pdrapeau.

–!bMP+U

Essayez-le en ligne! Prend l'entrée sous forme de chaîne.

Explication

–!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
ETHproductions
la source
7

JavaScript (ES6), 54 octets

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

Utilise des chaînes pour les E / S.

Neil
la source
7

Gelée ,  8  7 octets

-1 octet grâce à Dennis (utilisez tout existant 0dans l'entrée, intelligent.)

ØP;ṾiµÞ

Essayez-le en ligne!

Comment?

Ø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
la source
... et là je cherchais des carrés - 3820009(sqrt de 14592468760081) est toujours des 3chiffres dans la base 250.
Jonathan Allan
Le dans votre explication est déplacé.
Erik the Outgolfer
@EriktheOutgolfer - merci, ajusté.
Jonathan Allan
6

CJam , 15 12 10 8 octets

r{P`#c}$

Essayez-le en ligne!

-3: utilisez une chaîne basée sur la Pvariable pi au lieu d'un littéral.
-2: J'ai décidé que je n'avais pas besoin d'uniquifier du tout, car la recherche d'un index prend de toute façon la première occurrence. -2: Merci à jimmy23013 pour une approche intéressante en utilisant x mod 65536.

Explication:

r {P` # c} $ e # Prend un jeton d'entrée
re # Prenez l'entier comme une chaîne
 {P` # c} e # Clé de tri:
  P e # Push P (par défaut à 3,141592653589793)
   `e # Convertir en représentation sous forme de chaîne
    # e # Trouver l'index de char dans la chaîne que nous avons créée
         e # A '.' ne sera jamais trouvé dans un entier, mais cela n'a pas d'importance, car le décalage conserve le tri idéal.
         e # A '0' sera indexé comme -1.
     ce # Convertir l'index en char
         e # Cela calcule d'abord l'index% 65536, puis convertit en char. Nous en avons besoin car sinon 0 serait indexé comme -1, c'est-à-dire le plus petit indice.
         e # Nous n'avons pas besoin de reconvertir en entier, car nous pouvons utiliser le tri lexicographique.
       $ e # Trier avec la clé

Erik le Outgolfer
la source
1
Ouais, bat MATL :)
Erik the Outgolfer
@ jimmy23013 Wow, c'est intelligent. C'est presque comme s'il y avait une fonction intégrée pour int (x)% 65536, et ciserait même reconvertie en entier.
Erik the Outgolfer
5

PHP, 71 octets

La solution d'expression régulière est plus courte

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

ou

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

Versions en ligne

PHP, 78 octets

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

PHP, 112 octets

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

Version en ligne

Jörg Hülsermann
la source
J'ai ajouté une solution de 69 octets . Peut-être que nous pouvons le réduire à 66 octets ensemble;)
Christoph
5

C, 103 97 octets

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

Essayez-le en ligne

Johan du Toit
la source
Merci, @ceilingcat, MSVC n'aime pas ça du tout, je suppose que je devrais plutôt prototyper avec gcc :-)
Johan du Toit
MSVC sera probablement pas comme le fait que gcc vous permet de fossé chardans char*petchar*t
ceilingcat
4

Rubis, 50 octets

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

MATL , 14 octets

YP99Y$uj!y=sY"

Essayez-le en ligne!

Explication avec un exemple

Le symbole ;est utilisé comme séparateur de lignes dans les matrices. Il en [1 2 3]va de même d'un vecteur ligne, d' [1; 2; 3]un vecteur colonne et d' [1 2; 3 4]une matrice carrée. Ces derniers peuvent également être représentés, par souci de clarté, comme

[1 2;
 3 4]

Considérez l'entrée 2325comme exemple.

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
la source
2

C # Interactive, 37 36 octets

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

En fait, vous devez exécuter cela dans le C # interactif pour de bons résultats, mais je suppose que c'est ce que vous vouliez dire avec le statut de sortie . La variable i est en fait la variable d'entrée (il peut s'agir par exemple d'une chaîne), il s'agit donc essentiellement du paramètre de méthode.

Je pense que le code lui-même est assez simple.

MetaColon
la source
Où est le 3?
Paul
1
@Paul ce n'est pas nécessaire, car il renvoie -1 si l'élément n'est pas trouvé.
MetaColon
Cependant, ce n'est qu'un extrait de code, je suis presque sûr que même en interactif, vous devez spécifier pourquoi iest quelque part afin qu'il puisse être pris en entrée. De plus, si vous dites C #, vous devez inclure using System.Linq;le nombre d'octets. Cependant, s'il s'agit d'Interactive, vous devez spécifier le langage comme C # Interactive et pas uniquement C #.
TheLethalCoder
@TheLethalCoder Je l'ai mis à jour vers C # Interactive. L'utilisation n'est pas nécessaire dans l'interactif, car elle est incluse automatiquement.
MetaColon
2

05AB1E , 5 6 octets (sans concurrence)

J'ai dû réaliser que ce 0n'est pas présent dans la constante pi de longueur standard.

Σтžsyk

Essayez-le en ligne!

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi
kalsowerus
la source
Vous devez marquer cette non-compétition comme Σétant plus récente que le défi.
Emigna
@Emigna l'a marqué, merci. Mais après le correctif requis, ce n'est pas plus court que la réponse gagnante de toute façon):
kalsowerus
Dommage que vous ayez eu besoin de ce zéro pour cette méthode. Il devrait être optimal pour cette langue au moins. Je ne peux pas demander plus que ça :)
Emigna
2

PHP, 66 65 octets

Enregistré 1 octet grâce à Titus.

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

Java 7, 110 octets

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

Explication:

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

Code de test:

Essayez-le ici.

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

Production:

33311145599922688888770
Kevin Cruijssen
la source
1

Clojure, 38 octets

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

Saisie en chaîne, renvoie une séquence de caractères. zipmapcrée un objet "dictionnaire", qui peut également être utilisé dans un contexte de fonction.

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

S'il était garanti que les chiffres saisis soient uniques, vous pouvez simplement le faire #(filter(set %)"3145926870").

NikoNyrh
la source
1

PHP, 69 68

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

Toujours battu par preg_filter mais je pensais que c'était assez sympa en soi. Peut-être que quelqu'un peut jouer au golf sur quelques octets.

Christoph
la source
$c!=$d?:print$dcomme alternative car $c==$d&&print$dje ne vois que pour le moment
Jörg Hülsermann
1
_3145926870au lieu de "" 3145926870 "sauf 1 octet
Jörg Hülsermann
for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);est aussi une alternative de travail
Jörg Hülsermann
0

Perl 6 , 34 octets

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

Essayez-le

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

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

k, 19 octets

{x@<"3145926870"?x}

Explication:

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