Slither Like a Snake
$begingroup$
The Idea
We've done matrix spirals before, and full rotations, and even diagonal
rotations,
but not, as far as I can find, snake rotations!
What is a snake rotation?
Imagine the rows of a matrix snaking back and forth, with dividers between
them like the dividers of long queue:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Now imagine rotating these items by 2. Each item advances, like people moving
in a line, and the items at the end spill out and return to the beginning:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
If there are an odd number of rows it will exit from the right, but still wrap
to the beginning. For example, here's a 3 rotation:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
A negative rotation will take you backwards. Here's a -2 rotation:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
The Challenge
Your function or program will take 2 inputs, in any convenient format:
- A matrix
- A integer (positive or negative) indicating how many places to rotate it.
It will return:
- The rotated matrix
Notes:
- Code golf. Fewest bytes wins.
- Matrixes need not be square, but will contain at least 2 rows and 2 columns
- Positive integers will rotate row 1 toward the right
- Negative integers will rotate row 1 toward the left
- You may reverse the meaning of positive / negative rotation numbers, if convenient
- The rotation number can be larger than the number of items. In that case, it
will wrap. That is, it will be equivalent to the number modulo the number of
items. - The matrix will contain only integers, but it may contain any integers,
including repeats
Test Cases
Format:
- Matrix
- Rotation number
- Expected return value
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
code-golf array-manipulation matrix
$endgroup$
add a comment |
$begingroup$
The Idea
We've done matrix spirals before, and full rotations, and even diagonal
rotations,
but not, as far as I can find, snake rotations!
What is a snake rotation?
Imagine the rows of a matrix snaking back and forth, with dividers between
them like the dividers of long queue:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Now imagine rotating these items by 2. Each item advances, like people moving
in a line, and the items at the end spill out and return to the beginning:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
If there are an odd number of rows it will exit from the right, but still wrap
to the beginning. For example, here's a 3 rotation:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
A negative rotation will take you backwards. Here's a -2 rotation:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
The Challenge
Your function or program will take 2 inputs, in any convenient format:
- A matrix
- A integer (positive or negative) indicating how many places to rotate it.
It will return:
- The rotated matrix
Notes:
- Code golf. Fewest bytes wins.
- Matrixes need not be square, but will contain at least 2 rows and 2 columns
- Positive integers will rotate row 1 toward the right
- Negative integers will rotate row 1 toward the left
- You may reverse the meaning of positive / negative rotation numbers, if convenient
- The rotation number can be larger than the number of items. In that case, it
will wrap. That is, it will be equivalent to the number modulo the number of
items. - The matrix will contain only integers, but it may contain any integers,
including repeats
Test Cases
Format:
- Matrix
- Rotation number
- Expected return value
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
code-golf array-manipulation matrix
$endgroup$
1
$begingroup$
Reversing meaning of +/- is fine. I think the entrance should stay at the top left though.
$endgroup$
– Jonah
4 hours ago
add a comment |
$begingroup$
The Idea
We've done matrix spirals before, and full rotations, and even diagonal
rotations,
but not, as far as I can find, snake rotations!
What is a snake rotation?
Imagine the rows of a matrix snaking back and forth, with dividers between
them like the dividers of long queue:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Now imagine rotating these items by 2. Each item advances, like people moving
in a line, and the items at the end spill out and return to the beginning:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
If there are an odd number of rows it will exit from the right, but still wrap
to the beginning. For example, here's a 3 rotation:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
A negative rotation will take you backwards. Here's a -2 rotation:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
The Challenge
Your function or program will take 2 inputs, in any convenient format:
- A matrix
- A integer (positive or negative) indicating how many places to rotate it.
It will return:
- The rotated matrix
Notes:
- Code golf. Fewest bytes wins.
- Matrixes need not be square, but will contain at least 2 rows and 2 columns
- Positive integers will rotate row 1 toward the right
- Negative integers will rotate row 1 toward the left
- You may reverse the meaning of positive / negative rotation numbers, if convenient
- The rotation number can be larger than the number of items. In that case, it
will wrap. That is, it will be equivalent to the number modulo the number of
items. - The matrix will contain only integers, but it may contain any integers,
including repeats
Test Cases
Format:
- Matrix
- Rotation number
- Expected return value
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
code-golf array-manipulation matrix
$endgroup$
The Idea
We've done matrix spirals before, and full rotations, and even diagonal
rotations,
but not, as far as I can find, snake rotations!
What is a snake rotation?
Imagine the rows of a matrix snaking back and forth, with dividers between
them like the dividers of long queue:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Now imagine rotating these items by 2. Each item advances, like people moving
in a line, and the items at the end spill out and return to the beginning:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
If there are an odd number of rows it will exit from the right, but still wrap
to the beginning. For example, here's a 3 rotation:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
A negative rotation will take you backwards. Here's a -2 rotation:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
The Challenge
Your function or program will take 2 inputs, in any convenient format:
- A matrix
- A integer (positive or negative) indicating how many places to rotate it.
It will return:
- The rotated matrix
Notes:
- Code golf. Fewest bytes wins.
- Matrixes need not be square, but will contain at least 2 rows and 2 columns
- Positive integers will rotate row 1 toward the right
- Negative integers will rotate row 1 toward the left
- You may reverse the meaning of positive / negative rotation numbers, if convenient
- The rotation number can be larger than the number of items. In that case, it
will wrap. That is, it will be equivalent to the number modulo the number of
items. - The matrix will contain only integers, but it may contain any integers,
including repeats
Test Cases
Format:
- Matrix
- Rotation number
- Expected return value
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
code-golf array-manipulation matrix
code-golf array-manipulation matrix
edited 4 hours ago
Jonah
asked 5 hours ago
JonahJonah
2,7161017
2,7161017
1
$begingroup$
Reversing meaning of +/- is fine. I think the entrance should stay at the top left though.
$endgroup$
– Jonah
4 hours ago
add a comment |
1
$begingroup$
Reversing meaning of +/- is fine. I think the entrance should stay at the top left though.
$endgroup$
– Jonah
4 hours ago
1
1
$begingroup$
Reversing meaning of +/- is fine. I think the entrance should stay at the top left though.
$endgroup$
– Jonah
4 hours ago
$begingroup$
Reversing meaning of +/- is fine. I think the entrance should stay at the top left though.
$endgroup$
– Jonah
4 hours ago
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
Jelly, 10 bytes
UÐeẎṙṁ⁸UÐe
A dyadic Link accepting the marix on the left and the rotation integer on the right (uses the reverse meaning of positive / negative)
Try it online!
How?
UÐeẎṙṁ⁸UÐe - Link: matrix of integers, M; integer, R
Ðe - apply to even indices of M:
U - reverse each
Ẏ - tighten
ṙ - rotate left by R
ṁ - mould like:
⁸ - chain's left argument, M
Ðe - apply to even indices of M:
U - reverse each
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "200"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f183153%2fslither-like-a-snake%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Jelly, 10 bytes
UÐeẎṙṁ⁸UÐe
A dyadic Link accepting the marix on the left and the rotation integer on the right (uses the reverse meaning of positive / negative)
Try it online!
How?
UÐeẎṙṁ⁸UÐe - Link: matrix of integers, M; integer, R
Ðe - apply to even indices of M:
U - reverse each
Ẏ - tighten
ṙ - rotate left by R
ṁ - mould like:
⁸ - chain's left argument, M
Ðe - apply to even indices of M:
U - reverse each
$endgroup$
add a comment |
$begingroup$
Jelly, 10 bytes
UÐeẎṙṁ⁸UÐe
A dyadic Link accepting the marix on the left and the rotation integer on the right (uses the reverse meaning of positive / negative)
Try it online!
How?
UÐeẎṙṁ⁸UÐe - Link: matrix of integers, M; integer, R
Ðe - apply to even indices of M:
U - reverse each
Ẏ - tighten
ṙ - rotate left by R
ṁ - mould like:
⁸ - chain's left argument, M
Ðe - apply to even indices of M:
U - reverse each
$endgroup$
add a comment |
$begingroup$
Jelly, 10 bytes
UÐeẎṙṁ⁸UÐe
A dyadic Link accepting the marix on the left and the rotation integer on the right (uses the reverse meaning of positive / negative)
Try it online!
How?
UÐeẎṙṁ⁸UÐe - Link: matrix of integers, M; integer, R
Ðe - apply to even indices of M:
U - reverse each
Ẏ - tighten
ṙ - rotate left by R
ṁ - mould like:
⁸ - chain's left argument, M
Ðe - apply to even indices of M:
U - reverse each
$endgroup$
Jelly, 10 bytes
UÐeẎṙṁ⁸UÐe
A dyadic Link accepting the marix on the left and the rotation integer on the right (uses the reverse meaning of positive / negative)
Try it online!
How?
UÐeẎṙṁ⁸UÐe - Link: matrix of integers, M; integer, R
Ðe - apply to even indices of M:
U - reverse each
Ẏ - tighten
ṙ - rotate left by R
ṁ - mould like:
⁸ - chain's left argument, M
Ðe - apply to even indices of M:
U - reverse each
edited 4 hours ago
answered 4 hours ago
Jonathan AllanJonathan Allan
54.2k537174
54.2k537174
add a comment |
add a comment |
If this is an answer to a challenge…
…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.
…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.
More generally…
…Please make sure to answer the question and provide sufficient detail.
…Avoid asking for help, clarification or responding to other answers (use comments instead).
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f183153%2fslither-like-a-snake%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
$begingroup$
Reversing meaning of +/- is fine. I think the entrance should stay at the top left though.
$endgroup$
– Jonah
4 hours ago