Given a non-negative number n
, sort the digits of n
by their first occurrence in pi.
Input can be taken via function cli argument, or STDIN and as a string, char[] or integer. You may output via return value, exit status or STDOUT.
Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It only takes a minute to sign up.
Sign up to join this communityGiven a non-negative number n
, sort the digits of n
by their first occurrence in pi.
Input can be taken via function cli argument, or STDIN and as a string, char[] or integer. You may output via return value, exit status or STDOUT.
3
, since find will return -1
when an item is not found.
\$\endgroup\$
Apr 29, 2017 at 17:51
Saved 1 byte thanks to Leaky Nun noting that filtering out duplicates is unnecessary.
Saved 2 bytes thanks to Adnan.
žqRvy†J
Explanation
ž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
ox+.n0
-1 thanks to Leaky Nun: The input will provide the 0
if it's ever needed.
Trivial -1 thanks to Jakube: Backtick not needed (ah, how did I miss that, HOW?!?).
0
at the end. If the input has a 0
, the 0
would be provided by the input; if the input does not have a 0
, it won't matter.
\$\endgroup\$
Apr 29, 2017 at 18:16
ox+.n0
\$\endgroup\$
“ṀSṪw’ṾiµÞ
Takes input as a string of digits.
-3 bytes thanks to @ETHproductions
Explanation
“Ṁ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
can be represented as a 4-digit base-250 string (meaning it takes up 6 bytes instead of 10), but I'm not sure how to compress it as such.
\$\endgroup\$
Apr 29, 2017 at 16:46
8 bytes of code, +1 for the -P
flag.
–!bMP+U
Try it online! Takes input as a string.
–!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
f=
s=>[...s].sort((a,b)=>k[a]-k[b],k=`9150236874`).join``
<input oninput=o.textContent=f(this.value)><pre id=o>
Uses strings for I/O.
-1 byte thanks to Dennis (use any existing 0
in the input, clever.)
Ø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
) is still 3
digits in base 250
.
\$\endgroup\$
Apr 29, 2017 at 18:25
Ṿ
in your explanation is misplaced.
\$\endgroup\$
Apr 30, 2017 at 9:56
r{P`#c}$
-3: Use a string based on the P
pi variable instead of a literal.
-2: Decided I don't need to uniquify at all, since finding an index takes the first occurrence anyways.
-2: Thanks to jimmy23013 for an interesting approach using x mod 65536.
Explanation:
r{P`#c}$ e# Takes an input token r e# Take the integer as a string {P`#c} e# Sorting key: P e# Push P (defaults to 3.141592653589793) ` e# Convert to string representation # e# Find char's index in the string we made e# A '.' will never be found in an integer, but it doesn't matter, since the shifting preserves ideal sorting. e# A '0' will be indexed as -1. c e# Convert index to char e# This first calculates index % 65536, and then converts to char. We need this because otherwise 0 would be indexed as -1, i.e. smallest index. e# We don't need to convert back to integer, since we can use lexicographical sorting. $ e# Sort with key
ci
would even convert back to integer.
\$\endgroup\$
May 2, 2017 at 11:12
The regex solution is shorter
for(;~$c=_3145926870[$i++];)echo str_repeat($c,substr_count($argn,$c));
or
for(;~$c=_3145926870[$i++];)echo str_pad("",substr_count($argn,$c),$c);
for(;~$c=$argn[$i++];)$j[strpos("3145926870",$c)].=$c;ksort($j);echo join($j);
$a=str_split($argn);usort($a,function($x,$y){return strpos($d="3145926870",$x)<=>strpos($d,$y);});echo join($a);
n=gets;"3145926870".each_char{|c|$><<c*n.count(c)}
f(char*s){for(char*d="3145926870",*p;*d;d++)for(p=s;*p;)*p++-*d||putchar(*d);}
YP99Y$uj!y=sY"
The symbol ;
is used as row separator in matrices. So [1 2 3]
is a row vector, [1; 2; 3]
is a column vector, and [1 2; 3 4]
is a square matrix. The latter can also be represented, for clarity, as
[1 2;
3 4]
Consider input 2325
as an example.
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'
i.OrderBy(c=>"145926870".IndexOf(c))
Actually you have to execute this in the C# interactive for proper results, but I guess this is what you meant with exit status. The variable i actually is the input variable (it can be for example a string), so it's basically the method parameter.
I think the code itself is pretty straight forward.
i
is somewhere so it can be taken as input. Also if you're saying C# you have to include using System.Linq;
into the byte count. However, if this is Interactive you should specify the language as C# Interactive not solely C#.
\$\endgroup\$
May 18, 2017 at 13:13
Saved 1 byte thanks to Titus.
while(~$d=_3145926870[++$i])echo preg_filter("/[^$d]/",'',$argn);
{⍵[⍵⍋⍨14⍕○1]}
○1
Pi times 1.
14⍕
convert to a string with 14 decimal digits. This includes all unique digits except 0.
⍵⍋⍨
the indices that would sort the input string ⍵
according to order given by the previous string.
⍵[...]
index with those indices into the input to sort it.
Had to realise that 0
is not present in the standard length pi constant.
Σтžsyk
Σтžsyk
Σ Sort by the result of code
тžs Push 100 digits of pi
yk Index of digit in pi
String c(String s){String r="";for(char i:"3145926870".toCharArray())r+=s.replaceAll("[^"+i+"]","");return r;}
Explanation:
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
Test code:
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"));
}
}
Output:
33311145599922688888770
#(sort-by(zipmap"3145926870"(range))%)
Input in string, returns a sequence of characters. zipmap
creates a "dictionary" object, which can be used in a function context as well.
(f "1234")
(\3 \1 \4 \2)
If input digits were guaranteed to be unique then you could simply do #(filter(set %)"3145926870")
.
for(;(~$d=$argn[$j++])||~$c=_3145926870[$i+++$j=0];)$c==$d&&print$d;
Still beaten by preg_filter but I thought it was quite nice itself. Maybe someone can golf off some bytes.
$c!=$d?:print$d
as alternative for $c==$d&&print$d
I only see in the moment
\$\endgroup\$
May 2, 2017 at 14:21
_3145926870
instead of `"3145926870" save 1 Byte
\$\endgroup\$
May 2, 2017 at 14:26
for(;(~$d=$argn[$j++])?:~$c=_3145926870[++$i+$j=0];$c!=$d?:print$d);
is also a working alternative
\$\endgroup\$
May 2, 2017 at 14:57
PI.0@?_SKa
SKa Sort the command-line argument a by this key function:
@?_ Index of first occurrence in
PI.0 Pi (3.141592653589793) concatenated with 0
If the 0
isn't added, PI@?0
returns nil, which behaves... strangely... when used as a sorting key.
*.comb.sort:{3145926870.index: $_}
*\ # WhateverCode lambda (this is the parameter)
.comb # split into digits
.sort: { # sort by
3145926870.index: $_ # its index in this number
}
{x@<"3145926870"?x}
Explanation:
{ } /function(x)
"3145926870"?x /for each x: "3145926870".index(x)
< /get indices with which to sort
x@ /sort x by those indices
Input Str1
seq(expr(sub(Str1,I,1)),I,1,length(Str1→A
seq(1+sum(not(cumSum(Ans(I)={3,1,4,5,9,2,6,8,7}))),I,1,dim(Ans→B
SortD(ʟB,ʟA
sum(seq(₁₀^(I-1)ʟA(I),I,1,dim(ʟA
Takes input as a string. Outputs a number that is stored in Ans
and is displayed at the end.