Given a positive number n, rotate its base-10 digits m positions rightward. That is, output the result of m steps of moving the last digit to the start. The rotation count m will be a non-negative integer.
You should remove leading zeroes in the final result, but not in any of the intermediate steps. For example, for the test case 100,2 => 1, we first rotate to 010, then to 001, then finally drop the leading zeroes to get 1.
Tests
n,m => Output
123,1 => 312
123,2 => 231
123,3 => 123
123,4 => 312
1,637 => 1
10,1 => 1
100,2 => 1
10,2 => 10
110,2 => 101
123,0 => 123
9998,2 => 9899
50 Answers 50
Japt -N, 2 bytes
Takes n as a string as the first input and V=m as an integer or string as the second input, outputs an integer.
Prepend s or ì for +1 byte if we have to take both as integers.
éV
R, 51 bytes
function(n,m,p=10^nchar(n))sum(n*p^(0:m))%/%10^m%%p
Numeric solution (that fails for combinations of n & m that cause it to exceed R's numeric range): chains the digits of n, m times (so: 123 => 123123123123 for m=4) and then calculates DIV 10^m (so: 12312312 for m=4) MOD 10^digits(n) (so: 312).
R, (削除) 61 (削除ここまで) 53 bytes
Edit: -8 bytes thanks to Giuseppe
function(n,m,N=nchar(n),M=10^(m%%N))n%%M*10^N/M+n%/%M
(削除) Text-based function that (削除ここまで) Rotates by combining the two parts of the number together, so does not go out of numeric range: puts the last (m MOD digits(n)) digits of n first, followed by the other digits of n.
-
-
\$\begingroup\$ Thanks Giuseppe, that's very nice. \$\endgroup\$Dominic van Essen– Dominic van Essen2020年08月17日 16:22:29 +00:00Commented Aug 17, 2020 at 16:22
Python 3, (削除) 61 (削除ここまで) 57 bytes
i=input
n=i()
k=int(i())%len(n)
print(int(n[-k:]+n[:-k]))
Uses string slicing to move the last k digits at the beginning and converts it to an integer to remove the leading zeroes.
-4 bytes thanks to Lyxal
-
3
05AB1E, 4 bytes
(._ï
Explanation
(._ï
( : get negative of m
._ : rotate n left negative m times
ï : remove leading zeros
-
1\$\begingroup\$ I may be misremembering but doesn't 05AB1E also have a rotate right built-in, to save you a byte on the negation? \$\endgroup\$Shaggy– Shaggy2020年08月15日 13:27:20 +00:00Commented Aug 15, 2020 at 13:27
-
\$\begingroup\$ @Shaggy, Pretty new to 05AB1E. I could not find a built-in to rotate right m units in the wiki, though there was a built-in to rotate right 1 unit (
Á). \$\endgroup\$Mukundan314– Mukundan3142020年08月15日 13:37:25 +00:00Commented Aug 15, 2020 at 13:37 -
\$\begingroup\$ That might've been what I was thinking of. Would a loop using that be shorter? \$\endgroup\$Shaggy– Shaggy2020年08月15日 17:05:36 +00:00Commented Aug 15, 2020 at 17:05
-
2\$\begingroup\$ @Shaggy this would be the same length:
EÁ}ï. At least that is the best I can come up with. It would be shorter if we didn't need to remove leading zeroes (justEÁ). \$\endgroup\$ovs– ovs2020年08月15日 18:52:25 +00:00Commented Aug 15, 2020 at 18:52
Python 3, 39 bytes
lambda n,m:int(((n*m)[-m:]+n)[:len(n)])
Try it online! Or see the test-suite.
How?
Rotating n right by m is the same as rotating n right by m modulo length n (m%len(n)), which is the concatenation of the last m%len(n) digits with the first len(n)-m%len(n) digits.
A simple slice would give us
lambda n,m:int(n[-m%len(n):]+n[:-m%len(n)])
for 43 bytes. To remove the need for the repeated -m% we can instead concatenate the last m%len(n) digits with all the digits of n and then take the first len(n) digits. This is
lambda n,m:int((n[-m%len(n):]+n)[:len(n)])
for 42 bytes. The n[-m%len(n):] can then be replaced with taking the rightmost m digits of m ns concatenated together, (n*m)[-m:] giving us the 39 byte solution.
[Taxi], (削除) 1698 (削除ここまで) 1678 bytes
No need to wrap single-byte plan names in quote marks. 0.6% byte reduction!
Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Addition Alley.1 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 1 l 1 l 2 l. Pickup a passenger going to Addition Alley.Go to Addition Alley:w 1 r 3 r 1 r 1 r.Pickup a passenger going to The Underground.Go to Chop Suey:n 1 r 2 r.[1]Switch to plan 2 if no one is waiting.Pickup a passenger going to Narrow Path Park.Go to Narrow Path Park:n 1 l 1 r 1 l.Go to Chop Suey:e 1 r 1 l 1 r.Switch to plan 1.[2]Go to Narrow Path Park:n 1 l 1 r 1 l.Switch to plan 3 if no one is waiting.Pickup a passenger going to Chop Suey.Go to Chop Suey:e 1 r 1 l 1 r.Switch to plan 2.[3]Go to Chop Suey:e 1 r 1 l 1 r.[a]Go to The Underground:s 1 r 1 l.Switch to plan b if no one is waiting.Pickup a passenger going to The Underground.Go to Fueler Up:s.Go to Chop Suey:n 3 r 1 l.Pickup a passenger going to Chop Suey.Switch to plan a.[b]Go to Chop Suey:n 2 r 1 l.[4]Switch to plan 5 if no one is waiting.Pickup a passenger going to Narrow Path Park.Go to Narrow Path Park:n 1 l 1 r 1 l.Go to Chop Suey:e 1 r 1 l 1 r.Switch to plan 4.[5]Go to Narrow Path Park:n 1 l 1 r 1 l.[c]Switch to plan d if no one is waiting.Pickup a passenger going to KonKat's.Go to KonKat's:e 1 r.Pickup a passenger going to KonKat's.Go to Narrow Path Park:n 2 l.Switch to plan c.[d]Go to KonKat's:e 1 r.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s.Pickup a passenger going to The Babelfishery.Go to KonKat's:n.Go to The Babelfishery:s.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.
I chose to get fired rather than sacrifice the bytes required to return to the garage at the end. I have checked both very long inputs and very long rotations and the net gain is positive so you never run out of gas.
Formatted for legibility and with comments:
[ Pick up the inputs, add 1 to the second, and chop the first into pieces. ]
Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to Chop Suey.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s 1 l 1 r.
Pickup a passenger going to Addition Alley.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology:n 1 l 1 l 1 l 2 l.
Pickup a passenger going to Addition Alley.
Go to Addition Alley:w 1 r 3 r 1 r 1 r.
Pickup a passenger going to The Underground.
Go to Chop Suey:n 1 r 2 r.
[ Reverse the order the charaters are stored in so we can right-shift instead of left-shift. ]
[1]
Switch to plan 2 if no one is waiting.
Pickup a passenger going to Narrow Path Park.
Go to Narrow Path Park:n 1 l 1 r 1 l.
Go to Chop Suey:e 1 r 1 l 1 r.
Switch to plan 1.
[2]
Go to Narrow Path Park:n 1 l 1 r 1 l.
Switch to plan 3 if no one is waiting.
Pickup a passenger going to Chop Suey.
Go to Chop Suey:e 1 r 1 l 1 r.
Switch to plan 2.
[3]
Go to Chop Suey:e 1 r 1 l 1 r.
[ Loop the required times, rotating the passengers at Chop Suey each time. ]
[a]
Go to The Underground:s 1 r 1 l.
Switch to plan b if no one is waiting.
Pickup a passenger going to The Underground.
Go to Fueler Up:s.
Go to Chop Suey:n 3 r 1 l.
Pickup a passenger going to Chop Suey.
Switch to plan a.
[b]
Go to Chop Suey:n 2 r 1 l.
[ Reverse the character order again. ]
[4]
Switch to plan 5 if no one is waiting.
Pickup a passenger going to Narrow Path Park.
Go to Narrow Path Park:n 1 l 1 r 1 l.
Go to Chop Suey:e 1 r 1 l 1 r.
Switch to plan 4.
[5]
Go to Narrow Path Park:n 1 l 1 r 1 l.
[ Concatenate the passengers at Narrow Path Park. ]
[c]
Switch to plan d if no one is waiting.
Pickup a passenger going to KonKat's.
Go to KonKat's:e 1 r.
Pickup a passenger going to KonKat's.
Go to Narrow Path Park:n 2 l.
Switch to plan c.
[ Convert to a number to remove leading zeros and then back to a string so the Post Office can handle it. ]
[d]
Go to KonKat's:e 1 r.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s.
Pickup a passenger going to The Babelfishery.
Go to KonKat's:n.
Go to The Babelfishery:s.
Pickup a passenger going to Post Office.
Go to Post Office:n 1 l 1 r.
MATL, 3 bytes
YSU
Takes n as a string and m as an integer.
Explanation
YS % Shift first input second input number of times
U % Convert to integer to remove leading 0s
MATL, 5 bytes
ViYSU
This answer takes both the inputs as integers.
Charcoal, 9 bytes
II⭆θ§θ−κη
Try it online! Link is to verbose version of code. Explanation:
θ Input `n` as a string
⭆ Map over characters and join
κ Current index
− Subtract
η Input `m`
§ Cyclically indexed into
θ Input `n` as a string
I Cast to integer
I Cast to string
Implicitly print
Conveniently if you try to Subtract an integer and a string then the string gets cast to integer.
APL+WIN, (削除) 8 (削除ここまで) 7 bytes
Prompts for n as integer and m as string:
⍎(-⎕)⌽⎕
JavaScript (ES6), 36 bytes
Expects (m)(n), where n is a string and m is either a string or an integer.
m=>g=n=>m--?g(n%10+n.slice(0,-1)):+n
C (gcc) -lm, (削除) 65 (削除ここまで) \$\cdots\$ (削除) 56 (削除ここまで) 55 bytes
Saved a byte thanks to ceilingcat!!!
e;f(n,m){for(e=log10(n);m--;)n=n%10*exp10(e)+n/10;m=n;}
Inputs integers \$n\$ and \$m\$.
Base-10 digitally rotates \$n\$ right \$m\$-times and returns it.
Pyth, 4 bytes
v.>z
Explanation
v.>zQ
Q : first line of input evaluated
z : second line of input as string
.> : cyclically rotate second line right by number in first line
v : evaluate to remove leading 0s
-
1\$\begingroup\$ Always happy to see people using Pyth. \$\endgroup\$izzyg– izzyg2020年08月16日 05:19:34 +00:00Commented Aug 16, 2020 at 5:19
Keg, -hr, 11 bytes
÷(¿|")(4)⅍(5)∑Z
Explained
÷(¿|")(4)⅍(5)∑Z
÷ # Split m into individual numbers
(¿|") # n times, shift the stack right
(4)⅍(5) # turn each character into a string
∑Z # sum stack and convert to integer. `-hr` prints it as integer
Java (JDK), 66 bytes
(n,x)->new Long((""+n+n).substring(x=(n=(""+n).length())-x%n,x+n))
-
1\$\begingroup\$ n=110 m=2 seems to output 11 instead of 101... \$\endgroup\$Dominic van Essen– Dominic van Essen2020年08月15日 16:54:12 +00:00Commented Aug 15, 2020 at 16:54
-
1\$\begingroup\$ Why is all the function support code (like
import java.util.function.*;and even the trailing semicolon) not included in the bytes count? \$\endgroup\$Noodle9– Noodle92020年08月15日 20:53:39 +00:00Commented Aug 15, 2020 at 20:53 -
2\$\begingroup\$ @Noodle9 The trailing semicolon isn't counted because it's a lambda. One way of writing it is to have
Lambda lambda = (x, y) -> x+y;, and yes you have a semicolon. Another way of using a lambda is this:f.acceptLambda((x, y) -> x+y);. Do you see a semicolon after the lambda ? No, but the lambda is still the same! This is possible because the semicolon isn't part of the lambda, but part of the storage of the lambda in a variable. Regarding the imports, I invite you to read the relevant meta post. \$\endgroup\$Olivier Grégoire– Olivier Grégoire2020年08月15日 21:12:06 +00:00Commented Aug 15, 2020 at 21:12 -
\$\begingroup\$ @DominicvanEssen Good catch, I fixed it at a cost of 7 bytes. \$\endgroup\$Olivier Grégoire– Olivier Grégoire2020年08月15日 21:23:13 +00:00Commented Aug 15, 2020 at 21:23
Ruby -nl, 34 bytes
->m{($_*-~m*2)[~~/$/*m,~/$/].to_i}
Takes \$n\$ from STDIN and \$m\$ as an argument. Concatenates \$n\$ \2ドル(m+1)\$ times, then from this string takes the substring of length \$d\$ (where \$d\$ is the number of digits in \$n\$) that begins \$m(d+1)\$ characters from the end. In the code, $_ is \$n\$ and ~/$/ gives \$d\$.
Example
For \$n=123\$, \$m=2\$:
- Concatenate \$n\$ \2ドル(m+1)=6\$ times:
123123123123123123 - Count back from the end \$m(d+1)=8\$ characters:
123123123123123123 - Take substring of length \$d=3\$:
123123123123123123
Ruby, (削除) 44 (削除ここまで) 40 bytes
->a,b{a.to_s.chars.rotate(-b).join.to_i}
-4 from Dingus.
Ruby, 19 bytes
->a,b{a.rotate(-b)}
taking a list of digits
-
\$\begingroup\$ -21 bytes--Numeric input and output can be a list of digits, which means you don't need any of the pre- or post-processing you included \$\endgroup\$CG One Handed– CG One Handed2022年04月18日 05:23:33 +00:00Commented Apr 18, 2022 at 5:23
-
\$\begingroup\$ That is fine by the rules, but I didn't want to do it. I will add your changes separately. \$\endgroup\$Razetime– Razetime2022年04月18日 11:10:12 +00:00Commented Apr 18, 2022 at 11:10
-
\$\begingroup\$ You can save a byte in the second snippet by dropping the parentheses:
->a,b{a.rotate -b}\$\endgroup\$Jordan– Jordan2025年03月31日 15:41:55 +00:00Commented Mar 31 at 15:41
J, 11 bytes
(".@|.":)~-
How it works
Uses @Bubbler's tacit trick for (F x) G (H y) = (G~F)~H.
(".@|.":)~-
- negate y to shift right
( )~ flip arguments, so ((-y) ".@|. (":x))
": convert x to string
|. shift that by negated y
".@ and convert back to number
Python 3.8 (pre-release), (削除) 42 (削除ここまで) 40 bytes
lambda x,r:int(x[(a:=-r%len(x)):]+x[:a])
Jelly, (4?) 5 bytes
4 if we may accept a list of digits (remove the leading D).
DṙN}Ḍ
How?
DṙN}Ḍ - Link: integer, n; integer, m
D - convert to base ten
} - use m as the input of:
N - negate
ṙ - rotate (n) left by (-m)
Ḍ - convert from base ten
-
3\$\begingroup\$ Is it standard now to allow a list of digits as input when the challenge asks for an integer? All I could find was this sort-of-related proposed I/O default, but it doesn't have the votes to be considered accepted yet. \$\endgroup\$DLosc– DLosc2020年08月16日 00:51:04 +00:00Commented Aug 16, 2020 at 0:51
-
\$\begingroup\$ Hmm, I just saw strings being used in answers and assumed that meant list input must be fine. I could take an integer and prefix with
D. \$\endgroup\$Jonathan Allan– Jonathan Allan2020年08月16日 02:22:08 +00:00Commented Aug 16, 2020 at 2:22 -
\$\begingroup\$ Are strings allowed in place of integers by default? \$\endgroup\$Jonathan Allan– Jonathan Allan2020年08月16日 02:33:21 +00:00Commented Aug 16, 2020 at 2:33
-
1\$\begingroup\$ ... It depends? That's what the linked meta answer proposes, and it hasn't been accepted yet. But then, if you have a full program that gets input from stdin, it's going to be reading a string in most languages. I don't see how to get around that. "Must convert the input string to integer" won't work: some languages (coughlike minecough) don't even have different types for strings and numbers. I noticed the string inputs in other answers too, and didn't like them, but wasn't sure what to say; and then yours stuck out a bit more, so I commented on it. Thanks for the edit. :) \$\endgroup\$DLosc– DLosc2020年08月16日 05:00:10 +00:00Commented Aug 16, 2020 at 5:00
-
\$\begingroup\$ @DLosc: The OP's notion of a "number" is apparently a sequence of digits, not a binary integer, because they didn't even specify anything about what base it should be in. But it can't be base 2 (the natural base for computer integers) because they have digit values from 0 to 3. So at least base 4? With all this stuff about removing leading zeros in the result, it barely even makes sense for the result to be a fixed-width binary integer like C
inteither. If this is the kind of thing you want to do with numbers in your program, keeping them as strings or lists makes the most sense. \$\endgroup\$Peter Cordes– Peter Cordes2020年08月16日 08:22:08 +00:00Commented Aug 16, 2020 at 8:22
CJam, (削除) 10 (削除ここまで) (削除) 7 (削除ここまで) 6 bytes
Saved 3 bytes by remembering that you can preform most array operations on strings.
-1 byte from @my pronoun is monicareinstate noting that m> takes arguments in either order.
rr~m>~
Explanation:
rr Read two string inputs
~ Parse m to number
m> Rotate n string right m times
~ Parse n to number to remove leading zeros
(implicit) output
Old version, 7 bytes:
q~\sm>~
Explanation:
q~ Take input as a string, evaluate to two numbers
\ Swap order
s Convert n to string
m> Rotate n string right m times
~ Parse n to number to remove leading zeros
(implicit) output
-
1\$\begingroup\$ 6 bytes? \$\endgroup\$the default.– the default.2020年08月16日 04:44:42 +00:00Commented Aug 16, 2020 at 4:44
-
\$\begingroup\$ Huh, for some reason I never knew you could take the arguments for
m>(and probably many other functions) in either order. \$\endgroup\$Ethan Chapman– Ethan Chapman2020年08月16日 17:23:44 +00:00Commented Aug 16, 2020 at 17:23
APL (Dyalog Extended), 4 bytes (SBCS)
Anonymous tacit infix function. Takes string n as right argument and number m as left argument.
⍎-⍛⌽
⍎ execute the result of
-⍛ negating the left argument, then using that to
⌽ cyclically rotate the right argument
(non-competing) L=tn, 10
cα;θ2$cD=0
Explanation (in order of execution):
cα; - Turn first number into a list of digits
2$c - Fetch second number as a number
θ - Shift list from first step by number from second step
D=0 - Drop while equals to zero
It prints result as a string.
Note: The language is in progress and I did add stuff to code golf this. So it is not a competing submission.
Retina 0.8.2, 29 bytes
,.+
$*_
+`(.*)(\d)_
2ドル1ドル
^0+
Try it online! Link includes test cases. Takes input as n,m. Explanation:
,.+
$*_
Convert m to unary.
+`(.*)(\d)_
2ドル1ドル
Rotate n m times. This is O(m3) because of the way the regex backtracks trying to find a second match. Right-to-left matching, anchoring the match at the start, or rewriting the code to take input as m,n would reduce the time complexity (at a cost of a byte of course).
^0+
Delete leading zeros.
8 -> ∞Am I doing it right? \$\endgroup\$