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


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 не нужен (ах, как я пропустил это, КАК?!?).


Woohoo, это даже бьет 05AB1E! Изменить: это не бьет 05AB1E, и я не хочу воровать :(
Эрик Outgolfer

3
Я нашел это. Вам не нужно 0в конце. Если вход имеет 0, то 0будет предоставлен входом; если вход не имеет 0, это не имеет значения.
Утренняя монахиня

3
@LeakyNun, и вы даже можете сохранить ox+.n0
обратную черту

Хорошо, не обращайте внимания на первый комментарий, благодаря LeakyNun и Jakube я снова победил 05AB1E, надеюсь, на этот раз все будет хорошо.
Эрик Outgolfer

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

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

Я думаю, что 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

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 # Сортировка с ключом


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


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 на самом деле является входной переменной (это может быть, например, строка), так что это в основном параметр метода.

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


Где это 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

Вы должны пометить это не конкурирующее как Σновее, чем вызов.
Эминья

@ Emigna отметил это, спасибо. Но после требуемого исправления он все равно не короче победного ответа):
kalsowerus

Жаль, что вам нужен этот ноль для этого метода. Это должно быть оптимально для этого языка, по крайней мере. Не могу просить больше, чем это :)
Emigna

2

PHP, 66 65 байт

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

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

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, но я думал, что это было довольно хорошо само по себе. Может быть, кто-то может сыграть в гольф несколько байтов.


$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

к, 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.