Сортировать цифры по их первому вхождению в пи

17

По неотрицательному числу nотсортируйте цифры nпо их первому вхождению в пи .

Входные данные могут быть получены через аргумент функции cli или STDIN, а также в виде строки, char [] или целого числа. Вы можете выводить через возвращаемое значение, состояние выхода или STDOUT.

Роман Греф
источник
Связанные
Гриффин
Можем ли мы принимать ввод и вывод в виде строк или массивов цифр?
ETHproductions
@ETHproductions уточнил.
Роман Грэф,
19
Было бы неплохо несколько тестовых случаев.
Деннис
1
Теперь, когда уже есть 12 ответов, каждый из которых выполняет одно и то же, если вам все еще непонятно, о чем вас спрашивают, тогда это не проблема вопроса.
Утренняя монахиня

Ответы:

14

Pyth, 8 6 байтов

ox+.n0

Попробуй это здесь.

-1 благодаря Leaky Nun : вход предоставит, 0если это когда-либо понадобится.
Тривиальное -1 благодаря Jakube : Backtick не нужен (ах, как я пропустил это, КАК?!?).

Эрик Outgolfer
источник
Woohoo, это даже бьет 05AB1E! Изменить: это не бьет 05AB1E, и я не хочу воровать :(
Эрик Outgolfer
3
Я нашел это. Вам не нужно 0в конце. Если вход имеет 0, то 0будет предоставлен входом; если вход не имеет 0, это не имеет значения.
Утренняя монахиня
3
@LeakyNun, и вы даже можете сохранить ox+.n0
обратную черту
Хорошо, не обращайте внимания на первый комментарий, благодаря LeakyNun и Jakube я снова победил 05AB1E, надеюсь, на этот раз все будет хорошо.
Эрик Outgolfer
1
Это прекрасное количество неявного ввода.
Исаак
21

Python 3 , 40 39 байт

1 байт благодаря Джонатану Аллану.

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

Попробуйте онлайн!

Дрянная Монахиня
источник
6
Вы можете удалить 3, так как поиск вернется, -1когда элемент не найден.
Джонатан Аллан
18

05AB1E , 10 9 7 байт

Сохраненный 1 байт благодаря Leaky Nun, отметившему, что отфильтровывать дубликаты не нужно.
Сохранено 2 байта благодаря Аднану .

žqRvy†J

Попробуйте онлайн!

объяснение

ž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
источник
13žsRvy†Jдля 9 байтов
Leaky Nun
@LeakyNun: О да, дубликаты не имеют значения. Спасибо :)
Emigna
3
Вы можете использовать žqвместо 13žs?
Аднан,
@ Adnan Кажется, это не работает.
Эрик Outgolfer
2
@Adnan: Да, конечно. Я не осознавал, что была еще одна константа пи :)
Emigna
8

Желе , 10 байт

“ṀSṪw’ṾiµÞ

Попробуйте онлайн!

Принимает ввод в виде строки цифр.

-3 байта благодаря @ETHproductions

объяснение

“Ṁ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
источник
Я думаю, что 3145926870может быть представлен в виде 4-значной строки base-250 (то есть она занимает 6 байтов вместо 10), но я не уверен, как сжать ее как таковую.
ETHproductions
У желе нет встроенной функции для пи?
математик наркоман
@mathjunkie, но Джелли не очень эффективна в манипуляциях со струнами
Leaky Nun
@mathjunkie Да, но манипуляции со списком занимают слишком много байтов
fireflame241
“ṀSṪw’даст тебе 3145926870.
Утренняя монахиня
8

Japt , 10 9 байт

8 байтов кода, +1 за -Pфлаг.

–!bMP+U

Попробуйте онлайн! Принимает ввод в виде строки.

объяснение

–!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
источник
7

JavaScript (ES6), 54 байта

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

Использует строки для ввода / вывода.

Нил
источник
7

Желе ,  8  7 байт

-1 байт благодаря Деннису (используйте любой существующий 0на входе, умный.)

ØP;ṾiµÞ

Попробуйте онлайн!

Как?

Ø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
Джонатан Аллан
источник
... и там я искал квадраты - 3820009(sqrt of 14592468760081) все еще 3цифры в базе 250.
Джонатан Аллан
В вашем объяснении неуместно.
Эрик Outgolfer
@EriktheOutgolfer - спасибо, настроил.
Джонатан Аллан
6

CJam , 15 12 10 8 байт

r{P`#c}$

Попробуйте онлайн!

-3: использовать строку, основанную на Pпеременной pi вместо литерала.
-2: решил, что мне вообще не нужно унифицировать, так как в любом случае поиск индекса занимает первое место. -2: спасибо jimmy23013 за интересный подход с использованием x mod 65536.

Объяснение:

r {P` # c} $ e # Принимает входной токен
re # Возьмите целое число как строку
 {P` # c} e # Ключ сортировки:
  P e # Push P (по умолчанию 3.141592653589793)
   `e # Преобразовать в строковое представление
    # e # Найти индекс char в строке, которую мы создали
         e # A '.' никогда не будет найден в целом числе, но это не имеет значения, поскольку смещение сохраняет идеальную сортировку.
         e # A '0' будет проиндексировано как -1.
     ce # Преобразовать индекс в символ
         e # Сначала вычисляется индекс% 65536, а затем преобразуется в символ. Нам это нужно, потому что иначе 0 будет проиндексировано как -1, то есть наименьший индекс.
         e # Нам не нужно конвертировать обратно в целое число, так как мы можем использовать лексикографическую сортировку.
       $ e # Сортировка с ключом

Эрик Outgolfer
источник
1
Ууу, бьет матл :)
Эрик Outgolfer
@ jimmy23013 Вау, это умно. Это почти как встроенная функция для int (x)% 65536, и ciона даже конвертируется обратно в целое число.
Эрик Outgolfer
5

PHP, 71 байт

Решение регулярных выражений короче

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

или

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

Онлайн версии

PHP, 78 байт

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

PHP, 112 байт

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

Онлайн версия

Йорг Хюльсерманн
источник
Я добавил 69-байтовое решение . Может быть, мы сможем уменьшить его до 66 байт;)
Кристоф
5

C 103 97 байт

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

Попробуйте онлайн

Йохан дю Туа
источник
Спасибо, @ceilingcat, MSVC это совсем не нравится. Полагаю, мне лучше прототипировать с помощью gcc :-)
Johan du Toit
MSVC , вероятно , не будет , как тот факт , что НКУ позволяет канаву charв char*pиchar*t
ceilingcat
4

Рубин, 50 байтов

n=gets;"3145926870".each_char{|c|$><<c*n.count(c)}
Петр Ленкефи
источник
3

MATL , 14 байтов

YP99Y$uj!y=sY"

Попробуйте онлайн!

Пояснение с примером

Символ ;используется в качестве разделителя строк в матрицах. Так [1 2 3]же и вектор строки, вектор- [1; 2; 3]столбец и [1 2; 3 4]квадратная матрица. Последний также может быть представлен, для ясности, как

[1 2;
 3 4]

Рассмотрим ввод 2325в качестве примера.

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 байт

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

На самом деле вы должны выполнить это в интерактивном C # для правильных результатов, но я думаю, это то, что вы имели в виду со статусом выхода . Переменная i на самом деле является входной переменной (это может быть, например, строка), так что это в основном параметр метода.

Я думаю, что сам код довольно прост.

MetaColon
источник
Где это 3?
Павел
1
@Paul это не обязательно, так как возвращает -1, если элемент не найден.
MetaColon
Хотя это всего лишь фрагмент кода, я уверен, что даже в интерактивном режиме вы должны указать, почему iэто где-то, чтобы его можно было использовать в качестве входных данных. Кроме того, если вы говорите C #, вы должны включить using System.Linq;в число байтов. Однако, если это Interactive, вы должны указать язык как C # Interactive, а не только C #.
TheLethalCoder
@TheLethalCoder Я обновил его до C # Interactive. Использование не обязательно в интерактивном режиме, так как оно включается автоматически.
MetaColon
2

05AB1E , 5 6 байтов (неконкурентный)

Пришлось осознать, что 0нет стандартной длины в константе пи.

Σтžsyk

Попробуйте онлайн!

Σтžsyk
Σ      Sort by the result of code
 тžs   Push 100 digits of pi
   yk  Index of digit in pi
kalsowerus
источник
Вы должны пометить это не конкурирующее как Σновее, чем вызов.
Эминья
@ Emigna отметил это, спасибо. Но после требуемого исправления он все равно не короче победного ответа):
kalsowerus
Жаль, что вам нужен этот ноль для этого метода. Это должно быть оптимально для этого языка, по крайней мере. Не могу просить больше, чем это :)
Emigna
2

PHP, 66 65 байт

Сохранено 1 байт благодаря Титу.

while(~$d=_3145926870[++$i])echo preg_filter("/[^$d]/",'',$argn);
user63956
источник
1

Java 7, 110 байт

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

Объяснение:

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

Тестовый код:

Попробуй это здесь.

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

Выход:

33311145599922688888770
Кевин Круйссен
источник
1

Clojure, 38 байт

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

Ввод в строку, возвращает последовательность символов. zipmapсоздает объект «словарь», который также может использоваться в контексте функции.

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

Если входные цифры гарантированно будут уникальными, то вы можете просто сделать это #(filter(set %)"3145926870").

НикоНир
источник
1

PHP, 69 68

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

Все еще побежденный preg_filter, но я думал, что это было довольно хорошо само по себе. Может быть, кто-то может сыграть в гольф несколько байтов.

Christoph
источник
$c!=$d?:print$dв качестве альтернативы $c==$d&&print$dя вижу только в данный момент
Йорг Хюльсерманн
1
_3145926870вместо "3145926870" сохраните 1 байт
Йорг Хюльсерманн
for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d); также рабочая альтернатива
Йорг Хюльсерманн
0

Perl 6 , 34 байта

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

Попытайся

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

  3145926870.index: $_ # its index in this number
}
Брэд Гилберт b2gills
источник
0

к, 19 байт

{x@<"3145926870"?x}

Объяснение:

{                 } /function(x)
    "3145926870"?x  /for each x: "3145926870".index(x)
   <                /get indices with which to sort
 x@                 /sort x by those indices
zgrep
источник