Sortieren Sie die Ziffern nach ihrem ersten Vorkommen in pi

17

Bei einer nicht negativen Zahl nsortieren Sie die Ziffern nnach ihrem ersten Vorkommen in pi .

Die Eingabe kann über das Argument cli oder STDIN und als Zeichenfolge, char [] oder Ganzzahl erfolgen. Sie können über Rückgabewert, Exit-Status oder STDOUT ausgeben.

Roman Gräf
quelle
Related
Stewie Griffin
Können wir Eingaben und Ausgaben als Zeichenfolgen oder als Arrays von Ziffern annehmen?
ETHproductions
@ETHproductions geklärt.
Roman Gräf
19
Ein paar Testfälle wären schön.
Dennis
1
Nun, da bereits 12 Antworten vorliegen, die alle dasselbe leisten, ist es nicht das Problem der Frage, wenn Sie immer noch unklar sind, was gefragt wird.
Undichte Nonne

Antworten:

14

Pyth, 8 6 Bytes

ox+.n0

Probieren Sie es hier aus.

-1 dank Leaky Nun : Der Eingang wird das liefern, 0wenn es jemals gebraucht wird.
Trivial -1 dank Jakube : Backtick nicht benötigt (ah, wie habe ich das verpasst, WIE?!?).

Erik der Outgolfer
quelle
Woohoo, das schlägt sogar 05AB1E! Bearbeiten: es schlägt 05AB1E nicht, und ich möchte nicht stehlen :(
Erik der Outgolfer
3
Ich habe es gefunden. Das brauchst du 0am Ende nicht. Wenn die Eingabe a hat 0, 0würde das von der Eingabe bereitgestellt werden; Wenn der Eingang kein hat 0, spielt es keine Rolle.
Undichte Nonne
3
@LeakyNun und Sie können sogar die Rückfahrkarte speichern:ox+.n0
Jakube
OK, ignoriere den ersten Kommentar, dank LeakyNun und Jakube habe ich 05AB1E wieder besiegt, ich hoffe diesmal auf ein gutes Ergebnis.
Erik der Outgolfer
1
Das ist eine schöne Menge impliziter Eingaben.
isaacg
21

Python 3 , 40 39 Bytes

1 Byte danke an Jonathan Allan.

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

Probieren Sie es online!

Undichte Nonne
quelle
6
Sie können das löschen 3, da find zurückkehrt, -1wenn ein Element nicht gefunden wird.
Jonathan Allan
18

05AB1E , 10 9 7 Bytes

Dank Leaky Nun 1 Byte gespart, der feststellt, dass das Herausfiltern von Duplikaten unnötig ist.
2 Bytes gespart dank Adnan .

žqRvy†J

Probieren Sie es online!

Erläuterung

ž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
quelle
13žsRvy†Jfür 9 Bytes
Leaky Nun
@LeakyNun: Oh ja, Duplikate spielen keine Rolle. Vielen Dank :)
Emigna
3
Können Sie žqanstelle von verwenden 13žs?
Adnan
@Adnan Es scheint nicht zu funktionieren.
Erik der Outgolfer
2
@Adnan: Ja natürlich. Ich wusste nicht, dass es noch eine Pi-Konstante gibt :)
Emigna
8

Gelee , 10 Bytes

“ṀSṪw’ṾiµÞ

Probieren Sie es online!

Übernimmt die Eingabe als Ziffernfolge.

-3 Bytes dank @ETHproductions

Erläuterung

“Ṁ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
quelle
Ich denke, 3145926870kann als 4-stellige Basis-250-Zeichenfolge dargestellt werden (was bedeutet, dass es 6 Bytes anstelle von 10 benötigt), aber ich bin nicht sicher, wie ich es als solches komprimieren soll.
ETHproductions
Hat Jelly kein eingebautes Pi?
Math Junkie
@ Mathjunkie, aber Jelly ist nicht sehr effizient auf String-Manipulation
Leaky Nun
@mathjunkie Ja, aber die Manipulationen an der Liste nehmen zu viele Bytes in
Anspruch
“ṀSṪw’werde dir geben 3145926870.
Undichte Nonne
8

Japt , 10 9 Bytes

8 Byte Code, +1 für das -PFlag.

–!bMP+U

Probieren Sie es online! Übernimmt die Eingabe als Zeichenfolge.

Erläuterung

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

Verwendet Strings für I / O.

Neil
quelle
7

Gelee ,  8  7 Bytes

-1 Byte dank Dennis (benutze evtl. 0im Eingang vorhandene, clevere.)

ØP;ṾiµÞ

Probieren Sie es online!

Wie?

Ø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
quelle
... und da habe ich nach Quadraten gesucht - 3820009(sqrt of 14592468760081) ist immer noch eine 3Zahl in der Basis 250.
Jonathan Allan
Das in deiner Erklärung ist falsch.
Erik der Outgolfer
@EriktheOutgolfer - danke, angepasst.
Jonathan Allan
6

CJam , 15 12 10 8 Bytes

r{P`#c}$

Probieren Sie es online!

-3: Verwenden Sie eine Zeichenfolge basierend auf der PVariable pi anstelle eines Literal.
-2: Beschlossen, dass ich überhaupt keine Eindeutigkeit benötigen muss, da das Finden eines Index sowieso das erste Mal erfolgt. -2: Danke an jimmy23013 für einen interessanten Ansatz mit x mod 65536.

Erläuterung:

r {P` # c} $ e # Nimmt ein Eingabe-Token auf
re # Nimm die ganze Zahl als String
 {P` # c} e # Sortierschlüssel:
  P e # Push P (Standardeinstellung 3.141592653589793)
   `e # In Stringdarstellung konvertieren
    # e # Finden Sie den Index von char in der Zeichenfolge, die wir erstellt haben
         e # A '.' wird nie in einer ganzen Zahl gefunden, aber es spielt keine Rolle, da die Verschiebung die ideale Sortierung beibehält.
         e # A '0' wird als -1 indiziert.
     ce # Index in Zeichen konvertieren
         e # Dieser berechnet zuerst den Index% 65536 und konvertiert dann in char. Wir brauchen dies, weil sonst 0 als -1 indiziert würde, dh als kleinster Index.
         e # Wir müssen nicht zurück in eine Ganzzahl konvertieren, da wir die lexikografische Sortierung verwenden können.
       $ e # Mit Schlüssel sortieren

Erik der Outgolfer
quelle
1
Yay, schlägt MATL :)
Erik der Outgolfer
@ Jimmy23013 Wow, das ist klug. Es ist fast so, als gäbe es eine integrierte Funktion für int (x)% 65536, cidie sogar wieder in eine Ganzzahl konvertiert würde.
Erik der Outgolfer
5

PHP, 71 Bytes

Die Regex-Lösung ist kürzer

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

oder

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

Online-Versionen

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

Online Version

Jörg Hülsermann
quelle
Ich habe eine 69-Byte-Lösung hinzugefügt . Vielleicht können wir es zusammen auf 66 Byte bringen;)
Christoph
5

C 103 97 Bytes

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

Probieren Sie es online aus

Johan du Toit
quelle
Danke, @ceilingcat, MSVC mag das überhaupt nicht, ich nehme an, ich sollte lieber mit gcc prototypen :-)
Johan du Toit
MSVC wird es wahrscheinlich nicht gefallen, dass Sie mit gcc charin char*pandchar*t
ceilingcat 22.09.17
4

Ruby, 50 Bytes

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

MATL , 14 Bytes

YP99Y$uj!y=sY"

Probieren Sie es online!

Erklärung mit einem Beispiel

Das Symbol ;wird als Zeilentrennzeichen in Matrizen verwendet. Ist [1 2 3]also ein Zeilenvektor, [1; 2; 3]ist ein Spaltenvektor und [1 2; 3 4]ist eine quadratische Matrix. Letztere können der Übersichtlichkeit halber auch als dargestellt werden

[1 2;
 3 4]

Betrachten Sie die Eingabe 2325als Beispiel.

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
quelle
2

C # Interactive, 37 36 Bytes

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

Eigentlich müssen Sie dies in C # interaktiv ausführen, um die richtigen Ergebnisse zu erzielen, aber ich denke, das ist, was Sie mit Exit-Status gemeint haben . Die Variable i ist eigentlich die Eingabevariable (sie kann beispielsweise eine Zeichenfolge sein), also im Grunde der Methodenparameter.

Ich denke, der Code selbst ist ziemlich einfach.

MetaColon
quelle
Wo ist der 3?
Paul
1
@Paul ist nicht erforderlich, da -1 zurückgegeben wird, wenn das Element nicht gefunden wird.
MetaColon
Dies ist jedoch nur ein Ausschnitt aus dem Code. Ich bin mir ziemlich sicher, dass Sie selbst in interaktiven Code angeben müssen, warum er iirgendwo ist, damit er als Eingabe verwendet werden kann. Auch wenn Sie C # sagen, müssen Sie using System.Linq;in die Byteanzahl einschließen . Wenn dies jedoch Interactive ist, sollten Sie die Sprache als C # Interactive angeben, nicht nur als C #.
TheLethalCoder
@TheLethalCoder Ich habe es auf C # Interactive aktualisiert. Die Verwendung ist im interaktiven Modus nicht erforderlich, da sie automatisch enthalten ist.
MetaColon
2

05AB1E , 5 6 Bytes (nicht konkurrierend )

Musste feststellen, dass 0in der Standardlänge pi Konstante nicht vorhanden ist.

Σтžsyk

Probieren Sie es online!

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi
kalsowerus
quelle
Sie sollten dieses Wettbewerbsverbot als Σneuer als die Herausforderung kennzeichnen .
Emigna
@Emigna hat es markiert, danke. Aber nach dem erforderlichen
Update ist es
Schade, dass Sie diese Null für diese Methode benötigt haben. Zumindest für diese Sprache sollte es optimal sein. Kann nicht mehr verlangen :)
Emigna
2

PHP, 66 65 Bytes

Dank Titus 1 Byte gespeichert.

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

Java 7, 110 Bytes

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

Erläuterung:

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

Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

33311145599922688888770
Kevin Cruijssen
quelle
1

Clojure, 38 Bytes

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

Die Eingabe in Zeichenfolge gibt eine Folge von Zeichen zurück. zipmapErstellt ein "Dictionary" -Objekt, das auch in einem Funktionskontext verwendet werden kann.

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

Wenn die Eingabe garantiert eindeutig ist, können Sie dies einfach tun #(filter(set %)"3145926870").

NikoNyrh
quelle
1

PHP, 69 68

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

Immer noch von preg_filter besiegt, aber ich fand es selbst ganz nett. Vielleicht kann jemand ein paar Bytes abwerfen.

Christoph
quelle
$c!=$d?:print$dals Alternative $c==$d&&print$dsehe ich im Moment nur
Jörg Hülsermann
1
_3145926870statt "3145926870" 1 Byte speichern
Jörg Hülsermann
for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);ist auch eine funktionierende Alternative
Jörg Hülsermann
0

Perl 6 , 34 Bytes

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

Versuch es

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

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

k, 19 Bytes

{x@<"3145926870"?x}

Erläuterung:

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