460
\$\begingroup\$

What is the Sandbox?

This "Sandbox" is a place where Code Golf users can get feedback on prospective challenges they wish to post to the main page. This is useful because writing a clear and fully specified challenge on the first try can be difficult. There is a much better chance of your challenge being well received if you post it in the Sandbox first.

To post to the Sandbox, scroll to the bottom of this page or click on the "Add Proposal" link below, and click "Answer This Question". Click "OK" when it asks if you really want to add another answer. Write your challenge just as you would when actually posting it. You may also add some notes about specific things you would like to clarify before posting it. Other users will help you improve your challenge by rating and discussing it. When you think your challenge is ready for the public, go ahead and post it, replace the post here with a link to the challenge and delete it.

See the Sandbox FAQ for more information on how to use the Sandbox.

The Sandbox works best if you sort posts by "active".

Add Proposal

Search the Sandbox

Browse your pending proposals

Get the Sandbox Viewer to view the sandbox more easily

To add an inline tag to a proposal use shortcut link syntax with a prefix: [tag:king-of-the-hill]

\$\endgroup\$
  • \$\begingroup\$ How are tags added to questions? \$\endgroup\$ – guest271314 Jan 9 at 7:51
  • \$\begingroup\$ @guest271314 You can use this markup to create a tag in a draft: [tag:code-golf] \$\endgroup\$ – DJMcMayhem Aug 29 at 15:19
  • \$\begingroup\$ Why no featured anymore? Can't we have it auto-added or something? \$\endgroup\$ – JL2210 Sep 26 at 15:57
  • 1
    \$\begingroup\$ @JL2210 We now have a permanent info box that links to the Sandbox, so the featured tag isn't necessary \$\endgroup\$ – caird coinheringaahing Sep 29 at 13:43

2589 Answers 2589

2
\$\begingroup\$

Base 32 RFC 4648 Compliant Alphabet!

When writing my handy-dandy totp/hotp token implementation in Python and Swift (ad: here), I encountered for the first time RFC 4648. There is a nice and long memo about RFC 4648, but I only had to focus on a very specific part of it: Page 8. If you are bored and want some enthralling reading, you can find this memo here, and a useful table here.

Basically, I was looking for the alphabet that could be used when base 32 decoding a String. Well, this is it: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567, and padding, =. However, simply printing that is not the challenge –– that would be too simple1. Instead, we are going to print this (the comments are for your reference and do not need to be printed):

__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x00 - 0x0F or   0 -  15
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x10 - 0x1F or  16 -  31
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x20 - 0x2F or  32 -  47
__,__,26,27, 28,29,30,31, __,__,__,__, __, 0,__,__,  // 0x30 - 0x3F or  48 -  63
__, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,  // 0x40 - 0x4F or  64 -  79 
15,16,17,18, 19,20,21,22, 23,24,25,__, __,__,__,__,  // 0x50 - 0x5F or  80 -  95
__, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,  // 0x60 - 0x6F or  96 - 111
15,16,17,18, 19,20,21,22, 23,24,25,__, __,__,__,__,  // 0x70 - 0x7F or 112 - 127
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x80 - 0x8F or 128 - 143
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0x90 - 0x9F or 144 - 159
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xA0 - 0xAF or 160 - 175
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xB0 - 0xBF or 176 - 191
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xC0 - 0xCF or 192 - 207
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xD0 - 0xDF or 208 - 223
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xE0 - 0xEF or 224 - 239
__,__,__,__, __,__,__,__, __,__,__,__, __,__,__,__,  // 0xF0 - 0xFF or 240 - 255

There may be trailing spaces after every line, and trailing newlines after the last one.

Also, the single digit numbers can be written as 0[digit] instead of [space][digit]. However, be sure to include the spaces between the four groups.

By the way, the __ actually represent 255, but the former do not make me drown in a sea of digits.


1 Should the challenge be to just print that string?

Any other suggestions to make this challenge more interesting?

\$\endgroup\$
  • \$\begingroup\$ Perhaps get a list of characters (of any length) and print such a table? \$\endgroup\$ – ugoren Jul 29 '17 at 19:14
2
\$\begingroup\$

Is this 2048 board valid?

Some 2048 boards are impossible to get into. For example,

2 _ _ 2
_ _ _ _
_ _ _ _
2 _ _ 2

will never occur in a 2048 game. Additionally, these are all impossible:

8 _ _ 8    8 _ _ _    2 2 2 2
_ _ _ _    _ 8 _ _    2 2 _ _
_ _ _ _    _ _ _ _    _ _ _ _
8 _ _ _    _ _ _ _    _ _ _ _

Your program needs to accept a 2048 board, and return a truthy value if the board is reachable, else falsy.

//Explanation of 2048 goes here.

I've listed 4 different boards that cover major test cases. Are there any others I'm missing?

\$\endgroup\$
  • \$\begingroup\$ hehe, don't forget [tag:sliding-puzzle] \$\endgroup\$ – Stephen Aug 1 '17 at 19:56
  • \$\begingroup\$ As you've stated yourself the main thing missing here is the bulk of the challenge. \$\endgroup\$ – TheLethalCoder Aug 2 '17 at 9:14
  • \$\begingroup\$ I wonder if it suffices to look one step back, or if you need to check if the previous position can itself be produced. \$\endgroup\$ – xnor Aug 4 '17 at 7:35
2
\$\begingroup\$

Smooth Usage [On hold while alternative scoring is considered]

We've all seen CPU usage graphs like this one:

CPU Usage example

Doesn't that look ugly? It would look much nicer as a lovely smooth sine wave...


Challenge

Write a program in the language of your choice that will infinitely produce a regular sine wave in Task Manager's (or Activity Monitor's if that's your thing) CPU usage graph.

You may assume:

  • Background CPU usage is constant
  • Only a single core must display the pattern
  • The system has sufficient cooling to prevent thermal throttling
  • Features such as Intel TurboBoost are disabled

This is tagged as to encourage short answers, but ultimately will be a as I suspect perfect solutions will be hard to come by.

\$\endgroup\$
  • \$\begingroup\$ Related: stackoverflow.com/questions/551494/… \$\endgroup\$ – MTCoster Aug 11 '17 at 15:14
  • \$\begingroup\$ code-golf and popularity-contest don't mix together. You have to choose one or the other, but making it strictly code-golf would be difficult because you'd have to define what is a good enough sine wave, but on the other hand popularity contests are very risky to do. \$\endgroup\$ – dzaima Aug 11 '17 at 15:16
  • \$\begingroup\$ @dzaima That was exactly my dilemma - which would you suggest fits the challenge best? \$\endgroup\$ – MTCoster Aug 11 '17 at 15:17
  • \$\begingroup\$ I'd say a scoring algorithm of some sort would be best for this, no idea how you'd do it. Like the related one was objective. If you could read the word, it was valid. With this, is a bumpy sin-wave a sin-wave? \$\endgroup\$ – Magic Octopus Urn Aug 11 '17 at 20:39
  • \$\begingroup\$ @MTCoster If you're not sure whether popularity-contest fits, then you can be sure that it does not. It is quite difficult to make an well received one. Go with code-golf or make a code-challenge if you can come up with a good own winning criterion. \$\endgroup\$ – flawr Aug 11 '17 at 20:53
2
\$\begingroup\$

Time bomb ping pong


Challenge - Both teams

All users are divided into two teams based on their PPCG ID. For example, my ID can be found here, from which you can see that my ID is 34388. To check on which team you are, run the following snippet:

function update_team(){var e=document.getElementById("user-id").value,t=(document.getElementById("team-result"),"");t=e.match(/^\d+$/)||0===e.length?-1!==even_top_50.indexOf(parseInt(e))?"You are in team: ALPHA":-1!==odd_top_50.indexOf(parseInt(e))?"You are in team: BETA":0==e.length?"":"You are in team: "+(parseInt(e)%2==0?"ALPHA":"BETA"):"ID must be numeric",document.getElementById("team-result").innerHTML=t}var even_top_50=[12012,20260,17602,11259,26997,194,31716,20080,58563,47066,1426,4098,30688,56656,41723,3967,1490,31516,40695,29577,43319,15599,32686,3191,4020,67,34718,41024,7311,39328,16766,7110,31625,2867,59107,52210,16120,6710,68942,10740,9365,84,1147,15,199,7162,1308,3103,26600,59487],odd_top_50=[8478,36398,21487,3808,42545,3852,53748,48934,34388,21348,4162,34531,25180,31414,24877,31957,20469,31343,7416,45941,32014,39242,42963,11006,6828,9498,9288,14215,4198,3544,30164,33208,4372,95,41805,56178,668,47120,30525,55735,51507,57100,6699,737,39022,46855,51939,32700,59376,7209];
.main-header,.main-input,.result{font-family:Montserrat,sans-serif;text-align:center}.main-header{font-size:24px}.main-input{display:block;margin:12px auto auto}.result{margin-top:24px}
<br><div><div class="main-header"> Enter your PPCG ID </div><input class="main-input" maxlength="6" onkeyup="update_team()" id="user-id"> <div class="result" id="team-result"> </div></div>

Each user has two options:

  • Start a new bomb
  • Perform a counterattack

These actions are discussed here:


Start a new bomb

To set up a new bomb, you need to do the following:

  • Create a full program in any free language which has the output X.
  • Create a custom list of characters with a maximum of 10 characters.
  • Select one or more characters from the character list and insert them into your program, which will be having the exact same output X. This ensures that there is at least one crack for your submission.
  • Only reveal the full original program and the character list. Keep the modified program secret. Also keep track of the iteration index, which in this case is 1 (since it's the start of a new bomb).

This is an example of a new bomb submission:


Python 2, 9 bytes (index = 1)

Outputs the number 30.

print 5*6

With as character set 13579/. Try it online!.



Perform a counterattack

To perform a counterattack, you need to do the following:

  • Create a new full program with at least one character inserted from the list given by the opponent, which will have the exact same output X.
  • Create a custom list of characters with a maximum of 10 characters.
  • Select one or more characters from the character list and insert them into your program, which will be having the exact same output X. This ensures that there is at least one crack for your submission.
  • Only reveal the full original program and the character list. Keep the modified program secret. Also keep track of the iteration index, which in this case is the increment of the previous index.

This is an example of a counterattack (using the previous submission):


Python 2, 12 bytes (index = 2)

Defuses Python 2, 9 bytes, Adnan.

Inserts 1, / and 3. Outputs 30:

print 15*6/3

With as character set: +-~58. Try it online!



Scoring system

Every bomb that has not been defused for 7 days gives the team 'index' points. If the index was 4, your team gets 4 points. You are only able to collect the points after you have revealed your own solution. Note that if you do not reveal your solution after the 7 days, it is still vulnerable to cracks.

As for the individual winner of the team, the person with the most cracks of the winning team gets the check mark.


Sandbox notes

  • Note that this is more of an experimental challenge. Unlike the conventional 1 vs 1 cops-and-robbers challenges, this is an attempt on an n vs n-challenge, so I have no idea whether this is a good idea or not.

  • The scoring system is a bit tricky, but I think that when a bomb has 'exploded', the opponent's team gets (index) points. The team with the most points at the end wins. The problem here is that the byte count might make things worse, since a larger program would make cracking the submission harder.

  • A problem I'm finding here is the fact that the cop can create an arbitrarily large program, which makes it almost impossible to crack. I'm not sure whether this actually is a problem, since the 'exact same output'-rule should theoretically take care of this.

  • Perhaps add a third option for the user, where the user defuses a bomb. This would consist of cracking the submission, but does not create a counterattack (for cases when this is impossible, or trivial (like adding comments)).

  • I'm also not entirely sure about the 'choose your own output'-idea. Would this leave too much options for abusement?

  • Is the maximum of 10 character too much / too little? Should this also be taken in account with the scoring?

Thanks in advance!

\$\endgroup\$
  • \$\begingroup\$ Maybe try the wording "one or more" instead of "at least one"? It took me a while to realise that was what you meant. For more meaningful feedback about diffusions/maximums I think you'd have to decide on a scoring mechanism first. Since both teams use the same bombs to advance their score I don't think the byte count think is that big of a problem? \$\endgroup\$ – FryAmTheEggman May 27 '17 at 0:38
  • \$\begingroup\$ @FryAmTheEggman Thank you for your response. I have decided that the score is just simply the sum of all index numbers of the bombs that aren't diffused after three days. This encourages counterattacks more, since the score will increment after each counterattack. \$\endgroup\$ – Adnan May 27 '17 at 9:34
  • \$\begingroup\$ Nice. A never-ending hot potato game. \$\endgroup\$ – Matthew Roh May 29 '17 at 12:27
  • \$\begingroup\$ @SIGSEGV Yeah, that's what it's supposed to be. I should probably set a time limit somewhere, otherwise there will be no winner at all :p. \$\endgroup\$ – Adnan May 29 '17 at 13:07
  • \$\begingroup\$ I'm worried that this could very easily turn into "stay online more than your opposition does", if an answer is given in a language that's very easy to crack. \$\endgroup\$ – user62131 May 31 '17 at 22:47
  • 3
    \$\begingroup\$ 1. Defuse, not diffuse. 2. Three days is not much. A carefully timed post at the start of the weekend could slip through the net. 3. Unless I missed it, there's nothing to prevent the usual CnR-killer crypto answer. Are you absolutely certain that they won't break the challenge? \$\endgroup\$ – Peter Taylor Aug 21 '17 at 12:51
  • \$\begingroup\$ @PeterTaylor Thanks for your response. I have changed the time limit to 7 days. The main problem would indeed still be cryptographic submissions. I tried to decrease the severity of this problem by making sure that the output would remain exactly the same before and after modifying the submission, but I need to experiment a bit with this to see how this would end up. Hashing would almost certainly not be possible, unless a hashing algorithm is cracked (but I'm not 100% certain about this). \$\endgroup\$ – Adnan Aug 21 '17 at 13:06
  • \$\begingroup\$ As for the hashing, this worked for me: "Please, don't "implement RSA" or anything mean to the robbers. Use obscure languages and features, not boring encryption and hashing. I can't enforce this with rules, but you can expect torrential downvotes if all you do is sha(input) === "abcd1234"." \$\endgroup\$ – programmer5000 Aug 24 '17 at 14:33
2
\$\begingroup\$

Conversion: 2 dice from 3


This fascinating video from Matt Parker's standupmaths poses a challenge:

Given the result of rolling 3 indistinguishable (unordered) dice, simulate the result of rolling 2 indistinguishable (unordered) dice.

For the purposes of this challenge, simply returning the sum of 2 dice is not sufficient. Returning 2 ordered dice is acceptable, as the order can be ignored so this still fulfils the requirement.

Input

Either 3 unordered values from 1 to 6, or 3 ordered values from 1 to 6. If the values are ordered, then the output must be independent of the input order. For example, the input 1, 2, 3 should give the same output as the input 2, 1, 3.

These are standard dice. Your code may not assume the values will be from 0 to 5 instead of 1 to 6.

Output

Either 2 unordered values from 1 to 6, or 2 ordered values from 1 to 6. If the values are ordered, then different orderings will be considered equivalent. For example, output 1, 2 is equivalent to output 2, 1.

Given input that matches the probability distribution of rolling 3 dice, the probability distribution of the output must match that of rolling 2 dice.

You can choose to calculate the outputs however you wish, provided that they are deterministic (the same input in any order gives equivalent output). That is, different answers may use different mappings. So for input 1, 2, 3, one answer may give output 4, 5, while another answer may give output 5, 6. Provided all outputs occur in the correct proportions, both answers are valid.

The output must also use standard dice. Your code may not output values from 0 to 5 instead of 1 to 6.

Checking for correctness

One simple but laborious way of checking that the outputs occur in the correct proportions is to consider all 216 possible ordered triples as inputs. This automatically accounts for the fact that the unordered triple 1, 2, 3 is 6 times more likely to come up that the unordered triple 1, 1, 1, since it will occur as 6 different ordered triples (the 6 different ways of arranging 1, 2, and 3).

A valid answer will give the same output (apart from order) regardless of the order of the input, and will give any given double such as 1, 1 for exactly 6 of the ordered inputs, and any given distinct pair such as 1, 2 (equivalently 2, 1) for exactly 12 of the ordered inputs.

Scoring

The original puzzle was asking for an easy way for humans to calculate this in their heads during playing a game. This challenge is instead , so the score is the number of bytes in your code, and the lowest score in a given language wins.

Prior work

This was also posted on puzzling.SE and there are a number of approaches there. Although they are aimed at being human usable, there may be some insights there that are relevant to writing short code.

Test cases

As every answer may use a different mapping, there is no way to generate meaningful test cases for this challenge. The simplest way I can think to test is as described above under "Checking for correctness".


Sandbox questions

  • I've just discovered this previous challenge which is based on the same video. It asks only for the sum of 2 dice, rather than an unordered pair, so is not identical. Is this a sufficient difference to avoid this being a duplicate, and would it be different enough to be worthwhile posting?
\$\endgroup\$
  • 1
    \$\begingroup\$ I don't think it's a dupe, but I'm worried others will. \$\endgroup\$ – programmer5000 Aug 23 '17 at 14:01
  • \$\begingroup\$ Even if it's not officially a dupe I'd still like feedback on whether it's different enough to be interesting. \$\endgroup\$ – trichoplax Aug 23 '17 at 15:45
  • \$\begingroup\$ Looking at the Jelly answer, I think the change required for this question is to remove the final character. So yes, it does fail the dupe test. \$\endgroup\$ – Peter Taylor Aug 23 '17 at 21:35
2
\$\begingroup\$

Is this a valid Takuzu board?

Takuzu is a logic game in which you have to complete a grid with cells containing 0s and 1s. The grid must follow 3 rules:

  1. No three horizontal or vertical cells in a row can be the same.
  2. There must be an equal number of 0s and 1s in each row and column.
  3. No two rows can be the same, and no two columns can be the same.

Let's look at a finished grid:

0011
1100
0101
1010

As you can see, this board follows rule 1, 2 and 3. There are no three horizontal or vertical cells that are the same, all the rows and columns contain an equal number of 0s and 1s, and no two rows and no two columns are the same.

Let's look at a grid that isn't valid:

110100
010011
011010
101100
100011
001101

There's a bunch of problems with this grid. For example, row 5 has three 0s in a row, and column 2 has three 1s in a row, followed by three 0s. Therefore, this is not a valid grid.

Task:

Your task is to make a program which, given a 2D array of n * n 0s and 1s, verifies the board to see if it's a valid, finished Takuzu board.

Examples:

0011
1100
0101
1010

This board follows all the rules, and is therefore a valid Takuzu board. You must return a truthy value for this.

11
00

This is not a valid board - row 1 doesn't follow rule 2. You must return a falsey value for this.

Rules and Specs:

  • You can assume that all boards are square of dimensions n * n, where n is a positive even integer.
  • You can assume that all boards are finished.
  • You may take input as a 2D array containing values signifying 0 and 1, or as a string.
  • You must output consistent truthy and falsey values for truthy and falsey boards, and the values representing "truthy" and "falsey" cannot be the same.

This is , so shortest code in bytes wins!

\$\endgroup\$
  • \$\begingroup\$ 1. "No three horizontal or vertical grids in a row can be the same": there's only one grid. I propose rewording as "No horizontal or vertical line of three cells can be the same". 2. Related: codegolf.stackexchange.com/q/68646/194 , codegolf.stackexchange.com/q/118856/194 . Note that because this question works through a long example before stating very briefly that (in essence) the example is irrelevant to the question, it can very easily mislead people into thinking it's an exact dupe of the second of those related questions. \$\endgroup\$ – Peter Taylor Aug 27 '17 at 16:49
  • \$\begingroup\$ ...also note that the example you run through before giving the task can actually be performed by only using rule (2). \$\endgroup\$ – Jonathan Allan Aug 29 '17 at 6:47
  • \$\begingroup\$ @PeterTaylor Will fix the example and other points, I wasn't active for a while, sorry for the late reply. \$\endgroup\$ – clismique Aug 29 '17 at 6:48
  • 1
    \$\begingroup\$ @JonathanAllan Through fixing PeterTaylor's suggestion I also fixed yours :P \$\endgroup\$ – clismique Aug 29 '17 at 6:53
  • \$\begingroup\$ By "You must output distinct truthy and falsey values for truthy and falsey boards" do you mean "consistent" ones - i.e. the Truthy (falsey) value is to be the same for each time a valid (invalid) board is input? The normal definition of Truthy vs Falsey is language dependent: any values that conditionally evaluate as such (i.e. such that the equivalent of the pseudo-code if myVal then print("True!" else print("False!") works as expected). \$\endgroup\$ – Jonathan Allan Aug 29 '17 at 7:05
2
\$\begingroup\$

Align the Words

Given a list of words l output them as follows:

  • Iterate through l, if it's the first word, output it as usual.
  • If it's not the first word, iterate through this nth word and:
    • Find the first letter of word n that's in word n-1.
    • Align the first occurrence of that letter in word n with the first occurrence in word n-1 and print it on the next line.

Worked Example

Input: [ace,face,please,keep,sheeple]

1: ace

2:  ace
   face

3:  ace
   face
    please

4:  ace
   face
    please
     keep

5:  ace
   face
    please
     keep
    sheeple

[Note: You only print step #5, the rest is to show the process.]

Rules

  • Lowest byte-count wins, this is .
  • All consecutive words in the input list l will have at least 1 letter in common.
    • If the input is invalid, any return is fine (error, nothing, etc...)
  • A word is defined here as a collection of a-z (lowercase ONLY alpha characters).
\$\endgroup\$
  • \$\begingroup\$ Related, not a dupe. \$\endgroup\$ – AdmBorkBork Sep 11 '17 at 18:48
  • \$\begingroup\$ To be clear, are we to output every step along the way, or just the final arrangement? If every step along the way, what's an appropriate separator? \$\endgroup\$ – AdmBorkBork Sep 11 '17 at 19:04
  • \$\begingroup\$ @AdmBorkBork final product, should make that clear I s'pose. \$\endgroup\$ – Magic Octopus Urn Sep 11 '17 at 21:13
  • \$\begingroup\$ Are we allowed to use uppercase only instead of lowercase only as well? Not really relevant for the programming language I usually golf in, but I can imagine it's relevant for some programming languages. \$\endgroup\$ – Kevin Cruijssen Sep 26 '17 at 12:00
2
\$\begingroup\$

100 Letters is the Perfect Amount

Oxford dictionary lists the most commonly used English letters in the following order:

EARIOTNSLCUDPMHGBFYWKVXZJQ

And assigns each the following frequencies:

Distribution of the letters...

For the purpose of this challenge, the diagram will be simplified as follows:

z   1
q   1
x   1
j   1
k   1
v   1
b   2
p   2
y   2
g   2
f   2
w   2
m   3
u   3
c   3
l   4
d   4
r   5
h   6
s   6
n   6
i   6
o   7
a   8
t   9
e   12
TOT 100

Now, onto the task at hand; I've provided you all with a dictionary of words to choose from, using this dictionary of words choose as many as you want to output. However the catch is that you must have EXACTLY the count above of each letter in the output using 7-12 words.


Scoring

  • Your base score is the length of your code in bytes.
  • You are allowed to go over or under on the number of letters required, each letter above or under results in a +5 byte penalty.
  • If the number of words you've used is between 7 and 12, no penalty is incurred.
    • IF it exceeds 12, add 10 bytes per additional word.
    • IF it is less than 7, subtract 5 per missing word.

Rules

  • You may use any word from the provided dictionary.
  • Each word you output must be distinctively separated by either a space or a newline.
  • Once a word combination has been posted, you may not use more than 6 of that answer's words together in a new answer.
    • This will be enforced by post date.
  • This is
  • Your score will be as defined in the scoring section.
\$\endgroup\$
  • 1
    \$\begingroup\$ How can you get a meaningful penalty for going under the number of letters required when you must have AT LEAST the count above of each letter? \$\endgroup\$ – Jonathan Frech Sep 19 '17 at 0:21
  • \$\begingroup\$ Also, who was Kolmognogniznornia? \$\endgroup\$ – Jonathan Frech Sep 19 '17 at 0:22
  • \$\begingroup\$ @JonathanFrech he was the first Aztec man to invent the concept of speech. \$\endgroup\$ – Magic Octopus Urn Sep 19 '17 at 0:30
  • 2
    \$\begingroup\$ I'm not sure this is really kolmogorov-complexity: by design, a good answer will be incompressible. However, finding a good answer is going to involve a heavy computer search, and then the posted answer is going to be a string literal. That seems completely backwards: the interesting code should be what the question asks for. \$\endgroup\$ – Peter Taylor Sep 19 '17 at 7:39
  • \$\begingroup\$ @PeterTaylor was kinda going for something more unique, y'know? Sorta like my "5 favorite letters" challenge. \$\endgroup\$ – Magic Octopus Urn Mar 13 '18 at 20:47
2
\$\begingroup\$

Implement a BrainFlump interpreter

BrainFlump is the latest alternate memory model brainfuck-esque turing tarpit.

It operates on a memory model we call a "Dump", which is simply an un-ordered collection of integers, with a pointer indicating the current item to operate on. As it is "unordered", when moving to the next item, one is simply chosen at random (chosen uniformly between the items that are not the currently selected item) and the operation pointer is moved to that item.

Commands

+   #Increment the item at the pointer
-   #Decrement the item at the pointer
:   #Add a 0 to the dump, and move the pointer to it
;   #Move the pointer to a random item that is not the pointer's current position
(   #Skip to the matching ) if the item at the pointer is 0
)   #Skip to the matching ( if the item at the pointer is not 0
,   #Read a single character from STDIN and push its ascii value to the dump
    #This also moves the pointer to the new item
.   #Print the current item at the pointer modulo 127 as an ASCII character

Interpreter or Compiler?

BrainFlump is an interpreted language. Meaning your submission must take BrainFlump code as input, and return the expected output of the code.

This is as opposed to a compiler, which would take BrainFlump code as input, and return a compiled binary that returns the expected output.

Other notes

  • When the ; command is used if the dump contains only 1 item, a new 0 is pushed to the dump, and the pointer is moved to it
  • The . command does not pop the item from the dump
  • When the , command is used if STDIN has been exhausted, a new 0 is pushed to the dump, and the pointer is moved to it
  • Any item in the dump who's value is 0 is not considered to exist, unless it is the item at the pointer, therefore to "pop" an item from the dump, you simply set its value to 0
  • Nested loops are supported
  • The random number generator used for the interpreter does not have to be cryptographically secure, but must chose with uniformity.
  • BrainFlump does not support floating point numbers or negative integers. Attempting to decrement a number below 0 has no effect.
  • The maximum value of an item in the dump is 255

Examples/Testcases

brainf**k emulation

++++++(;++++++++;-);.

This should output 0

Explanation

++++++        #Increment the first item to 6
(             #While the item under the pointer is not 0
    ;         #Move to another item in the dump
              #    Note the first time this loop runs,
              #    this will insert a new item
    ++++++++  #Increment the new item by 8
    ;         #Switch to another item in the dump
              #    Note there are only 2 items currently,
              #    So this will switch to the only other
              #    item, the one we initially incremented to 6
    -         #Decrement the item
)             #Repeat the loop if the item is not 0
;             #Switch to the other item
              #    Note this switches the pointer back to
              #    The item we have been incrementing by
              #    8 each loop
.             #Output as ASCII character

This is effectively a 6*8 operation, followed by an output, and is nearly identical to brainf**k's ++++++[>++++++++<-]>. program, which also outputs 0.

Note, however, that brainf**k-esque dump manipulation is only deterministically possible if there are never more than 2 items in the dump.

Random output

+:++:+++:++++:+++++:;.

This will actually always output an unprintable character, however which character is output will be random each time, selected from: SOH, STX, EST, EOT, ENQ, ie ASCII characters 1-5. In a correctly implemented interpreter, this output should be uniformly random between the 5 possibilities.

Explanation

+      #Increment first item to 1
:      #Add new item and move to it
++     #Increment new item to 2
:      #Add new item and move to it
+++    #Increment new item to 3
:      #Add new item and move to it
++++   #Increment new item to 4
:      #Add new item and move to it
+++++  #Increment new item to 5
:      #Add new item and move to it
       #    Note this last item is added because ; will
       #    always switch to an item that is *not* the
       #    currently selected item
;      #Switch randomly to an item in the dump
.      #Output as ASCII character

To give a little more info on this, by the time the ; command is reached, the dump should look like this:

1 2 3 4 5 0
          ^

As ; always switches to a different item, the result will be the pointer at one of the non-zero items.

cat

,(.,)

Nice and simple, and identical to brainf**k's cat program.

For scoring purposes, you should use this gist as input when testing.

When will it end?

++++(,:+++++;++(;++++++;--):++++;---)

This program doesn't output anything, but runs for a non-deterministic amount of time.

Explanation

++++             #Increment first item to 4
(                #Start loop
    ,            #Read char from STDIN to new item in dump
    :+++++       #Push 5 to dump
    ;++          #Switch to random item in dump and add 2
    (            #Start loop
        ;++++++  #Switch to random item in dump and add 6
        ;--      #Switch to random item in dump and subtract 2
    )            #End loop
    :++++        #Push 4 to dump
    ;---         #Switch to random item in dump and subtract 3
)

This one is a little tricky, as ; will never switch to a 0 (Remember items with a value of 0 are considered to not exist)

The inner loop will only exit if ;-- switches to a number <= 2

The outer loop will only exit if ;--- switches to a number <= 3

Due to the inherent randomness of the language, this should always terminate... eventually.

For scoring purposes, you should use the exact string Hello, World! as input when testing.

Scoring

This is meaning the interpreter that on average runs the fastest, wins!

Scoring will be determined by running each of the 4 test-cases above 100 times, and determining an average runtime (due to the inherent randomness of the language, a high number of runs should be made to minimise anomalous results).

Then once you have an average for each testcase, sum the 4 times, and that is your final score. Lower is better

\$\endgroup\$
2
\$\begingroup\$

Count bicubic graphs

This question assumes basic knowledge of graph theory terminology.

A cubic graph is a simple graph whose vertices each have exactly 3 edges. A bipartite graph is a vertex whose vertices can be divided into two disjoint sets such that every edge is between a vertex in one set and a vertex in the other set. A bicubic graph is a graph which is both cubic and bipartite.

It is easy to show that a bicubic graph must have the same number of vertices in each of the bipartite halves, so the number of vertices must be even. It is also easy to show that it must have at least six vertices. The only bicubic graph with six vertices (up to isomorphism) is the so-called utility graph or K3,3:

The edges are the Cartesian product of two three-element sets of vertices

Input

A positive non-zero integer n.

Output

The number of bicubic graphs with 2n vertices, up to isomorphism.

Notes

  • The graphs are not required to be connected.
  • This sequence is OEIS A008325. However, hard-coding these values will be considered a breach of standard rules. You may hard-code for inputs of up to 3, but above that the code should follow the same paths and be correct assuming unbounded memory and time for any valid input. It seems unlikely that we will extend the sequence, but it's nonetheless a worthy stretch goal.

Test cases

Input  Output

1      0
2      0
3      1
4      1
5      2
6      6
7      14
8      41
9      157
10     725
11     4196
12     29816

Winning criterion

The fastest program wins. The primary win condition is the largest input for which correct output is given within 10 minutes. In case of ties, the time taken to compute the value for that input will be compared. If the difference is less than 20 seconds, the earlier answer wins.

\$\endgroup\$
2
\$\begingroup\$

All ASCII Art

Input

You will be given a set of x, y, and A pairs, where x and y represent a coordinate on a 2-d plain, and A is some character. You may take these pairs in any convenient format, e.g. a list of lists, three separate lists, a list of pairs of lists, etc.

Output

You will output a grid of spaces. However, at every coordinate specified in the input, the space should be replaced by the character. Basically, the input specifies the locations of characters, and you have to draw them.

Specifics

  • x and y may be either a coordinate or a row-column pair (e.g. the origin can be in the bottom left, with x increasing to the right and y increasing up, or the origin can be in the top left, with x increasing to the right and y increasing down).
  • All characters are guaranteed to be printable ASCII, and will never be a space.
  • x and y are >= 0
  • You may output trailing whitespace (but not infinitely). What matters is that the output visually looks like what the input specified, not the whitespace.

Test Cases

Test cases format (the test cases have the origin at the top left corner; this is optional, see specifics):

# of coordinates
row col char
row col char
...
-----------
output

Test cases:

2
0 0 :
0 1 )
-----------
:)

3
0 0 -
0 1 _
0 2 -
-----------
-_-

4
0 1 -
1 0 |
2 1 -
1 2 |
-----------
 - 
| |
 - 

11
0 0 (
0 1 ^
0 2 o
0 3 ^
0 4 )
1 1 /
1 2 |
1 3 \
2 2 |
3 1 /
3 3 \
-----------
(^o^)
 /|\
  |
 / \

Here is a Java program which can be used to test out inputs

Meta

\$\endgroup\$
  • \$\begingroup\$ Is (0,0) the top-left of the output image? It kinda looks that way from your examples, but that should be made clear. \$\endgroup\$ – AdmBorkBork Nov 3 '17 at 12:30
  • \$\begingroup\$ @AdmBorkBork it is for the test cases, but its meant to be optional... I'll clarify \$\endgroup\$ – Socratic Phoenix Nov 3 '17 at 12:43
2
\$\begingroup\$

RaceTrack Arena KOTH

(haven't come up with a very good title)

this koth is inspired by the pen and paper game Racetrack.

RaceTrack Movement

Racetrack (and this racetrack-inspired koth) use a distinctive vector based movement system.

all bots players are on a square grid.

initially, a cycle (this is what we will call bot players) will have no movement i.e. be completely motionless

However, after a cycle begins moving, it gains inertia; it will not stop moving in this direction unless it acts to stop moving.

On every turn, a cycle can change their speed on each axis (x and y) by -1, 0, or 1, and the same with y speed. this includes sticking with their current speed. This means that every turn, a cycle has 9 options of spaces to move to (excluding spaces which would cause them to crash)

enter image description here

for example, in this diagram, the cycle indicated by the red space, which has just moved from the brown space, has the option of the 9 green squares in the red-lined area, the main, more saturated, green square, along with the blue line, represents where it will end up staying on its inertial course

if, for some reason, the cycle wanted to come to a complete stop, it would take 5 turns, which is the Chebyshev distance between the inertia vector's end and the cycle.

[more tbd obviously]

don't downvote for the lack of content please

\$\endgroup\$
  • \$\begingroup\$ Can (like on the paper) every contestant see the whole arena, including other contestants' movements? As I remember, it's alternative moves rather than simultaneous and you crash if you end up on or cross other contestant's position or most recent motion line. How will the edge be defined? You crash if you end up outside OR if your motion line crosses outside area. Explain the rules in your post. You can have different rules, but if you keep alternative move the starting player will have advantage. So every contestant of this KOTH should have equal number of participation at each position. +1 \$\endgroup\$ – Heimdall Nov 11 '17 at 8:36
  • \$\begingroup\$ We don't know the first player has so much of an advantage; random positions are rather likely to have a much larger effect than the fact that player 1 can strategy steal, and even with non-randomised positions, playing with multiple players is very different in flavour from just two players, since playing against one player, their moves only make themselves better or worse, but in multiplayer another (dumb) player can unwittingly help you or harm you without regard to whether it does help them. Also I haven't decided on whether bots can see the whole playing field or if they have a top speed \$\endgroup\$ – Destructible Lemon Nov 12 '17 at 22:53
  • \$\begingroup\$ ... if there is a limit to their sight, it follows there has to be a limit to their speed, and even if there isn't an implemented, it's at least effectively a limit, since moving somewhere you can't see if there is a wall is not a great strategy. also there will probably be obstacles that act like walls, so the edge is not the only place to crash, btw. anyway, the definition of crash, is that a bot's movement line goes through a hazardous square. I suppose that touching a vortex can be considered a near miss \$\endgroup\$ – Destructible Lemon Nov 12 '17 at 22:55
  • \$\begingroup\$ that said, I guess there's no real reason not to randomise the turn order each game. \$\endgroup\$ – Destructible Lemon Nov 12 '17 at 23:09
  • \$\begingroup\$ Suppose you're the first, whatever your starting position. You accelerate so that you have maximum safe speed. Others won't accelerate to higher speed because that would cause them to crash at the turn (unless, as you put it, a dumb racer decides to overtake you anyway). Let's say the next turn is left. You'll go as far left as possible. Racers on your right will just lag behind. But racers on your left will only be able to keep up until you "cut the corner". They won't be able to stop you from doing so because at no point they will be ahead of you. But maybe some random debris on the path ... \$\endgroup\$ – Heimdall Nov 13 '17 at 10:49
  • \$\begingroup\$ Actually, dumb racing might be a good strategy... If you are allowed to have more than one bot in a race, one can be "dumb" to increase the other one's chances... \$\endgroup\$ – Heimdall Nov 13 '17 at 10:52
  • \$\begingroup\$ @Heimdall that strategy tends to be discouraged. making a simple bot is not, but making bots collude is frowned upon. \$\endgroup\$ – Destructible Lemon Nov 13 '17 at 23:33
  • \$\begingroup\$ So I guess the wall is made by placing a series of hazardous squares, and crashing means you're out of that race only. But how is crash between two racers defined and dealt with? \$\endgroup\$ – Heimdall Nov 16 '17 at 7:12
  • \$\begingroup\$ @Heimdall no offence, but I haven't actually made enough of the spec that I should be answering questions from you in the comments, especially since you have a rather inaccurate idea of the game (because i haven't specified). for example, it's not a race. \$\endgroup\$ – Destructible Lemon Nov 16 '17 at 8:29
  • \$\begingroup\$ Sorry, I'm a bit impatient. It's just I'm looking forward to your game which is still in the making, that's why I gave it +1. I assumed it was a race (or series of races) where the bots compete because it's based on that paper race. Also I was trying to be helpful by raising potential issues in order for the task to be well formed. \$\endgroup\$ – Heimdall Nov 16 '17 at 10:27
2
\$\begingroup\$

Bunnies in (three-dimensional) space

A panicked call has come in from the International Space Station: a psychological experiment has gone awry, and the astronauts have lost all their Stanford Bunnies. You have been tasked to come up with a way to get them as many replacements as possible.

 

a description of the plan

 

Because of the rush, NASA has just one rocket available for this mission: a Delta II Heavy with a box-shaped cargo hold (a "right cuboid", they called it) of length x, width y and height z, all even integers. Your job is finding out how many bunnies to bring - and how to pack them.

Input and output

Your program should take the dimensions of the cargo hold as arguments. It should then compute how many bunnies it can fit in there, producing output as follows:

  • A header line consisting of the length, width and height of the box, as integers, seperated by spaces. This is a copy of the input.
  • A line for every bunny fitted, containing the following as dotted floats, all seperated by spaces:
    • the position of the center of the bunny, relative to the center of the box, as x, y and z
    • the rotation of the bunny, as a rotation about the x, y and z axes, in that order (a.k.a. Tait–Bryan angles).

For example, a solution for a box of 4 × 6 × 8 units, with a single, un-rotated bunny in the center, would be described as follows:

4 6 8
0.0  0.0  0.0   0.0  0.0  0.0

A solution for a larger box of 12 × 8 × 8 units with two bunnies could look like this:

12 8 8
 4.5433 2.5843  1.4380 3.1415 0.0000 0.0000
-2.4839 1.3923 -1.9400 0.0000 0.0000 1.5707

...although your program will likely be able to fit more bunnies.

Dataset

This is the vertex data for the bunny. It is in Wavefront OBJ format, which means that every 'v' line describes a vertex (point in x, y, z space), and every 'f' line describes a triangle of vertices. Compared to the original Stanford Bunny model, this model has been translated so that its centerpoint is at the origin (0, 0, 0) and it fits snugly inside a unit cube.

Tips

  • You don't have to use the dataset above in your program - for example, you might want to simplify it more - but you should make sure that your output is correct when using the 'official' model.
  • Be careful with rounding, both during calculations and when outputting your result.
  • The Wavefront format can be imported into the free blender program if you want to see what it looks like (make sure to choose 'Z Up').
  • Your program does not have to be usable for other models: it can be a special-purpose bunny-fitting utility.

Rules and winner

  • A valid solution is one where, if you constructed a box of bunnies using the solution's description and the vertex data above, none of the bunnies would touch each other or the bounding box.
  • Your program has to be usable for box sizes other than the one below.
  • Your entry should run in less than, say, ten minutes on reasonable hardware.
  • The program must be self-contained: you can only use your language's standard libraries.
  • The winner is the program that succesfully fits the most bunnies in a box of 12 × 8 × 6. Include (a link to) your code, (a link to) a solution for that box size, and, if you made any, a picture of your solution.
\$\endgroup\$
  • 1
    \$\begingroup\$ I'd recommend against Unicode chars in the title. \$\endgroup\$ – Erik the Outgolfer Nov 17 '17 at 22:42
  • \$\begingroup\$ @EriktheOutgolfer Fixed! \$\endgroup\$ – Wander Nauta Nov 17 '17 at 22:43
  • 3
    \$\begingroup\$ Why only allowing the language's standard libraries? That seems like it would ban things like numpy for python, which may be useful for extra math functions. It's a standard loophole for people to make new libraries designed to solve a challenge anyway. \$\endgroup\$ – Rɪᴋᴇʀ Nov 18 '17 at 0:26
  • \$\begingroup\$ Also, is there a tie-breaker if 2 programs find the optimal solution? Shortest code? "Whoever submitted first" is likely fine but seems ugly to me, maybe fastest code? \$\endgroup\$ – Rɪᴋᴇʀ Nov 18 '17 at 0:29
  • \$\begingroup\$ @Riker: I added the self-contained rule to prevent people from grabbing an off-the-shelf implementation for the actual problem, or introduce wild dependencies that make it hard to reproduce results. You're right that numpy is generic enough that it could almost be considered part of the standard library, but I thought I had to draw the line somewhere. Do you think I should remove the rule altogether? \$\endgroup\$ – Wander Nauta Nov 18 '17 at 0:38
  • \$\begingroup\$ @Riker: A naive solution can fit 576 bunnies, and well-thought-out versions will likely score much much more, so I think the chance of two different approaches accidentally getting exactly the same score is quite slim. If there is an optimal solution (I'm actually not sure!) I'd be comfortable letting the first submitter to find it win. \$\endgroup\$ – Wander Nauta Nov 18 '17 at 0:47
2
\$\begingroup\$

Inside or Outside?

Given a point and a polygonial loop that is not self intersecting, determine whether the point is strictly inside or outside of the loop.

Details

  • The polygon is given as an ordered list of points cartesian coordinates.
  • The single point is given as a separate input, but you can also say that is e.g. always the first or always the last point in the list.
  • We only consider points with integral coordinates.
  • You can choose whatever representation is easiest to work with for you for instance a list of pairs, or two separate list for the x- and y-coordinates etc.
  • The list describes the polygon in positive orientation, that means the inside is always on the left side if you follow the points from the beginning to the end of the list. (You may choose to use the opposite orientation but please indicate if you do.)

  • A point is considered to be strictly on the inside, if it is not contained in the border of the polygon.

Examples

[(0,0),(0,2),(2,2),(2,0)]: (1,1) is strictly inside, all other points are outside
[(0,0),(0,2),(2,0)]: no point is strictly inside

more coming soon...

Meta:

  • Should I relax the strictly inside to just inside (i.e. a point on the border is also considered as inside)
  • Should I let the participants choose which version they prefer?
\$\endgroup\$
  • \$\begingroup\$ 1. Not necessarily convex or must be convex? 2. What you describe as "positive orientation" is the same as "in counter-clockwise order". 3. Does the point for testing for inside/outside have integral coordinate? \$\endgroup\$ – user202729 Nov 26 '17 at 14:42
  • \$\begingroup\$ The shape is arbitrary and the testing point does have integral coordinates too (see examples) \$\endgroup\$ – flawr Nov 26 '17 at 14:46
  • \$\begingroup\$ Seems that you flipped what "positive orientation" means. Keep this if that is what you want. / Proposed test case: (0,0),(0,5),(2,2),(5,0) → strictly inside integer points = (1,1),(1,2),(1,3),(2,1),(3,1) where the shape is a concave quadrilateral. \$\endgroup\$ – user202729 Nov 26 '17 at 14:58
  • \$\begingroup\$ Well the first one was incorrect, positive actually means counter clockwise. \$\endgroup\$ – flawr Nov 26 '17 at 19:37
  • \$\begingroup\$ 4. Does the flexiblity in input extend to allowing us to require the first vertex to be repeated at the end of the list? 5. The strictly inside vs inside issue might be best addressed by asking for a classification into strictly inside, on the perimeter, and strictly outside. This is slightly trickier, I think, because of the implication that you can't cast a ray to infinity and just ignore edges which are parallel to it. \$\endgroup\$ – Peter Taylor Nov 27 '17 at 10:37
2
\$\begingroup\$

(No title currently)

Given a natural number N and a natural number K, find a list of natural numbers L such that:

  1. The product of the elements of L is N
  2. Each member of L is less than or equal to K
  3. And the length of L is minimized.

(You can return these numbers in any order.)

Note that:

  • If no such list exists, you program may do anything besides yielding a valid list, including but not limited to:
    • Printing something to stderr
    • Yielding an empty list
    • Yielding a non-list (see below)

If outputting to stdout, you can output a list in any reasonable fashion, such as:

  • Comma-separated: 3, 5, 7
  • With brackets: [3, 5, 7]
  • Whitespace-separated: 3 5 7
  • Your native list representation (3`4`5 or 3 4,5,, etc.)

Test cases (examples)

N, K -> L

32, 2 -> [2, 2, 2, 2, 2]
50, 10 -> [5, 10]
1224, 99 -> [72, 17] or [24, 51]
5, 10 -> [5]
1337, 100 -> []                         (since 1337 = 7 * 191)
1337, 191 -> [7, 191]
42, 8 -> [6, 7]
42, 21 -> [2, 21] or [3, 14] or [6, 7]
1, 2 -> [1]                             (NOT the empty list)
36, 6 -> [6, 6]
36, 9 -> [4, 9]
36, 12 -> [4, 9] or [3, 12]
32, 64 -> [32]
432, 9 -> [6, 8, 9]                     (NOT [2, 6, 6, 6])
216, 8 -> [6, 6, 6]                     (NOT [8, 3, 3, 3])
\$\endgroup\$
  • \$\begingroup\$ (1) I think every instance of number needs to be replaced with natural number. Otherwise 1337, 100 can be satisfied by [sqrt(1337), sqrt(1337)] or [-1, -1337]. (2) Are any of the test cases failed by a greedy approach? If not, can you construct a test case for which a greedy approach fails? (3) What is the correct output for 1, 2? I can make a case for [], but I wonder whether you expect [1]. \$\endgroup\$ – Peter Taylor Nov 29 '17 at 16:10
  • \$\begingroup\$ @PeterTaylor (1) True. (2) I'm not entirely sure. (3) I think I will exclude the empty product as valid output \$\endgroup\$ – Conor O'Brien Nov 29 '17 at 17:19
  • \$\begingroup\$ @PeterTaylor I think 432 would not work with a greedy approach, can you confirm? [2,6,6,6] as opposed to [6,8,9] \$\endgroup\$ – Conor O'Brien Nov 29 '17 at 17:25
  • \$\begingroup\$ Aha. For (2), I think it's worth adding test case 216, 8. The greedy approach would be to say that 8 divides 216 and then split 216/8 = 27 as [3, 3, 3] giving a division into four factors; but [6, 6, 6] is a valid division into three factors. Edit: overlapped with your comment. I think you're attacking a different greedy approach. The more the merrier for test cases. \$\endgroup\$ – Peter Taylor Nov 29 '17 at 17:26
  • \$\begingroup\$ @PeterTaylor I see what you mean, thanks for the help! \$\endgroup\$ – Conor O'Brien Nov 29 '17 at 17:35
  • 1
    \$\begingroup\$ Why can there be a 9 in 432, 8? It violates the second rule. \$\endgroup\$ – NieDzejkob Nov 30 '17 at 21:14
  • \$\begingroup\$ @NieDzejkob Sorry, a typo on my part, thanks! \$\endgroup\$ – Conor O'Brien Dec 2 '17 at 2:19
2
\$\begingroup\$

Show a Chess Piece Range

Write a program or function that, given a set of movement rules, shows the available moves for a fairy chess piece.

Movement Rules:

This will use a slightly modified version of Parlett's Movement Notation:

A number, 1, 2, etc. shows how far a piece can move in a given direction. n indicates any distance, and two numbers separated by a hyphen (e.g. "1-4") means that there is a range of distances that the piece can move. Ranges may be enclosed in parentheses.

Numbers are followed by a direction sign:

  • * - any direction, orthogonally or diagonally
  • + - orthogonally (forwards, backwards, sideways)
  • X - diagonally
  • > - forwards
  • < - backwards
  • = - sideways
  • X> - diagonally forwards
  • X< - diagonally forwards

These directions can be combined, so <> means forwards or backwards, X= means diagonally or sideways, etc. Note that >X means forwards or diagonally, and is different from X>.

This gives us many of the standard chess pieces. For example, 1* is a King's movement, while nX is a Bishop.

There are also "grouping" indicators:

  • / - two numbers (or ranges) separated by a slash indicates a "hippogonal" move, like a knight: a/b means move a spaces orthogonally, and b spaces perpendicular to the first move. These may be enclosed in parentheses.
  • & - repeated movement in the same direction
  • . - "then" - combines two distinct moves, one after another.
  • , - "or" - separates two distinct moves. Only one may be taken on a turn.

The format of a move (not including grouping) is <distance><direction><other>.

Input:

A string showing the movement rules.

Output:

An ASCII representation of an 8x8 chess board with the given piece on the d4 square, with all other accessible squares indicated. For example, given the input n* (a queen), you should output:

...x...x
x..x..x.
.x.x.x..
..xxx...
xxx@xxxx
..xxx...
.x.x.x..
x..x..x.

The output may consist of any three distinct characters.

Examples and Test Cases

Input: (1/2)
Output:
.........
.........
..X.X....
.X...X...
...@.....
.X...X...
..X.X....
.........

Input: 2*
Output:
.........
.........
.X.X.X...
.........
.X.@.X...
.........
.X.X.X...
.........

Input: 2+.1+    (compare to the knight, above)
Output:
.........
...X.....
..X.X....
.X.X.X...
X.X@X.X..
.X.X.X...
..X.X....
...X.....

Input: @1<X>,2-3>=
Output:
...X....
...X....
...X....
..X.X...
XX.@.XX.
...X....
........
........

Input: 1+,2X&
Output:
.......X
........
.X...X..
...X....
..X@X...
...X....
.X...X..
........

This is - shortest code for each language in bytes wins.

Notes/Questions:

I have also considered having the location of the piece be arbitrary, given by another input. Is this a good idea? Does it make the challenge more interesting, or just more complicated without much benefit?

\$\endgroup\$
  • 2
    \$\begingroup\$ Have it variable. It makes it more interesting. \$\endgroup\$ – wizzwizz4 Dec 16 '17 at 19:46
2
\$\begingroup\$

Not-So-Simple Simplex

(Note: should I name it Complex Simplex?)

A simplex is an n-dimensional analog of a triangle. Thus, a 3-dimensional simplex is a tetrahedron. We want to find the number of points with integer coordinates (lattice points) strictly on the interior of this simplex. A point that lies on the boundary is not considered to be in the interior. For example, in a 2-dimensional simplex, any point on its perimeter is not an interior point. In a 3-dimensional simplex, any point on its surface area is not an interior point. In an n-dimensional simplex, any point on its surface n-1-volume is not an interior point.

You are given n + 1 points, each with n integral coordinates. You must output the number of integer points strictly in the interior of this simplex. The simplex is guaranteed to be non-degenerate, that is, it has strictly positive n-volume. If I provide 4 points, for example, you can assume they do not all lie on the same plane.

Test cases:

(0,0), (6,1), (2,5) -> 12 (see picture)

enter image description here

(2,3),(5,2),(3,2) -> 0

More test cases coming when I actually write the program to solve this because drawing the picture of a 4-simplex is a nightmare..

\$\endgroup\$
  • \$\begingroup\$ Winning criteria? \$\endgroup\$ – user202729 Dec 24 '17 at 6:27
  • \$\begingroup\$ Code golf, let me add that. \$\endgroup\$ – rigged Dec 24 '17 at 17:39
2
\$\begingroup\$

Megatanium trading

Your task is to build a javascript function to trade a fictional stock called Megatanium
You start with $1000 and 0 stock of Megatanium

Challenge

This is a challenge, all submissions should be written in

Your function should accept four variables as follows, obviously within your function you can name these whatever you like
- 1st variable represents the current value of 1 bar of Megatanium
- 2nd variable represents your current bank balance
- 3rd variable represents your current stock holding
- 4th variable represents the iteration number

Your function should return an integer representing the size of your desired trade
The return value should be negative if you wish to sell stock, positive if you wish to buy stock, 0 if you wish to neither buy or sell

For example;
If you wish to buy 10 bars of Megatanium at the current price you would return 10
If you wish to sell 5 bars of Megatanium at the current price you would return -5

I will call your function 1000 times. Stock price will always be an integer, chosen at random, with a minimum of 0 and a maximum of 256. Method of selecting the stock price is described in more detail below, it will NOT be an even distribution!

Your bot will be disqualified if it does any of the following at any point

  • Try to buy more stock than it can afford
  • Try to sell more stock than it holds
  • Try to write any value to any of the global variables
  • Fail to return a value
  • Return a value that is not an integer

Here is the code I will be running, the score output at the end will be your bot's score. It is calculated from your bank balance plus the value of your held stock at the latest value.

function go(bot) {
    bank = 1000;
    stock = 0;
    disqualified = 0;
    for (i=1; i<=1000; i++) {
        price = prices[i];
        trade = window[bot](price, bank, stock, i);
        if (trade !== parseInt(trade)) disqualified = "INVALID TRADE";
        bank = bank - (price * trade);
        stock = stock + trade;
        if (bank < 0) disqualified = "RUN OUT OF MONEY";
        if (stock < 0) disqualified = "TRIED TO SELL STOCK YOU DIDN'T OWN";
        if (disqualified) break;
    }
    if (disqualified) {
        console.log("Disqualified on iteration " + i + " REASON: " + disqualified);
    }
    else {
        score = bank + (stock * price);
        console.log(bot + " scores " + score);
    }
}

The function for generating a suitable distribution of random values is a slightly modified version of the function described here
Every bot will be given the same set of prices, but the set will not be generated until immediately before the bots are run.

function randn_bm() {
    var u = 0, v = 0;
    while(u === 0) u = Math.random();
    while(v === 0) v = Math.random();
    w = Math.floor(Math.sqrt( -2.0 * Math.log( u ) ) * Math.cos( 2.0 * Math.PI * v ) * 32) + 128;
    while (w < 0 || w > 256) w = randm_bm();
    return w;
}
prices = [];
for (i=1; i<=101; i++) {
    prices.push(randn_bm());
}

Completion

You may submit as many bots as you like, try to be inventive with your algorithms! You may use a global variable called data, this will be initially set to null and will always be available to your function.

Example bots

function buyBot(p,b,s,i) {
    /* Bot always buys as much as it can */
    return Math.floor(b / p);
}

function randomBot(p,b,s,i) {
    /* Bot buys and sells randomly */
    if (Math.random() > 0.5) {
        return Math.floor(Math.random() * (b / p));
    }
    else {
        return -Math.ceil(Math.random() * s);
    }
}

function smartBot(p,b,s,i) {
    /* Bot always buys at under 100 and sells at over 150 */
    if (p < 100) {
        return Math.floor(b / p);
    }
    else if (p > 150) {
        return -s;
    }
    else {
        return 0;
    }
}

function bankruptBot(p,b,s,i) {
    /* Bot always sells at under 100 and buys at over 150 */
    if (p > 150) {
        return Math.floor(b / p);
    }
    else if (p < 100) {
        return -s;
    }
    else {
        return 0;
    }
}

function alternateBot(p,b,s,i) {
    /* Bot buys and sells alternately */
    if (data == 1) {
        data = 0;
        return Math.floor(Math.random() * (b / p));
    }
    else {
        data = 1;
        return -Math.ceil(Math.random() * s);
    }
}

Winning conditions

All bots will be run on locally by me approximately 1 week after the question is posted (date will be decided when question is posted, no point setting a date in sandbox)
Winner will quite simply be the bot that has the highest final score after the last iteration, as calculated by the function provided above. The array of prices used will be published after a winner has been crowned.
There are no set conditions on the speed of your function, but please be fair and try to avoid anything that will take more than a couple of minutes to execute

\$\endgroup\$
2
\$\begingroup\$

Note: Please leave an upvote if you think the challenge idea is good and is clear, a downvote if you think the challenge idea is bad, and comment if you can't understand the challenge. Last time I asked on TNB 2 users told me that they can't understand anything.


Golf a return-oriented code generator!

Background

Return-oriented programming (ROP) is a computer security exploit technique that allows an attacker to execute code in the presence of security defenses such as non-executable memory (W xor X technique) and code signing. (from Wikipedia)

Challenge

In this challenge, you should write a program, that takes the code of the existing program and the required code, and output the stack necessary to execute that program.

Rules

  • Standard loopholes apply, as usual.
  • How the machine works
    • At first, IP is equal to the top of the stack, and the top of the stack is popped.
    • For each clock cycle (whatever it means), the command at the position of IP is executed, and the IP is advanced if the command does not modify IP.
    • The behavior if the IP is at the last instruction and that instruction does not modify IP is undefined.
  • Assembly instructions
    • All commands are case insensitive.
    • Note: There is nothing that guarantees commands must be 3 characters long, or limited to some sets. After all, this is not real assembly. However:
    • You can assume that all the characters are in the English alphabet, uppercase or lowercase.
    • There may be some other commands "similar but not the same" with ret, so checking for the first character or the SHA256 hash won't work.
    • The special command ret will pop the value on the top of the stack, and set the instruction pointer IP to that value.
    • You may assume that all the other commands won't modify the stack, or the IP.
    • The "existing program" and "required code" will be represented as a string, separated by newline characters (you may optionally take a list of strings as input).
    • The required code will never contains ret.
    • The output should be a stack of line-numbers in appropriate format (list of numbers - may be reversed, array of numbers, etc.)
    • The command executed right after the last command in the "required code" must be a ret.
    • Because the memory of the machine is limited, you should output the shortest possible stack. If there are multiple shortest stack, output any.
  • You may assume that there exists an output.

Example test cases:

  • Existing program:
1:  add eax, ebx
2:  lea eax, [2*eax+4*ecx]
3:  ret
4:  mov eax, ebx
5:  xch ecx, eax
6:  ret

(the line numbers are just for demonstration purposes. They are not included in the input, you can use 0-indexing or 1-indexing)

(disclaimer: this is not real assembly, just for demonstration purposes)

  • Required code:
lea eax, [2*eax+4*ecx]
xch ecx, eax
mov eax, ebx
xch ecx, eax

In that case, you should output [2, 5, 4] (2 is at the top of the stack), because if the stack have that value, then:

  • First, IP = 2.
  • The commands
2:  lea eax, [2*eax+4*ecx]
3:  ret

are executed.

  • On executing ret, the IP get the value 5. Then, the commands
5:  xch ecx, eax
6:  ret

are executed.

  • Then, similarly, when the next ret is executed, the value 4 is popped from the stack, and commands
4:  mov eax, ebx
5:  xch ecx, eax
6:  ret

are executed.

Therefore, the commands executed (apart from ret) are:

2:  lea eax, [2*eax+4*ecx]
5:  xch ecx, eax
4:  mov eax, ebx
5:  xch ecx, eax

which is equal to the "required code".

Winning criteria

This is , shortest code in bytes win!

\$\endgroup\$
  • \$\begingroup\$ You should probably include a list of all valid identifiers or if all of them are always 3 characters mention that and whether there are instructions that begin with r other than ret. \$\endgroup\$ – ბიმო Jan 28 '18 at 18:57
  • \$\begingroup\$ @BMO Better now? \$\endgroup\$ – user202729 Jan 29 '18 at 12:00
  • \$\begingroup\$ No idea what the alphabet ØA;Øa¤ is but apart from that I think you made it pretty clear now. Other things that came to mind: What if there are multiple possibilities for a shortest stack (eg. like this)? Will the input always have a solution (eg. unlike this)? And are the line numbers part of the input? If so is it safe to assume that they always start with 1 and have an offset of 1? Maybe you could add some testcases. \$\endgroup\$ – ბიმო Jan 29 '18 at 12:52
2
\$\begingroup\$

Faux Compress a String

Given a string s, perform a faux compression on it. Below is an example with f('hello world').


To faux compress a string, start by taking a frequency count of all letters.

hello world -> [h:1, e:1, l:3, o:2, :1, w:1, r:1, d:1]

Next, sort smallest to largest in count with a tie-breaker of ASCII-code.

[ :1, d:1, e:1, h:1, r:1, w:1, o:2, l:3]

Next, in the original string, replace each letter with it's index in the frequency list.

[3,2,7,7,6,0,5,6,4,7,1]

Next, convert each integer to binary, and join them all with the digit 2, then convert this to base-3.

1121021112111211020210121102100211121 -> 240591504997661290

Lastly, print or return both this number and the sorted keyset of the frequency map.

[240591504997661290, ' dehrwol']

Is the final result.

You now have a "faux compressed" string.


To get a real compressed string you'd figure out the shortest sequence of bits to replace 2 with which would be a unique delimiter and treat the binary digits as they are, bits, instead of bytes.


More Examples

000000000001 -> [58839486765, '10']
eeEeeeeeeeeeeEEEEEeeeeee -> [16508589985213004629636, 'Ee']

Rules

  • Your code's function may be undefined if the following is not met:
    • The string may not start with the least frequent character.
    • The string will contain more than one unique character.
  • Lowest byte count wins because this is .

PSA: I have many PENDING PROPOSALS, tell me which to delete.

If you post a comment on any of these challenges with the words "This isn't good in my opinion."

It will be removed.

\$\endgroup\$
  • \$\begingroup\$ The posted one by MDXF. \$\endgroup\$ – user202729 Feb 3 '18 at 5:28
2
\$\begingroup\$

Casinos and Gamblers

You either play as a casino, or as a gambler. Casinos offer bets, and gamblers choose bets to take. Casinos want to make money, gamblers want to have more money than others. Read that sentence again, it is the core concept here.

A game is made up of 100 turns, 10 casinos, and 10 gamblers. Gamblers start with 1000 dollars, casinos start with 0. A turn consists of:

  1. All casinos simultaneously comes up with a Bet. A Bet consists of three parts:
    1. Entry Fee (Positive integer amount a gambler must pay to take)
    2. Odds (The chance that a gambler will win between 0 and 1)
    3. Reward (Positive integer amount a gambler is given if he wins). This can be any amount, even if it would make the casino go negative.
  2. Each gambler optionally chooses a bet to take. They must have enough money to pay for the Entry Fee.
  3. We calculate who wins and who doesn't (using a PRNG), and pay out.

At the end of a game, we give points as follows:

  1. Casinos receive 1 point for each dollar they have (can be negative)
  2. Gamblers receive N^2 points for having more money than N other gamblers.

A tournament consists of many games, and a player's score is their average score across all of the games.

Gamblers and Casinos all have complete information throughout the game.

\$\endgroup\$
  • \$\begingroup\$ Might want to specify that entry fee and reward must be positive (negative/negative games map to positive/positive games but complicate the "can this gambler afford this game" calculation.) \$\endgroup\$ – histocrat Jan 31 '18 at 19:34
  • \$\begingroup\$ I have a hunch that 100 dollars won't give quite enough granularity for casinos to work with. Maybe bump it up to 10,000? \$\endgroup\$ – Beefster Feb 2 '18 at 23:09
  • \$\begingroup\$ Also, how are odds represented? Fraction? Floating point number? Precision? \$\endgroup\$ – Beefster Feb 2 '18 at 23:10
  • \$\begingroup\$ @Beefster Floating point, of course. I think you may be right, but 10,000 seems too high. I think I'll do 1,000 \$\endgroup\$ – Nathan Merrill Feb 3 '18 at 0:06
2
\$\begingroup\$

Busier Beaver

Cops

You will write two programs in a language of your choice

  • A public program: This program must execute in a finite amount of time. So it can not go on indefinitely (although there is no time limit). It also wise if you program it to output a large number of bytes to standard output. This is the what you post in your answer. You must also post the programming language.
  • A secret program: This program must output more bytes than the public answer, i.e. it is a busier beaver. It also must not go on indefinitely. It also can not be longer than the public program. You do not post it the answer immediately. After one week, if no robber has cracked the answer, you edit it in.

For these programs, you may assume that numerics types are actually unbounded, i.e. that overflow never occurs. This means that you can store, for example, Graham's number in a variable. It also means that finding the maximum value of storage capacity of a numeric type results in an error.

If no robber has cracked your answer, your score is equal to (length of public program)/(length of secret program), which you are trying to maximize. In case of ties, the longer public program wins.

Robbers

The cops will post a public program. Your job is to find a busier beaver. That is, you need to find a program that outputs more bytes to standard output than the cops program. It can not go on indefinitely, and can not be longer than the public program (although it can be the same length).

You get points equal to (length of cops public program)/(length of your program) for each post you crack.

\$\endgroup\$
  • \$\begingroup\$ Need to specify that it's the number of bytes output when given no input. \$\endgroup\$ – Peter Taylor Feb 16 '18 at 11:38
2
\$\begingroup\$

Indices of inner join ()

Given two lists of integers x and y of possibly unequal lengths, return the list of pairs (i, j) such that the ith element of x is equal to the jth element of y.

The output consists of a vector of pairs or a pair of vectors (the zip of the other option, may be useful for languages without pair data structure). The pairs may be given in any order, and using 0-based or 1-based indexing.

In pseudo-code: (this returns two lists of indices, assumes 1-based indexing, and gives lexicographically sorted output)

input vector<int> x, vector<int> y
vector<int> xout, yout;
for (i in 1 to length(x)) 
  for (j in 1 to length(y))
    if (x[i] == y[j]) {
      add i to end of xout;
      add j to end of yout;
    }
return xout, yout;

This is code-golf so answers will be scored in bytes with fewer bytes being better.

Test case 1

x = [5, 1, 1, 2], y = [5, 1]
-> xout = [1, 2, 3]

(5, 1, 1 each appears once in y)

-> yout = [1, 2, 2]

(the first position appears once in x, the second twice)

Reshuffling the pairs is okay:

-> xout = [2, 1, 3]
-> yout = [2, 1, 2]

Test case 2

x = [2, 2, 2, 3, 3], y = [4, 2, 2, 2]
-> xout = [1, 1, 1, 2, 2, 2, 3, 3, 3]

(each of the three first positions finds three matches in y)

-> yout = [2, 2, 2, 3, 3, 3, 4, 4, 4] 

Improvements and clarifications are very welcome!

\$\endgroup\$
  • \$\begingroup\$ It should be ready to post now. The sandbox is not very active (not many people know about it), so even sandboxed posts may not have sufficient feedback. \$\endgroup\$ – user202729 Feb 20 '18 at 2:29
  • \$\begingroup\$ "The output consists of a vector of pairs or a pair of vectors" seems unnecessarily restrictive. The semantically correct return type in languages which support it would be a set of pairs, and while that may not be the golfiest I don't see a reason to prohibit it. \$\endgroup\$ – Peter Taylor Feb 20 '18 at 12:15
2
\$\begingroup\$

Number of Adjacently Divisible Partitions of n

Output the following sequence (OEIS A167865):

1, 0, 1, 1, 1, 1, 2, 1, 2, 2, 2, 1, 4, 1, 3, 3, 3, 1, 5, 1, 5, 4, 3, 1, 6, 2, 5, 4, 5, 1, 9, 1, 6, 4, 4, 4, 8, 1, 6, 6, 7, 1, 11, 1, 8, 8, 4, 1, 10, 3, 10, 5, 8, 1, 11, 4, 10, 7, 6, 1, 13, 1, 10, 11, 7, 6, 15, 1, 9, 5, 11, 1, 14, 1, 9, 12, 8, 5, 15, 1, 16, 9, 8, 1, 18, 5, 12, 7, 10, 1, 21, 7, 13, 11, 5, 7, 12, 1, 14, 12, 15, 1, 20, 1, 14, 17, 9, 1, 18, 1, 21, 10, 17, 1, 19, 5, 14, 14, 7, 6, 22, 3, 14, 9, 12, 8, 25, 1, 18, 13, 17, 1, 24, 8, 16, 21, 11, 1, 23, 1, 22, 6, 12, 7, 19, 7, 15, 19, 11, 1, 28, 1, 21, 17, 18, 11, 27, 1, 16, 10, 18, 6, 28, 1, 18, 25, 9, 1, 25, 5, 29, 19, 18, 1, 27, 14, 20, 8, 11, 1, 30, 1, 31, 15, 21...

Number of partitions of n into distinct parts greater than 1, with each part divisible by the next.

Definition:

a(0) = 1

\forall n>0: a(n) = \sum {a(\frac{n-k}{k}) : k>1 \land k \mid n}

Task:

Choose one of the three options:

  • Output the sequence indefinitely.

  • Take n as input and output the n first elements of the sequence.

  • Take n as input and output the nth element of the sequence. Both 0- and 1-based indices are allowed, but please specify which one your answer uses.

Hint: There is a simpler formula than the one used on OEIS and in this post. It may save you some bytes (it saved six bytes on a simple reference implementation I made in Python). I'll add it here later.

This is , so the shortest answer in bytes wins.

\$\endgroup\$
  • \$\begingroup\$ I'm not sure about having three different output methods, when one even changes the input required. Almost looks like 3 different challenges. Maybe you could make it so that if no input is given output sequence indefinetely, and if input is given output option 2 or 3. \$\endgroup\$ – Brian H. Jan 25 '18 at 10:03
  • \$\begingroup\$ @BrianH. I saw a few sequence challenges allow to choose from these three output methods, and it seemed to work. Here's one such challenge: codegolf.stackexchange.com/q/152402/61405 \$\endgroup\$ – Steadybox Jan 25 '18 at 10:32
  • \$\begingroup\$ True, i wonder if there's a Meta question about this, can't seem to find one \$\endgroup\$ – Brian H. Jan 25 '18 at 10:54
  • \$\begingroup\$ @BrianH. I don't think there's a meta question for this particular issue, but I think it at least partly falls under allowing flexible input. \$\endgroup\$ – Steadybox Jan 25 '18 at 11:19
2
\$\begingroup\$

Sum on a Fenwick Tree!

Background Information: What is a Fenwick Tree?

A Fenwick tree is a way of representing the prefix sums of an array of numbers (basically, it makes it easy to get the sum of a contiguous run of numbers). While a normal array has O(1) access time, O(1) modification time, and O(n) summation time, a Fenwick tree has O(log n) access time, O(log n) modification time, and O(log n) summation time.

Note that a Fenwick tree actually works with any commutative binary operation in terms of getting the running values up to that value.

I won't go into details about exactly how Fenwick trees work, but basically you have the following pseudocode implementations for the two operations modify and sum (accessing the nth element is the same as doing sum(1 .. n) - sum(1 .. n-1)).

func modify(index, change) # index points to the value in the represented array that you are modifying (1-indexed); change is the amount by which you are increasing that value
    while index <= len(fenwick_tree)
        fenwick_tree[index] += change
        index += least_significant_bit(index)

func sum(count) # sum(n) sums the first n elements of the represented array
    total = 0
    while index > 0
        total += fenwick_tree[index]
        index -= least_significant_bit(index)

least_significant_bit(x) := x & -x

Challenge

Given the Fenwick tree for an array a and an integer n, return the sum of the first n values of a; that is, implement the sum function given as an example.

Reference Implementation

A reference implementation in Python for both the make_tree and sum functions is provided here.

Test Cases

[6, 6, 3, 20, 8, 12, 9, 24, 8, 12], 6 -> 32
[6, 4, 3, 36, 1, 8, 3, 16, 5, 4], 3 -> 7
[2, 10, 1, 4, 4, 2, 0, 32, 1, 14], 4 -> 4
[7, 8, 4, 36, 9, 0, 0, 8, 1, 4], 5 -> 45
[3, 0, 7, 12, 4, 18, 6, 64, 6, 14], 6 -> 30
[3, 4, 3, 28, 5, 6, 8, 40, 1, 8], 9 -> 41
[4, 8, 8, 4, 0, 18, 7, 64, 0, 12], 7 -> 29
[9, 0, 6, 16, 8, 14, 5, 64, 3, 18], 0 -> 0
[3, 14, 7, 12, 2, 6, 5, 0, 7, 18], 2 -> 14

Rules

  • Standard Loopholes Apply
  • This is , so the shortest answer in bytes in each language will be considered the winner of its language. No answer will be marked as accepted.
  • You may take the two inputs in any order and the list in any reasonable format.
  • You may assume that the integers in the tree are all non-negative.
  • No input validation - the index will be non-negative and at most the length of the Fenwick tree
  • You may assume that all values (in the list, as the index, and the output) will be at most 232-1

Happy Golfing!


Sandbox

  • Is my explanation of a Fenwick tree sufficient enough that most people can understand it?
  • Are my test cases sufficient?
  • Any more tag suggestions?
\$\endgroup\$
  • \$\begingroup\$ your tests cases appear correct \$\endgroup\$ – ngn Mar 2 '18 at 2:31
  • \$\begingroup\$ @ngn Yay, thanks. I'll remove that from the footer then; I was asking because earlier in a CMC my values were apparently really wrong because I was doing something dumb :P \$\endgroup\$ – HyperNeutrino Mar 2 '18 at 2:40
2
\$\begingroup\$

Minimal dot matrix adressing

Consider a typical dot-matrix LED module. The LEDs are addressed in rows and columns. A LED will light up iff the voltage on the row R it's on is high (1), and the column C it's on is set to low (0). For example,

1  | 0 1 1 0 
0  | 0 0 0 0 
0  | 0 0 0 0 
1  | 0 1 1 0 
^  +---------
R C> 1 0 0 1 

In other words, state of the LED at the rth row and cth column will be r AND NOT(c).

To make arbitrary images, different parts of the matrix are lighted up sequentially. In other words, the sequential frames form the final image through element-wise OR. For example (adressing row-by-row)

| 1 0 0 1    Frame 1: R=[1 0 0 0]', C=[0 1 1 0]
| 0 1 0 0    Frame 2: R=[0 1 0 0]', C=[1 0 1 1]
| 0 0 1 0    Frame 3: R=[0 0 1 0]', C=[1 1 0 1]
| 0 0 1 0    Frame 4: R=[0 0 0 1]', C=[1 1 0 1]
+--------

However, a more efficient way would be to address the third and fourth row together in a single frame, Frame 3: R=[0 0 1 1]', C=[1 1 0 1]. This way, we can address the entire display in only three frames.

Your task is to make a program or function that outputs the required frames to display an arbitrary dot-matrix, using as few frames as possible.

Input

A binary square matrix taken in any of the default input methods in any convenient format. To allow for submissions taking the input as bytes, the size of the matrix will always be a multiple of 8.

Output

A minimal set of frames that addresses only the required LEDs, using any of the default output methods in any convenient format. This includes outputting bytes or hex representations rather than vectors of 1s and 0s.

Testcases

Note: the output given is just one way of addressing the matrix. There may be many different options; however, your solution must not use more frames than these examples.

Testcase 1

   Binary:                            Hex:    
   0 0 0 0 0 0 0 0                    00
   0 1 1 1 1 0 0 0                    1E
   0 1 1 1 1 0 0 0                    1E
   0 1 1 1 1 0 0 0                    1E
   0 1 1 1 1 1 0 0                    3E
   0 0 0 0 1 1 0 0                    30
   0 0 0 0 0 0 0 0                    00
   0 0 0 0 0 0 0 0                    00

Frame 1: R=[0 1 1 1 1 0 0 0]', C=[1 0 0 0 0 1 1 1]; (hex: R=1E, C=E1)
Frame 2: R=[0 0 0 0 1 1 0 0]', C=[1 1 1 1 0 0 1 1]; (hex: R=30, C=CF)

Testcase 2 

   Binary:                            Hex:
   1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    0001
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0    0FF8
   0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0    0FF8
   0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0    0FB8
   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1    FFFF
   0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0    0FF8
   0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0    0FF8
   0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0    0FF8
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    0000
   0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1    8000 

Doable in 6 frames.

Make sure your submission also handles a matrix of all ones and all zeros (both of course can be handled in a single frame).

\$\endgroup\$
  • \$\begingroup\$ So if I understand correctly, the sequence of frames are composed elementwise by an OR? \$\endgroup\$ – Giuseppe Mar 8 '18 at 17:26
  • \$\begingroup\$ @Guiseppe Yes. I'll edit that in! \$\endgroup\$ – Sanchises Mar 8 '18 at 19:04
2
\$\begingroup\$

Minimal viable file corruptor

Your totally legal ROM collection, as vast as it may be, has started feeling a bit mundane recently. Why not spice it up a notch? Write a program that takes in the following arguments:

  • The first (inclusive) and last (exclusive) bytes between which the corruption will occur (indexing can start from either 0 or 1, as long as it's consistent)
  • n, the distance between bytes to be corrupted (1 = all bytes, 2 = every second byte, etc.)
  • i, the increment value
  • Path or contents of the file to be corrupted

and saves or outputs a modified version of the file where every nth byte in the specified range has been incremented by i. In case of an overflow, take the modulo 256 of the number. If saved as a file, the path can be anything but the input one (unless you've appended something to it or whatever). You wouldn't want to lose your legally-acquired ROMs, would you?

Examples:

File:   00 01 02 03 04
Start:  0
End:    5
n:      1
i:      7
Output: 07 08 09 0a 0b

File:   ff ff ff ff ff ff ff ff
Start:  2
End:    5
n:      1
i:      1
Output: ff ff 00 00 00 ff ff ff

File:   00 00 00 00 00 00 00 00 00 00
Start:  3
End:    8
n:      2
i:      16
Output: 00 00 00 10 00 10 00 10 00 00

You want as much space as possible for your most definitely not pirated files, so shortest bytecount wins.

TODO: clarify the rules a bit? also another example or two

\$\endgroup\$
  • 2
    \$\begingroup\$ Operating on files seems to be quite more complex than choosing not to do so, especially since there is the added restriction to save the new file with a different name. I suspect noone would choose to work with files. My suggestion is to either make it mandatory as part of the challenge (it's fine if your challenge is not solvable with some languages) or remove that option entirely. \$\endgroup\$ – Leo Mar 25 '18 at 10:36
2
\$\begingroup\$

That's MY Program Now

Given the previous answer in the chain, write a program that outputs that program.

The start of this challenge will be the following Brain-flak program:

Brain-Flak, 148 bytes

(((((((((((()()()()){}){}){}()))){}{}())[][][][])[][])[[]]())[[][][][][]]())([([]([])[][]{})]()()()([[]](([()()()]([([][][])](((({}()){}))){}{})))))

Try it online!


Scoring

Your answer will be scored based on the size of the previous answer in comparison to your answer. You are aiming to maximize your score (the max being 1, the minimum allowed is -10).

To get your answer's score:

1-[Your Answer's Bytecount]/[Previous Answer's Bytecount]

The highest possible score will be 1, which means an empty program outputs the previous program (if this ever happens, the challenge is over). Your score can be negative, and you shouldn't see this as being a bad thing, it is what it is. The minimum allowable score, however, is -10. No Lenguage answers or answers that would destroy the challenge.


Example

1. 05AB1E, 149 bytes (Score -0.0067)

"(((((((((((()()()()){}){}){}()))){}{}())[][][][])[][])[[]]())[[][][][][]]())([([]([])[][]{})]()()()([[]](([()()()]([([][][])](((({}()){}))){}{})))))

Try it online!

But, the score of this program would be awful (negative even -0.0067). However, don't let a bad score dissuade you from competing if your goal is to make it a bit more difficult for the next person to attempt the challenge. Conversely, if your goal is to post a trivial answer, try not to gunk up the challenge too much.


Answer Format

#<Answer #>. <Language Name>, <N Bytes> (<Score>)

<Code>

TIO Link (If Possible)

Rules

  • No language may be reused until there have been 20 answers.
    • This is arbitrary to version number, E.G. you cannot use Python 2 if 3 has been used.
  • You may not post a second answer until 2 other people have answered after you.
  • If you and another person submit the same answer #, use timestamps to decide who deletes.
    • (or marks "non-competing").
  • Your post may have a negative score (E.G. Java will probably be negative).
    • Your score may not exceed -10.
  • PRNG, Encryption and any form of hashing is explicitly banned (E.G. gzdeflate).
  • This is , but the best score will be considered the winner.
    • The scores can be used as a decider for best answer though (if I choose to).

Sandbox question: Could this be a cops and robbers answer chaining question where the cops are trying to reduce the size while the robbers are trying to increase it? If cops get to 1 or less bytes before robbers can fill a TB HDD, one wins.

\$\endgroup\$
  • \$\begingroup\$ I'm not sure it's a good idea to make people delete their post just because somebody posted right before them. Maybe they should instead indicate that their post is no longer part of the chain? Maximizing the score will take a lot of hard work, especially since there's no opportunity to edit once the next answer has been posted, and having to delete your answer might be very frustrating. \$\endgroup\$ – R.M Mar 27 '18 at 14:00
  • 1
    \$\begingroup\$ I think it would be a good idea to keep people from chaining of their own answers. Seems abusable. \$\endgroup\$ – Kamil Drakari Mar 27 '18 at 15:04
  • \$\begingroup\$ @KamilDrakari it is abusable. Think CSPRNGs. \$\endgroup\$ – NieDzejkob Mar 27 '18 at 15:25
  • \$\begingroup\$ @NieDzejkob That remains an issue though; the intermediate answer might simply wrap the previous one in a print statement and would remain highly compressible for the user with the key. \$\endgroup\$ – Dennis Mar 27 '18 at 15:27
  • \$\begingroup\$ @Dennis Yeah, actually this seems to be a bigger problem. \$\endgroup\$ – NieDzejkob Mar 27 '18 at 15:29
  • \$\begingroup\$ related. (That idea's on hold for the moment as I have a busy week of travel. I probably won't post it if you post this first.) \$\endgroup\$ – Nathaniel Mar 27 '18 at 19:48
  • \$\begingroup\$ @NieDzejkob I forgot that rule, nice catch. I was pretty much copying the OEIS one. \$\endgroup\$ – Magic Octopus Urn Mar 27 '18 at 22:20
  • 1
    \$\begingroup\$ Isn't it the same as this one? \$\endgroup\$ – Weijun Zhou Mar 28 '18 at 2:12
  • \$\begingroup\$ @Dennis any better? \$\endgroup\$ – Magic Octopus Urn Mar 29 '18 at 18:17
  • \$\begingroup\$ Better. I'd explicitly ban encryption, hashing, and PRNG though. Marking invalid answers non-competing isn't enough by the way. Our policy is to delete them anyway. \$\endgroup\$ – Dennis Mar 29 '18 at 18:36
2
\$\begingroup\$

Polyglot in a box

Output the smallest bounding rectangle that fits around your code, with the border being of a different character than the inside.

For example, if your code is

ab
c  d


e

then the smallest bounding box is 7x6 since the code fits right in

######
#ab  #
#c  d#
#    #
#    #
#e   #
######

Hence, a valid output is

######
#    #
#    #
#    #
#    #
#    #
######

(note how the border # is different from the inside ).

and the bounded area is 5 × 4 = 20.

Summary

  • Output the smallest bounding rectangle your code fits in

  • The border should be of a different character than the inside, neither can be newlines

  • Only trailing/leading newlines are allowed, nothing else should be in the output

  • Output to STDERR is ignored, and your program should not take any input

  • Submissions must be full programs, functions are not allowed

  • 0-byte programs are not allowed

  • The program must run in at least 2 different programming languages and output the same bounding box in each one of them

Score

This is a , so your program has to run in at least 2 different programming languages. Each of these languages must output the bounding box for the entire program. The winner is the submission with the most languages, with the bounding area (smaller is better) being the tie-breaker.

\$\endgroup\$
  • \$\begingroup\$ I probably already know the answer, but it's not 100% clear from your current example since the box is 6x6: are the boxes always squares, or can the also be rectangles? I.e. if the e in your example would be one line lower, would the box be 6x7 or 7x7? \$\endgroup\$ – Kevin Cruijssen Mar 29 '18 at 19:52
  • 1
    \$\begingroup\$ @KevinCruijssen I have edited the example so that it is no longer a square, so the box would be 7x6 \$\endgroup\$ – Kritixi Lithos Mar 29 '18 at 20:00
  • \$\begingroup\$ Hard to define what language is different when requiring a same result \$\endgroup\$ – l4m2 Apr 3 '18 at 8:16
  • \$\begingroup\$ @l4m2 so what do you suggest? \$\endgroup\$ – Kritixi Lithos Apr 6 '18 at 8:39
  • \$\begingroup\$ @Cowsquack I don't quite know. Previous polyglot require different behavior on different language to force different language \$\endgroup\$ – l4m2 Apr 6 '18 at 10:38
2
\$\begingroup\$

I can't understand Jelly chains!

or...

Expand Jelly chains

(see this for more details). Which one do you prefer?


Jelly chain separator is a very powerful feature. Unfortunately, it's not very easy to understand. So, we need a program (or function, as usual) to rewrite a Jelly link that uses chain separator (øµðɓ) to one that doesn't.

Specification (incomplete)

I am really bad at explaining things, so if you have any idea how to make this better, feel free to edit the post.

A link (often line of code) consists of chains. * The chains are separated by chain separators øµðɓ. * If the first character is a chain-separator, the part right before it is not considered a chain. In other words, chains can't be empty. * The arity of each chain is determined by the chain separator right before it. In particular, ø -> arity 0, µ -> arity 1, ð -> arity 2. ɓ will be discussed later. * If there are no chain separator before it (it's the first chain) its arity is equal to the link's arity.

A chain consists of atoms, potentially modified by quicks. * Each quick affects the atom(s) right before it. How many atoms it takes is quick-dependent.

Given that:

  • A link that contains exactly one chain with arity equal to its arity is functionally equivalent to that chain.
  • A link reference is functionally equivalent to that link. (more about link reference quicks later)

  • A chain containing atoms a1, a2, ..., an is functionally equivalent to a link containing chains c1, c2, ..., cn if for all integer i, 1 ≤ i ≤ n, ai has the same arity and is functionally equivalent to ci.

Chain reference

The quicks £ŀĿ ¢Çç Ññ refer to (call) other links:

  • £Ŀŀ must have a number n right before it, and call the (n-1)%(l-1)+1th link (1-indexing) as a nilad, monad or dyad, respectively. Where l is the number of links in the program, and % denotes modulo - the result has the same sign as the divisor.

    In reality, the link right before it can have any arity, but for the purpose of this challenge, it's simpler to assume it must be a number. For example:

    • calls the first link as a nilad.
    • 0Ŀ calls the second-to-last link as a monad.
    • If the program has 6 links, calls the second link as a dyad, because (7-1)%(6-1)+1 = 2.
  • ¢Çç call the link right before the one that it appears in as a nilad, monad or dyad respectively. If one of those quicks appear in the first link, it calls the main (last) link.

  • Ññ call the link right after the one that it appears in as a monad or dyad respectively.

I don't think that anyone would choose to use one of those quicks (¢ÇçÑñ) instead of £Ŀŀ, but imaginary point if you do.


For example: Consider the link Cð+×µH, called with arity 1. Its structure is

+---+╔══════╗┏━━━┓
|┏━┓|║╔═╗╔═╗║┃┏━┓┃
|┃C┃|║║+║║×║║┃┃H┃┃
|┗━┛|║╚═╝╚═╝║┃┗━┛┃
+---+╚══════╝┗━━━┛

It contains 3 chains: * The first one doesn't have any preceding chain separator, therefore it's variadic. When executed it is monadic (because the link is) * The second one is dyadic, and the third one is monadic.

A possible non-chain-separator version is:

C
+×
ÑçH

which has the structure

+---+
|┏━┓|
|┃C┃|
|┗━┛|
+---+
+------+
|╔═╗╔═╗|
|║+║║×║|
|╚═╝╚═╝|
+------+
+---------+
|┏━┓╔═╗┏━┓|
|┃Ñ┃║ç║┃H┃|
|┗━┛╚═╝┗━┛|
+---------+

Because the Ñ refers to the first link C and the ç refers to the second link , this is equivalent to the original version.


Now the hard part: Quicks taking chains as input.

Because all the quicks that need to be considered always take exactly 1 atom as input, the only rules is * If the quick is right after a chain separator, it will take the previous chain. * Otherwise it will take whatever stands right before it, either [an atom] or [something that has been modified by a quick].

For example: Consider the link +/Hµ€ with arity 1. Its structure is

┏━━━━━━━━━━━━━━┓
┃+------------+┃
┃|+---------+ |┃
┃||┏━━━━┓   | |┃
┃||┃╔═╗ ┃┏━┓| |┃
┃||┃║+║/┃┃H┃|€|┃
┃||┃╚═╝ ┃┗━┛| |┃
┃||┗━━━━┛   | |┃
┃|+---------+ |┃
┃+------------+┃
┗━━━━━━━━━━━━━━┛

As you can see, the takes the +/H as input because it is right after the chain separator µ. All the variadic chains have arity 1.

Another example: ABð€CDµ€EFµGHµ€ -->

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓             
┃╔════════════════════╗      ┃             
┃║╔═════════════════╗ ║      ┃┏━━━━━━━━━━━┓
┃║║+---------+      ║ ║      ┃┃┏━━━━━━━━━┓┃
┃║║|+------+ |      ║ ║      ┃┃┃┏━━━━━━┓ ┃┃
┃║║||┏━┓┏━┓| |┏━┓┏━┓║ ║┏━┓┏━┓┃┃┃┃┏━┓┏━┓┃ ┃┃
┃║║||┃A┃┃B┃|€|┃C┃┃D┃║€║┃E┃┃F┃┃┃┃┃┃G┃┃H┃┃€┃┃
┃║║||┗━┛┗━┛| |┗━┛┗━┛║ ║┗━┛┗━┛┃┃┃┃┗━┛┗━┛┃ ┃┃
┃║║|+------+ |      ║ ║      ┃┃┃┗━━━━━━┛ ┃┃
┃║║+---------+      ║ ║      ┃┃┗━━━━━━━━━┛┃
┃║╚═════════════════╝ ║      ┃┗━━━━━━━━━━━┛
┃╚════════════════════╝      ┃             
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛             

Yes, that's a lot of levels to nest a chain. Note that the chain formed by ABð€CD has arity 2 because it is after a ð.

TODO need to have more explicit rules

This can be converted to non-chain-separator equivalent form


Rules

  • There are no 2 consecutive chain separators.
  • There are no trailing chain separators.
  • There can be at most 1 leading chain separator, indicates the arity of the first chain. If omitted, equal to the arity of the link.
  • (so, no non-empty useless chain)
  • It's guaranteed that the first non-chain-separator character is not a .

  • You can use either the UTF-8 encoding or the value in the Jelly single byte character set, where ø: 0D, µ: F9, ð: 08, ɓ: 8B, ¢: F1, Ç: FE, ç: 07, Ñ: 00, ñ: 0B, £: F2, Ŀ: B7, ŀ: DE. The characters @0123456789 has the same ASCII value. (You can use this script to get character value)

    Note: Should I allow submissions to use either of them, or should I enforce one? Because using single byte input/output is often shorter for most other languages, except Jelly in UTF-8 mode.

Input/output

  • Input given: A link (of chains) with atoms, chain separator øµðɓ and the quick, with its arity (0, 1, or 2)

    You can assume that there is no newline (or other quicks) in the input, and that all of the øµðɓ€ in the input are interpreted with its usual meaning. For what are their "usual meaning", see rules above.

  • Output: Multiple links (separated with newlines of course, but is also acceptable), containing £ŀĿ ¢Çç Ññ €@, but must not contain øµðɓ.

Test cases

arity link > output (or output)*
1 HHH > HHH or HHH¶Ç or HHH¶1Ŀ
2 HHH > HHH or HHH¶ç or HHH¶1ŀ
1 Cð+×µH > +׶CçH or C¶+׶H¶1Ŀ2ŀ3Ŀ
0 123µ+ø456 > 0 123¶+¶456¶1£2ŀ3£
2 ɓ+ > +@ or +¶ç@ or +¶1ŀ@
1 S‘µ€ > S‘¶Ç€
1 S‘µ€€€IIµ€€ > S‘¶Ç€€€II¶Ç€€ or S‘¶1Ŀ€€€II¶2Ŀ€€

(note: real Jelly code are not that verbose, that is only for demonstration purposes)

\$\endgroup\$
  • \$\begingroup\$ This should definitely help learning Jelly! Also congratulations on being a sandbox challenge which makes the total number of proposed challenges (not including deleted ones) 2018 in the year 2018. \$\endgroup\$ – Weijun Zhou Mar 12 '18 at 16:26
  • 1
    \$\begingroup\$ "Is this part clear enough?" - No. You make an assumption of a knowledge of Jelly that the majority of us don't have. This challenge needs to be fleshed out a lot more, explaining exactly what we need to do. \$\endgroup\$ – Shaggy Mar 12 '18 at 17:24
  • 2
    \$\begingroup\$ In other words, be self-contained. \$\endgroup\$ – Weijun Zhou Mar 12 '18 at 17:40
  • \$\begingroup\$ @Shaggy Yes I know, hence the "TODO Rules" part. \$\endgroup\$ – user202729 Mar 13 '18 at 0:53
  • \$\begingroup\$ As someone who's never coded in Jelly, I think "A link is a list of chains" should be near the top. That, and perhaps a note about what quicks, atoms, and hypers are. \$\endgroup\$ – ngn Mar 14 '18 at 21:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .