Сортуйте цифри за першим їх виникненням у pi


17

Подавши від’ємне число n, сортуйте цифри nза першим їх виникненням у pi .

Введення можна сприймати через аргумент функції 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, і я не хочу красти :(
Erik the Outgolfer

3
Я знайшов це. Вам не потрібно 0в кінці. Якщо вхід має a 0, вхід 0буде наданий; якщо вхід не має 0, це не має значення.
Leaky Nun

3
@LeakyNun, і ти можеш навіть зберегти ox+.n0
тютюн

Добре, ігноруйте перший коментар, завдяки LeakyNun та Jakube, я знову переміг 05AB1E, сподіваюся на хороший цього разу.
Ерік Аутгольфер

1
Це гарна кількість неявного введення.
isaacg


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 Це, здається, не працює.
Ерік Аутгольфер

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, але Jelly не дуже ефективний у маніпуляціях зі струнами
Leaky Nun

@mathjunkie Так, але маніпуляції зі списком займають занадто багато байтів
fireflame241

“ṀSṪw’дасть тобі 3145926870.
Leaky Nun

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 14592468760081) досі 3цифри в базі 250.
Джонатан Аллан

У вашому поясненні неправильно.
Erik the 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 # Перетворити індекс в char
         e # Цей спочатку обчислює індекс% 65536, а потім перетворює на char. Це нам потрібно, тому що в іншому випадку 0 буде індексуватися як -1, тобто найменший індекс.
         e # Нам не потрібно перетворювати назад у цілі числа, оскільки ми можемо використовувати лексикографічне сортування.
       $ e # Сортувати за допомогою ключа


1
Так, б'є MATL :)
Ерік Попередитель


@ jimmy23013 Ого, це розумно. Це майже так, як є вбудований для int (x)% 65536, і ciнавіть перетворить назад на ціле число.
Ерік Аутгольфер

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 :-)
Йохан дю Тойт

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 # Інтерактивна, 37 36 байт

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

Насправді вам потрібно виконати це в інтерактиві C #, щоб отримати належні результати, але я думаю, що це ви мали на увазі під статусом виходу . Змінна i насправді є вхідною змінною (це може бути, наприклад, рядок), тому в основному це параметр методу.

Я думаю, що сам код досить прямо.


Де 3?
Павло

1
@Paul це не потрібно, оскільки він повертає -1, якщо елемент не знайдено.
MetaColon

Це лише фрагмент коду, але я впевнений, що навіть в інтерактивному режимі ви повинні вказати, чому iце десь, щоб його можна було взяти за вхід. Крім того, якщо ви говорите C #, ви повинні включити using System.Linq;до числа байтів. Однак якщо це інтерактив, ви повинні вказати мову як C # Interactive, а не лише C #.
TheLethalCoder

@TheLethalCoder Я оновив його до C # Interactive. Використання не є необхідним в інтерактивному режимі, оскільки воно включається автоматично.
MetaColon

2

05AB1E , 5 6 байт (неконкурентоспроможний)

Довелося усвідомити, що 0в стандартній довжині pi немає постійної.

Σтžsyk

Спробуйте в Інтернеті!

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

Ви повинні відзначити це неконкурентне змагання як Σнове, ніж виклик.
Емінья

@Emigna відзначила це, дякую. Але після необхідного виправлення це все-таки не коротше, ніж виграшної відповіді все одно):
kalsowerus

Шкода, що вам знадобився цей нуль для цього методу. Він повинен бути оптимальним як мінімум для цієї мови. Не можу просити більше цього :)
Емінья


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

k, 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.