Ordina le cifre in base alla prima occorrenza in pi


17

Dato un numero non negativo n, ordina le cifre in nbase alla loro prima occorrenza in pi .

L'input può essere preso tramite l'argomento della funzione cli, o STDIN e come stringa, char [] o intero. È possibile emettere tramite valore di ritorno, stato di uscita o STDOUT.



Possiamo prendere input e output come stringhe o come array di cifre?
ETHproductions

@ETHproductions Chiarito.
Roman Gräf

19
Alcuni casi di test sarebbero belli.
Dennis

1
Ora che sono già presenti 12 risposte, tutte che eseguono la stessa cosa, se non si è ancora chiari su ciò che viene chiesto, non è questo il problema.
Leaky Nun,

Risposte:


14

Pyth, 8 6 byte

ox+.n0

Provalo qui.

-1 grazie a Leaky Nun : l'input fornirà l' 0eventuale necessità.
Trivial -1 grazie a Jakube : Backtick non necessario (ah, come mi sono perso, COME?!?).


Woohoo, questo batte anche 05AB1E! Modifica: non batte 05AB1E e non voglio rubare :(
Erik the Outgolfer

3
L'ho trovato. 0Alla fine non ti serve . Se l'input ha un 0, 0sarebbe fornito dall'input; se l'input non ha un 0, non importa.
Leaky Nun,

3
@LeakyNun e puoi persino salvare il backtick:ox+.n0
Jakube,

OK, ignora il primo commento, grazie a LeakyNun e Jakube, ho battuto di nuovo 05AB1E, spero per sempre questa volta.
Erik the Outgolfer,

1
È una bella quantità di input implicito.
isaacg,


18

05AB1E , 10 9 7 byte

Salvato 1 byte grazie a Leaky Nun rilevando che non è necessario filtrare i duplicati.
Salvato 2 byte grazie ad Adnan .

žqRvy†J

Provalo online!

Spiegazione

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

@LeakyNun: Oh sì, i duplicati non contano. Grazie :)
Emigna,

3
Puoi usare žqinvece di 13žs?
Adnan,

@Adnan Non sembra funzionare.
Erik the Outgolfer,

2
@Adnan: Sì, certo. Non mi ero reso conto che ci fosse un'altra costante costante :)
Emigna,

8

Gelatina , 10 byte

“ṀSṪw’ṾiµÞ

Provalo online!

Accetta input come una stringa di cifre.

-3 byte grazie a @ETHproductions

Spiegazione

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

Penso che 3145926870possa essere rappresentato come una stringa base-250 a 4 cifre (nel senso che occupa 6 byte anziché 10), ma non sono sicuro di come comprimerlo come tale.
ETHproductions

Jelly non ha un builtin per pi?
drogato di matematica il

@mathjunkie ma Jelly non è molto efficiente nella manipolazione delle stringhe
Leaky Nun

@mathjunkie Sì, ma le manipolazioni dell'elenco richiedono troppi byte
fireflame241

“ṀSṪw’ti darà 3145926870.
Leaky Nun,

8

Japt , 10 9 byte

8 byte di codice, +1 per la -Pbandiera.

–!bMP+U

Provalo online! Accetta l'input come stringa.

Spiegazione

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

Usa stringhe per I / O.


7

Gelatina ,  8  7 byte

-1 byte grazie a Dennis (usa qualsiasi esistente 0nell'input, intelligente.)

ØP;ṾiµÞ

Provalo online!

Come?

Ø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

... e lì stavo cercando i quadrati - 3820009(sqrt of 14592468760081) sono ancora 3cifre nella base 250.
Jonathan Allan,

Il nella tua spiegazione è fuori luogo.
Erik the Outgolfer,

@EriktheOutgolfer - grazie, modificato.
Jonathan Allan,

6

CJam , 15 12 10 8 byte

r{P`#c}$

Provalo online!

-3: utilizzare una stringa basata sulla Pvariabile pi anziché un valore letterale.
-2: Ho deciso che non ho bisogno di unificarmi affatto, poiché trovare un indice richiede comunque la prima occorrenza. -2: Grazie a jimmy23013 per un approccio interessante usando x mod 65536.

Spiegazione:

r {P` # c} $ e # Accetta un token di input
re # Accetta l'intero come stringa
 {P` # c} e # Chiave di ordinamento:
  P e # Push P (il valore predefinito è 3.141592653589793)
   `e # Converti in rappresentazione stringa
    # e # Trova l'indice del carattere nella stringa che abbiamo creato
         e # A '.' non verrà mai trovato in un numero intero, ma non importa, poiché lo spostamento conserva l'ordinamento ideale.
         e # A '0' verrà indicizzato come -1.
     ce # Converti indice in carattere
         e # Questo prima calcola l'indice% 65536, quindi viene convertito in carattere. Ne abbiamo bisogno perché altrimenti 0 verrebbe indicizzato come -1, ovvero l'indice più piccolo.
         e # Non abbiamo bisogno di riconvertire in numero intero, poiché possiamo utilizzare l'ordinamento lessicografico.
       $ e # Ordina con chiave


1
Yay, batte MATL :)
Erik the Outgolfer,


@ jimmy23013 Wow, è intelligente. È quasi come se ci fosse un built-in per int (x)% 65536 e cisarebbe persino riconvertito in intero.
Erik the Outgolfer,

5

PHP, 71 byte

La soluzione regex è più breve

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

o

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

Versioni online

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

Versione online


Ho aggiunto una soluzione da 69 byte . Forse possiamo arrivare a 66 byte insieme;)
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);}

Provalo online


Grazie, @ceilingcat, a MSVC non piace affatto, suppongo che dovrei piuttosto fare un prototipo con gcc :-)
Johan du Toit,

MSVC probabilmente non come il fatto che gcc consente di fosso charin char*pechar*t
ceilingcat


3

MATL , 14 byte

YP99Y$uj!y=sY"

Provalo online!

Spiegazione con un esempio

Il simbolo ;viene utilizzato come separatore di riga nelle matrici. Così [1 2 3]è un vettore di riga, [1; 2; 3]è un vettore di colonna ed [1 2; 3 4]è una matrice quadrata. Quest'ultimo può anche essere rappresentato, per chiarezza, come

[1 2;
 3 4]

Considera l'input 2325come esempio.

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 # Interactive, 37 36 byte

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

In realtà devi eseguirlo nel C # interattivo per risultati corretti, ma immagino che questo sia ciò che intendevi con stato di uscita . La variabile i in realtà è la variabile di input (può essere ad esempio una stringa), quindi sostanzialmente è il parametro del metodo.

Penso che il codice stesso sia piuttosto semplice.


Dov'è il 3?
Paolo,

1
@Paul non è necessario, poiché restituisce -1 se l'elemento non viene trovato.
MetaColon

Questo è solo un frammento di codice, sono abbastanza sicuro che anche in modalità interattiva devi specificare perché iè da qualche parte in modo che possa essere preso come input. Inoltre, se stai dicendo C # devi includere using System.Linq;nel conteggio dei byte. Tuttavia, se si tratta di Interactive, è necessario specificare la lingua come C # Interactive non solo C #.
TheLethalCoder

@TheLethalCoder L'ho aggiornato a C # Interactive. L'uso non è necessario nell'interattivo, poiché è incluso automaticamente.
MetaColon,

2

05AB1E , 5 6 byte (non competitivo)

Ho dovuto rendermi conto che 0non è presente nella lunghezza standard pi costante.

Σтžsyk

Provalo online!

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

Dovresti contrassegnare questa non competizione in quanto Σè più recente della sfida.
Emigna,

@Emigna lo ha segnato, grazie. Ma dopo la correzione richiesta non è più breve della risposta vincente comunque):
kalsowerus,

Peccato che ti servisse quello zero per questo metodo. Almeno dovrebbe essere ottimale per questa lingua. Non posso chiedere altro :)
Emigna,

2

PHP, 66 65 byte

Salvato 1 byte grazie a 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;}

Spiegazione:

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

Codice di prova:

Provalo qui.

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

Produzione:

33311145599922688888770

1

Clojure, 38 byte

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

Inserito in stringa, restituisce una sequenza di caratteri. zipmapcrea un oggetto "dizionario", che può essere utilizzato anche in un contesto di funzione.

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

Se le cifre di input fossero garantite come uniche, allora potresti semplicemente farlo #(filter(set %)"3145926870").


1

PHP, 69 68

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

Ancora battuto da preg_filter ma ho pensato che fosse abbastanza carino. Forse qualcuno può giocare a golf alcuni byte.


$c!=$d?:print$din alternativa $c==$d&&print$dvedo solo il momento
Jörg Hülsermann,

1
_3145926870anziché "3145926870" salva 1 byte
Jörg Hülsermann

for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);è anche un'alternativa di lavoro
Jörg Hülsermann,

0

Perl 6 , 34 byte

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

Provalo

*\       # 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}

Spiegazione:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.