Play Zip, Zap, Zop
$begingroup$
There's a little improv warm up game where you arrange yourselves in a circle and send zips, zaps, and zops around by pointing to a person and saying the next word in the sequence, then they do the same until all of you are warmed up or whatever.
Your task is to create a program that gives the next word in sequence given an input word. (Zip --> Zap --> Zop --> Zip) Since there's a lot of different ways to say these three words and flairs that can be added to them, your program should imitate case and letter duplication and carry suffixes.
To elaborate, your input will be one or more Z
s, then one or more I
s, A
s, or O
s (all the same letter), then one or more P
s, (all letters up to this point may be in mixed case) followed by some arbitrary suffix (which may be empty). You should leave the runs of Z
s and P
s, as well as the suffix exactly as received, but then change the I
s to A
s, A
s to O
s, or O
s to I
s, preserving case at each step.
Example Test Cases
zip ==> zap
zAp ==> zOp
ZOP ==> ZIP
ZiiP ==> ZaaP
ZZaapp ==> ZZoopp
zzzzOoOPppP ==> zzzzIiIPppP
Zipperoni ==> Zapperoni
ZAPsky ==> ZOPsky
ZoPtOn ==> ZiPtOn
zipzip ==> zapzip
zapzopzip ==> zopzopzip
zoopzaap ==> ziipzaap
Rules and Notes
- You may use any convenient character encoding for input and output, provided that it supports all ASCII letters and that it was created prior to this challenge.
- You may assume the input word is some variant of Zip, Zap, or Zop. All other inputs result in undefined behavior.
- Valid inputs will full-match the regex
Z+(I+|A+|O+)P+.*
(in mixed case)
- Valid inputs will full-match the regex
Happy Golfing!
code-golf string
$endgroup$
add a comment |
$begingroup$
There's a little improv warm up game where you arrange yourselves in a circle and send zips, zaps, and zops around by pointing to a person and saying the next word in the sequence, then they do the same until all of you are warmed up or whatever.
Your task is to create a program that gives the next word in sequence given an input word. (Zip --> Zap --> Zop --> Zip) Since there's a lot of different ways to say these three words and flairs that can be added to them, your program should imitate case and letter duplication and carry suffixes.
To elaborate, your input will be one or more Z
s, then one or more I
s, A
s, or O
s (all the same letter), then one or more P
s, (all letters up to this point may be in mixed case) followed by some arbitrary suffix (which may be empty). You should leave the runs of Z
s and P
s, as well as the suffix exactly as received, but then change the I
s to A
s, A
s to O
s, or O
s to I
s, preserving case at each step.
Example Test Cases
zip ==> zap
zAp ==> zOp
ZOP ==> ZIP
ZiiP ==> ZaaP
ZZaapp ==> ZZoopp
zzzzOoOPppP ==> zzzzIiIPppP
Zipperoni ==> Zapperoni
ZAPsky ==> ZOPsky
ZoPtOn ==> ZiPtOn
zipzip ==> zapzip
zapzopzip ==> zopzopzip
zoopzaap ==> ziipzaap
Rules and Notes
- You may use any convenient character encoding for input and output, provided that it supports all ASCII letters and that it was created prior to this challenge.
- You may assume the input word is some variant of Zip, Zap, or Zop. All other inputs result in undefined behavior.
- Valid inputs will full-match the regex
Z+(I+|A+|O+)P+.*
(in mixed case)
- Valid inputs will full-match the regex
Happy Golfing!
code-golf string
$endgroup$
add a comment |
$begingroup$
There's a little improv warm up game where you arrange yourselves in a circle and send zips, zaps, and zops around by pointing to a person and saying the next word in the sequence, then they do the same until all of you are warmed up or whatever.
Your task is to create a program that gives the next word in sequence given an input word. (Zip --> Zap --> Zop --> Zip) Since there's a lot of different ways to say these three words and flairs that can be added to them, your program should imitate case and letter duplication and carry suffixes.
To elaborate, your input will be one or more Z
s, then one or more I
s, A
s, or O
s (all the same letter), then one or more P
s, (all letters up to this point may be in mixed case) followed by some arbitrary suffix (which may be empty). You should leave the runs of Z
s and P
s, as well as the suffix exactly as received, but then change the I
s to A
s, A
s to O
s, or O
s to I
s, preserving case at each step.
Example Test Cases
zip ==> zap
zAp ==> zOp
ZOP ==> ZIP
ZiiP ==> ZaaP
ZZaapp ==> ZZoopp
zzzzOoOPppP ==> zzzzIiIPppP
Zipperoni ==> Zapperoni
ZAPsky ==> ZOPsky
ZoPtOn ==> ZiPtOn
zipzip ==> zapzip
zapzopzip ==> zopzopzip
zoopzaap ==> ziipzaap
Rules and Notes
- You may use any convenient character encoding for input and output, provided that it supports all ASCII letters and that it was created prior to this challenge.
- You may assume the input word is some variant of Zip, Zap, or Zop. All other inputs result in undefined behavior.
- Valid inputs will full-match the regex
Z+(I+|A+|O+)P+.*
(in mixed case)
- Valid inputs will full-match the regex
Happy Golfing!
code-golf string
$endgroup$
There's a little improv warm up game where you arrange yourselves in a circle and send zips, zaps, and zops around by pointing to a person and saying the next word in the sequence, then they do the same until all of you are warmed up or whatever.
Your task is to create a program that gives the next word in sequence given an input word. (Zip --> Zap --> Zop --> Zip) Since there's a lot of different ways to say these three words and flairs that can be added to them, your program should imitate case and letter duplication and carry suffixes.
To elaborate, your input will be one or more Z
s, then one or more I
s, A
s, or O
s (all the same letter), then one or more P
s, (all letters up to this point may be in mixed case) followed by some arbitrary suffix (which may be empty). You should leave the runs of Z
s and P
s, as well as the suffix exactly as received, but then change the I
s to A
s, A
s to O
s, or O
s to I
s, preserving case at each step.
Example Test Cases
zip ==> zap
zAp ==> zOp
ZOP ==> ZIP
ZiiP ==> ZaaP
ZZaapp ==> ZZoopp
zzzzOoOPppP ==> zzzzIiIPppP
Zipperoni ==> Zapperoni
ZAPsky ==> ZOPsky
ZoPtOn ==> ZiPtOn
zipzip ==> zapzip
zapzopzip ==> zopzopzip
zoopzaap ==> ziipzaap
Rules and Notes
- You may use any convenient character encoding for input and output, provided that it supports all ASCII letters and that it was created prior to this challenge.
- You may assume the input word is some variant of Zip, Zap, or Zop. All other inputs result in undefined behavior.
- Valid inputs will full-match the regex
Z+(I+|A+|O+)P+.*
(in mixed case)
- Valid inputs will full-match the regex
Happy Golfing!
code-golf string
code-golf string
edited 1 hour ago
Beefster
asked 3 hours ago
BeefsterBeefster
1,787732
1,787732
add a comment |
add a comment |
6 Answers
6
active
oldest
votes
$begingroup$
Retina 0.8.2, 21 bytes
iT`Io`AOIiaoi`^.+?p
Try it online! Transliterates letters up to and including the first p
, although the z
and p
aren't in the transliteration section so aren't affected. The first O
is quoted because it normally expands to 13567
and the second o
is quoted because it too is magic; in the first part of the transliteration it expands to the other string. The resulting transliteration is therefore from IAOIiaoi
to AOIiaoi
then removing the duplicate source letters results in IAOiao
to AOIaoi
.
$endgroup$
add a comment |
$begingroup$
Stax, 19 bytes
Ç╛√êΣ%,╖FP╚`=Lh←⌡·ƒ
Run and debug it
$endgroup$
add a comment |
$begingroup$
Perl 6, 41 bytes
{S:i{z+<(.+?)>p}=$/.&{TR/iaoIAO/aoiAOI/}}
Try it online!
Simple case-insensitive substitution to shift the vowel section.
$endgroup$
add a comment |
$begingroup$
Japt, 22 20 bytes
-2 bytes thanks to Oliver
r"%v+"_d`i¬iao¯`pu}"
Try it online!
$endgroup$
add a comment |
$begingroup$
JavaScript (Node.js), 69 63 bytes
s=>Buffer(s).map(c=>s|c%4<1?s=c:c&1?c-[6,-14,,,8][c%16%5]:c)+''
Try it online!
How?
We process the input string $s$ character by character.
We reuse $s$ as a flag: as soon as a numeric value is stored in it, we know that we must not update anything else.
We use the following properties to identify the characters at the beginning of the string:
- The ASCII codes of
p
(112) andP
(80) are multiples of $4$. - The ASCII codes of
z
(122) andZ
(90) are even, but not multiples of $4$. - The ASCII codes of the vowels
a
(97),A
(65),i
(105),I
(73),o
(111) andO
(79) are odd.
To turn a vowel with ASCII code $c$ into its counterpart, we use the following hash function:
$$n=(cbmod 16)bmod 5$$
and use $n$ to pick a value that must be subtracted from or added to $c$ from a lookup table.
Commented
s => // s = input string
Buffer(s) // convert it to a Buffer of ASCII codes
.map(c => // for each ASCII code c in s:
s | // if s is numeric
c % 4 < 1 ? // or c is either 'p' or 'P':
s = c // turn s into a numeric value and yield c
: // else:
c & 1 ? // if c is a vowel:
c - // update c to either c - 6 ('o' -> 'i'), c + 14 ('a' -> 'o')
[6, -14,,, 8] // or c - 8 ('i' -> 'a')
[c % 16 % 5] // small hash function to convert from ASCII code to index
: // else (c is either 'z' or 'Z'):
c // let it unchanged
) + '' // end of map(); coerce the Buffer back to a string
$endgroup$
add a comment |
$begingroup$
C (gcc), 81 76 74 bytes
Similar to my JS answer, with another hash function. Outputs by modifying the input string.
x,c;f(char*s){for(x=1;c=*s;)*s++=c%4<x?x=c:c&1?c+"zx16"[c*3%11%3]&127:c;}
Try it online!
Commented
x, // x is used to test if we've reached a 'p' or a 'P'
c; // c is the current character
f(char * s) { // f = function taking the input string s
for(x = 1; c = *s;) // start with x = 1; for each character c in s:
*s++ = // update the current character and advance the pointer:
c % 4 < x ? // if c is 'p' or 'P' or x was raised beyond 3:
x = c // store c in x and let the character unchanged
: // else:
c & 1 ? // if c is a vowel:
c + // update it to the next vowel in the sequence
"zx16" // by adding either 122, 120 or 14
[c * 3 % 11 % 3] // according to the result of the hash function:
// 'a'/'A' -> 2, 'i'/'I' -> 1, 'o'/'O' -> 0
& 127 // and forcing it back into [0..127]
: // else (c is either 'z' or 'Z'):
c; // let it unchanged
} // implicit end of for(); end of function
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
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%2f180463%2fplay-zip-zap-zop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Retina 0.8.2, 21 bytes
iT`Io`AOIiaoi`^.+?p
Try it online! Transliterates letters up to and including the first p
, although the z
and p
aren't in the transliteration section so aren't affected. The first O
is quoted because it normally expands to 13567
and the second o
is quoted because it too is magic; in the first part of the transliteration it expands to the other string. The resulting transliteration is therefore from IAOIiaoi
to AOIiaoi
then removing the duplicate source letters results in IAOiao
to AOIaoi
.
$endgroup$
add a comment |
$begingroup$
Retina 0.8.2, 21 bytes
iT`Io`AOIiaoi`^.+?p
Try it online! Transliterates letters up to and including the first p
, although the z
and p
aren't in the transliteration section so aren't affected. The first O
is quoted because it normally expands to 13567
and the second o
is quoted because it too is magic; in the first part of the transliteration it expands to the other string. The resulting transliteration is therefore from IAOIiaoi
to AOIiaoi
then removing the duplicate source letters results in IAOiao
to AOIaoi
.
$endgroup$
add a comment |
$begingroup$
Retina 0.8.2, 21 bytes
iT`Io`AOIiaoi`^.+?p
Try it online! Transliterates letters up to and including the first p
, although the z
and p
aren't in the transliteration section so aren't affected. The first O
is quoted because it normally expands to 13567
and the second o
is quoted because it too is magic; in the first part of the transliteration it expands to the other string. The resulting transliteration is therefore from IAOIiaoi
to AOIiaoi
then removing the duplicate source letters results in IAOiao
to AOIaoi
.
$endgroup$
Retina 0.8.2, 21 bytes
iT`Io`AOIiaoi`^.+?p
Try it online! Transliterates letters up to and including the first p
, although the z
and p
aren't in the transliteration section so aren't affected. The first O
is quoted because it normally expands to 13567
and the second o
is quoted because it too is magic; in the first part of the transliteration it expands to the other string. The resulting transliteration is therefore from IAOIiaoi
to AOIiaoi
then removing the duplicate source letters results in IAOiao
to AOIaoi
.
answered 33 mins ago
NeilNeil
81.1k744178
81.1k744178
add a comment |
add a comment |
$begingroup$
Stax, 19 bytes
Ç╛√êΣ%,╖FP╚`=Lh←⌡·ƒ
Run and debug it
$endgroup$
add a comment |
$begingroup$
Stax, 19 bytes
Ç╛√êΣ%,╖FP╚`=Lh←⌡·ƒ
Run and debug it
$endgroup$
add a comment |
$begingroup$
Stax, 19 bytes
Ç╛√êΣ%,╖FP╚`=Lh←⌡·ƒ
Run and debug it
$endgroup$
Stax, 19 bytes
Ç╛√êΣ%,╖FP╚`=Lh←⌡·ƒ
Run and debug it
answered 3 hours ago
recursiverecursive
5,3191322
5,3191322
add a comment |
add a comment |
$begingroup$
Perl 6, 41 bytes
{S:i{z+<(.+?)>p}=$/.&{TR/iaoIAO/aoiAOI/}}
Try it online!
Simple case-insensitive substitution to shift the vowel section.
$endgroup$
add a comment |
$begingroup$
Perl 6, 41 bytes
{S:i{z+<(.+?)>p}=$/.&{TR/iaoIAO/aoiAOI/}}
Try it online!
Simple case-insensitive substitution to shift the vowel section.
$endgroup$
add a comment |
$begingroup$
Perl 6, 41 bytes
{S:i{z+<(.+?)>p}=$/.&{TR/iaoIAO/aoiAOI/}}
Try it online!
Simple case-insensitive substitution to shift the vowel section.
$endgroup$
Perl 6, 41 bytes
{S:i{z+<(.+?)>p}=$/.&{TR/iaoIAO/aoiAOI/}}
Try it online!
Simple case-insensitive substitution to shift the vowel section.
answered 2 hours ago
Jo KingJo King
23.7k257123
23.7k257123
add a comment |
add a comment |
$begingroup$
Japt, 22 20 bytes
-2 bytes thanks to Oliver
r"%v+"_d`i¬iao¯`pu}"
Try it online!
$endgroup$
add a comment |
$begingroup$
Japt, 22 20 bytes
-2 bytes thanks to Oliver
r"%v+"_d`i¬iao¯`pu}"
Try it online!
$endgroup$
add a comment |
$begingroup$
Japt, 22 20 bytes
-2 bytes thanks to Oliver
r"%v+"_d`i¬iao¯`pu}"
Try it online!
$endgroup$
Japt, 22 20 bytes
-2 bytes thanks to Oliver
r"%v+"_d`i¬iao¯`pu}"
Try it online!
edited 1 hour ago
answered 2 hours ago
ASCII-onlyASCII-only
3,4501236
3,4501236
add a comment |
add a comment |
$begingroup$
JavaScript (Node.js), 69 63 bytes
s=>Buffer(s).map(c=>s|c%4<1?s=c:c&1?c-[6,-14,,,8][c%16%5]:c)+''
Try it online!
How?
We process the input string $s$ character by character.
We reuse $s$ as a flag: as soon as a numeric value is stored in it, we know that we must not update anything else.
We use the following properties to identify the characters at the beginning of the string:
- The ASCII codes of
p
(112) andP
(80) are multiples of $4$. - The ASCII codes of
z
(122) andZ
(90) are even, but not multiples of $4$. - The ASCII codes of the vowels
a
(97),A
(65),i
(105),I
(73),o
(111) andO
(79) are odd.
To turn a vowel with ASCII code $c$ into its counterpart, we use the following hash function:
$$n=(cbmod 16)bmod 5$$
and use $n$ to pick a value that must be subtracted from or added to $c$ from a lookup table.
Commented
s => // s = input string
Buffer(s) // convert it to a Buffer of ASCII codes
.map(c => // for each ASCII code c in s:
s | // if s is numeric
c % 4 < 1 ? // or c is either 'p' or 'P':
s = c // turn s into a numeric value and yield c
: // else:
c & 1 ? // if c is a vowel:
c - // update c to either c - 6 ('o' -> 'i'), c + 14 ('a' -> 'o')
[6, -14,,, 8] // or c - 8 ('i' -> 'a')
[c % 16 % 5] // small hash function to convert from ASCII code to index
: // else (c is either 'z' or 'Z'):
c // let it unchanged
) + '' // end of map(); coerce the Buffer back to a string
$endgroup$
add a comment |
$begingroup$
JavaScript (Node.js), 69 63 bytes
s=>Buffer(s).map(c=>s|c%4<1?s=c:c&1?c-[6,-14,,,8][c%16%5]:c)+''
Try it online!
How?
We process the input string $s$ character by character.
We reuse $s$ as a flag: as soon as a numeric value is stored in it, we know that we must not update anything else.
We use the following properties to identify the characters at the beginning of the string:
- The ASCII codes of
p
(112) andP
(80) are multiples of $4$. - The ASCII codes of
z
(122) andZ
(90) are even, but not multiples of $4$. - The ASCII codes of the vowels
a
(97),A
(65),i
(105),I
(73),o
(111) andO
(79) are odd.
To turn a vowel with ASCII code $c$ into its counterpart, we use the following hash function:
$$n=(cbmod 16)bmod 5$$
and use $n$ to pick a value that must be subtracted from or added to $c$ from a lookup table.
Commented
s => // s = input string
Buffer(s) // convert it to a Buffer of ASCII codes
.map(c => // for each ASCII code c in s:
s | // if s is numeric
c % 4 < 1 ? // or c is either 'p' or 'P':
s = c // turn s into a numeric value and yield c
: // else:
c & 1 ? // if c is a vowel:
c - // update c to either c - 6 ('o' -> 'i'), c + 14 ('a' -> 'o')
[6, -14,,, 8] // or c - 8 ('i' -> 'a')
[c % 16 % 5] // small hash function to convert from ASCII code to index
: // else (c is either 'z' or 'Z'):
c // let it unchanged
) + '' // end of map(); coerce the Buffer back to a string
$endgroup$
add a comment |
$begingroup$
JavaScript (Node.js), 69 63 bytes
s=>Buffer(s).map(c=>s|c%4<1?s=c:c&1?c-[6,-14,,,8][c%16%5]:c)+''
Try it online!
How?
We process the input string $s$ character by character.
We reuse $s$ as a flag: as soon as a numeric value is stored in it, we know that we must not update anything else.
We use the following properties to identify the characters at the beginning of the string:
- The ASCII codes of
p
(112) andP
(80) are multiples of $4$. - The ASCII codes of
z
(122) andZ
(90) are even, but not multiples of $4$. - The ASCII codes of the vowels
a
(97),A
(65),i
(105),I
(73),o
(111) andO
(79) are odd.
To turn a vowel with ASCII code $c$ into its counterpart, we use the following hash function:
$$n=(cbmod 16)bmod 5$$
and use $n$ to pick a value that must be subtracted from or added to $c$ from a lookup table.
Commented
s => // s = input string
Buffer(s) // convert it to a Buffer of ASCII codes
.map(c => // for each ASCII code c in s:
s | // if s is numeric
c % 4 < 1 ? // or c is either 'p' or 'P':
s = c // turn s into a numeric value and yield c
: // else:
c & 1 ? // if c is a vowel:
c - // update c to either c - 6 ('o' -> 'i'), c + 14 ('a' -> 'o')
[6, -14,,, 8] // or c - 8 ('i' -> 'a')
[c % 16 % 5] // small hash function to convert from ASCII code to index
: // else (c is either 'z' or 'Z'):
c // let it unchanged
) + '' // end of map(); coerce the Buffer back to a string
$endgroup$
JavaScript (Node.js), 69 63 bytes
s=>Buffer(s).map(c=>s|c%4<1?s=c:c&1?c-[6,-14,,,8][c%16%5]:c)+''
Try it online!
How?
We process the input string $s$ character by character.
We reuse $s$ as a flag: as soon as a numeric value is stored in it, we know that we must not update anything else.
We use the following properties to identify the characters at the beginning of the string:
- The ASCII codes of
p
(112) andP
(80) are multiples of $4$. - The ASCII codes of
z
(122) andZ
(90) are even, but not multiples of $4$. - The ASCII codes of the vowels
a
(97),A
(65),i
(105),I
(73),o
(111) andO
(79) are odd.
To turn a vowel with ASCII code $c$ into its counterpart, we use the following hash function:
$$n=(cbmod 16)bmod 5$$
and use $n$ to pick a value that must be subtracted from or added to $c$ from a lookup table.
Commented
s => // s = input string
Buffer(s) // convert it to a Buffer of ASCII codes
.map(c => // for each ASCII code c in s:
s | // if s is numeric
c % 4 < 1 ? // or c is either 'p' or 'P':
s = c // turn s into a numeric value and yield c
: // else:
c & 1 ? // if c is a vowel:
c - // update c to either c - 6 ('o' -> 'i'), c + 14 ('a' -> 'o')
[6, -14,,, 8] // or c - 8 ('i' -> 'a')
[c % 16 % 5] // small hash function to convert from ASCII code to index
: // else (c is either 'z' or 'Z'):
c // let it unchanged
) + '' // end of map(); coerce the Buffer back to a string
edited 1 hour ago
answered 2 hours ago
ArnauldArnauld
76.9k693322
76.9k693322
add a comment |
add a comment |
$begingroup$
C (gcc), 81 76 74 bytes
Similar to my JS answer, with another hash function. Outputs by modifying the input string.
x,c;f(char*s){for(x=1;c=*s;)*s++=c%4<x?x=c:c&1?c+"zx16"[c*3%11%3]&127:c;}
Try it online!
Commented
x, // x is used to test if we've reached a 'p' or a 'P'
c; // c is the current character
f(char * s) { // f = function taking the input string s
for(x = 1; c = *s;) // start with x = 1; for each character c in s:
*s++ = // update the current character and advance the pointer:
c % 4 < x ? // if c is 'p' or 'P' or x was raised beyond 3:
x = c // store c in x and let the character unchanged
: // else:
c & 1 ? // if c is a vowel:
c + // update it to the next vowel in the sequence
"zx16" // by adding either 122, 120 or 14
[c * 3 % 11 % 3] // according to the result of the hash function:
// 'a'/'A' -> 2, 'i'/'I' -> 1, 'o'/'O' -> 0
& 127 // and forcing it back into [0..127]
: // else (c is either 'z' or 'Z'):
c; // let it unchanged
} // implicit end of for(); end of function
$endgroup$
add a comment |
$begingroup$
C (gcc), 81 76 74 bytes
Similar to my JS answer, with another hash function. Outputs by modifying the input string.
x,c;f(char*s){for(x=1;c=*s;)*s++=c%4<x?x=c:c&1?c+"zx16"[c*3%11%3]&127:c;}
Try it online!
Commented
x, // x is used to test if we've reached a 'p' or a 'P'
c; // c is the current character
f(char * s) { // f = function taking the input string s
for(x = 1; c = *s;) // start with x = 1; for each character c in s:
*s++ = // update the current character and advance the pointer:
c % 4 < x ? // if c is 'p' or 'P' or x was raised beyond 3:
x = c // store c in x and let the character unchanged
: // else:
c & 1 ? // if c is a vowel:
c + // update it to the next vowel in the sequence
"zx16" // by adding either 122, 120 or 14
[c * 3 % 11 % 3] // according to the result of the hash function:
// 'a'/'A' -> 2, 'i'/'I' -> 1, 'o'/'O' -> 0
& 127 // and forcing it back into [0..127]
: // else (c is either 'z' or 'Z'):
c; // let it unchanged
} // implicit end of for(); end of function
$endgroup$
add a comment |
$begingroup$
C (gcc), 81 76 74 bytes
Similar to my JS answer, with another hash function. Outputs by modifying the input string.
x,c;f(char*s){for(x=1;c=*s;)*s++=c%4<x?x=c:c&1?c+"zx16"[c*3%11%3]&127:c;}
Try it online!
Commented
x, // x is used to test if we've reached a 'p' or a 'P'
c; // c is the current character
f(char * s) { // f = function taking the input string s
for(x = 1; c = *s;) // start with x = 1; for each character c in s:
*s++ = // update the current character and advance the pointer:
c % 4 < x ? // if c is 'p' or 'P' or x was raised beyond 3:
x = c // store c in x and let the character unchanged
: // else:
c & 1 ? // if c is a vowel:
c + // update it to the next vowel in the sequence
"zx16" // by adding either 122, 120 or 14
[c * 3 % 11 % 3] // according to the result of the hash function:
// 'a'/'A' -> 2, 'i'/'I' -> 1, 'o'/'O' -> 0
& 127 // and forcing it back into [0..127]
: // else (c is either 'z' or 'Z'):
c; // let it unchanged
} // implicit end of for(); end of function
$endgroup$
C (gcc), 81 76 74 bytes
Similar to my JS answer, with another hash function. Outputs by modifying the input string.
x,c;f(char*s){for(x=1;c=*s;)*s++=c%4<x?x=c:c&1?c+"zx16"[c*3%11%3]&127:c;}
Try it online!
Commented
x, // x is used to test if we've reached a 'p' or a 'P'
c; // c is the current character
f(char * s) { // f = function taking the input string s
for(x = 1; c = *s;) // start with x = 1; for each character c in s:
*s++ = // update the current character and advance the pointer:
c % 4 < x ? // if c is 'p' or 'P' or x was raised beyond 3:
x = c // store c in x and let the character unchanged
: // else:
c & 1 ? // if c is a vowel:
c + // update it to the next vowel in the sequence
"zx16" // by adding either 122, 120 or 14
[c * 3 % 11 % 3] // according to the result of the hash function:
// 'a'/'A' -> 2, 'i'/'I' -> 1, 'o'/'O' -> 0
& 127 // and forcing it back into [0..127]
: // else (c is either 'z' or 'Z'):
c; // let it unchanged
} // implicit end of for(); end of function
edited 17 mins ago
answered 1 hour ago
ArnauldArnauld
76.9k693322
76.9k693322
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%2f180463%2fplay-zip-zap-zop%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