561
\$\begingroup\$

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

Sandbox FAQ

Posting

To post to the sandbox, scroll to the bottom of this page 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, though you can optionally add a title at the top. 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, and replace the post here with a link to the challenge and delete the sandbox post.

Discussion

The purpose of the sandbox is to give and receive feedback on posts. If you want to, feel free to give feedback to any posts you see here. Important things to comment about can include:

  • Parts of the challenge you found unclear
  • Comments addressing specific points mentioned in the proposal
  • Problems that could make the challenge uninteresting or unfit for the site

You don't need any qualifications to review sandbox posts. The target audience of most of these challenges is code golfers like you, so anything you find unclear will probably be unclear to others.

If you think one of your posts requires more feedback, but it's been ignored, you can ask for feedback in The Nineteenth Byte. It's not only allowed, but highly recommended! Be patient and try not to nag people though, you might have to ask multiple times.

It is recommended to leave your posts in the sandbox for at least several days, and until it receives upvotes and any feedback has been addressed.

Other

Search the sandbox / Browse your pending proposals

The sandbox works best if you sort posts by active.

To add an inline tag to a proposal, use shortcut link syntax with a prefix: [tag:king-of-the-hill]. To search for posts with a certain tag, include the name in quotes: "king-of-the-hill".

\$\endgroup\$
0

4333 Answers 4333

1
28 29
30
31 32
145
2
\$\begingroup\$

Smallest integer divisible by 2..n

Given an integer n, output the smallest integer divisible by 2,3,4,...,n inclusive.

Example

2520 is divisible by every integer from 2 to 10.

Scoring

Shortest code in bytes wins.

Sandbox

  • Dup?
  • Better Wording?
  • Restrictions/Rules?
\$\endgroup\$
3
  • \$\begingroup\$ So just lcm(2..n)? \$\endgroup\$
    – FlipTack
    Dec 31, 2016 at 12:18
  • \$\begingroup\$ you're right. would be marked as dup I guess :D \$\endgroup\$
    – Seims
    Dec 31, 2016 at 13:09
  • \$\begingroup\$ Actually, I don't think there's been challenges exactly like this before. I wouldn't call it a dupe. \$\endgroup\$
    – FlipTack
    Dec 31, 2016 at 14:41
2
\$\begingroup\$

Pseudoku Cops and Robbers King of the Hill

(I know that another user, @NathanMerrill, is proposing a similar contest. I started playing with the idea for this type of contest independently yesterday, but have since chatted with in The Nineteenth Byte. He is currently undecided on the type of puzzle to use and has some different ideas on how to evaluate participants' performance, so I feel comfortable proposing my idea as a separate challenge.)

Sudoku is a well-known logic puzzle. It is a puzzle of four nines: nine rows of cells, nine columns of cells, nine 3x3 adjacent and distinct blocks of cells, and nine values that any cell can have. A valid Sudoku arrangement or solution is one in which every row, cell, and block has all nine values exactly one time. For example, consider the following valid solution:

+-----+-----+-----+
|4 6 1|5 7 3|2 8 9|
|5 7 8|2 1 9|4 6 3|
|3 2 9|6 8 4|1 7 5|
+-----+-----+-----+
|9 8 4|7 6 2|3 5 1|
|7 5 6|3 4 1|9 2 8|
|2 1 3|9 5 8|7 4 6|
+-----+-----+-----+
|8 3 5|1 2 7|6 9 4|
|6 9 7|4 3 5|8 1 2|
|1 4 2|8 9 6|5 3 7|
+-----+-----+-----+

These are turned into puzzles by removing many of the values in the arrangement in such a way that all blanks are mirrored horizontally and vertically across the puzzle and so there is only one valid way to fill in the blanks to get a valid Sudoku solution. For the above puzzle, this might look like this:

+-----+-----+-----+
|4    |     |2 8  |
|  7  |  1  |    3|
|    9|    4|1    |
+-----+-----+-----+
|     |7 6  |3 5 1|
|     |     |     |
|2 1 3|  5 8|     |
+-----+-----+-----+
|    5|1    |6    |
|6    |  3  |  1  |
|  4 2|     |    7|
+-----+-----+-----+

Someone who wished to play this Sudoku puzzle would then use the information provided to find the original solution.

Sudoku has some interesting properties that allow it to be generalized to similar puzzles with different rules that are sometimes called "Pseudoku" (which is pronounced the same way as the actual puzzle, SOO-DOE-KOO, so please stop saying SOO-DOO-KOO). For our purposes, we will make two differences. First, it may be possible to generate harder puzzles by removing the restriction for symmetric removals. The following is a valid puzzle by Sudoku rules, so why not allow it?

+-----+-----+-----+
|4   1|  7  |2    |
|5    |2   9|     |
|3    |  8  |     |
+-----+-----+-----+
|  8 4|7   2|    1|
|     |3   1|  2  |
|     |     |     |
+-----+-----+-----+
|     |     |6    |
|  9 7|     |     |
|1    |     |5 3  |
+-----+-----+-----+

Second, Sudoku's properties allow us to define games with different sizes. You can define a Pseudoku game with a parameter N where the resulting board has N^2 rows, N^2 columns, N^2 blocks of size NxN, and N^2 values for each cell. Standard Sudoku would be a Pseudoku variant with N=3. So the following would be a valid Pseudoku(2) game:

+---+---+
|1  |   |
|   |  3|
+---+---+
|  1|4  |
|4  |   |
+---+---+

and an example Pseudoku(4) game:

+-----------+-----------+-----------+-----------+
|11         |      10  4| 1     9   | 2       16|
| 6     5   |   15  1   |    3     2|12  8      |
|10    13 14|         12| 5       15| 4     7   |
| 2  3      |    6    13|       8 11|    5    10|
+-----------+-----------+-----------+-----------+
| 7 11 12  9|14        2|16  1  4   |           |
|           |   10  4   |          3|13    16 11|
| 4       10|   16    15|   12      |          6|
| 1 16  2   |11  3      |   10     8|           |
+-----------+-----------+-----------+-----------+
| 3        2|       6   |13         | 5 14     1|
|    7      |          5|           |           |
|   13 14  4|12    16   |           | 8  9      |
|    5 16   |13     9   | 4     2  1|           |
+-----------+-----------+-----------+-----------+
|14 12     7|           |   15     4|11     6   |
|    9      | 6         |11 16      |       3   |
|      11   | 8 13     1| 3 14      |    7      |
|13     8   | 7    11   | 2         |      15   |
+-----------+-----------+-----------+-----------+

Since Sudoku is NP-complete, so is Pseudoku. That means that it gets more difficult to solve a Pseudoku puzzle the larger N gets. However, it can take more time to generate Pseudoku puzzles than it does to solve them, since the naive algorithm for generating a puzzle requires solving the puzzle each time a value is removed! Solving Pseudoku puzzles is fun, but if it takes longer to generate them than it does to solve them, it becomes more work than play.

So help me out! I propose a Cops and Robbers style King of the Hill. The Cops will compete by writing programs to generate lots of Pseudoku puzzles to consume as much time as possible for solving, while the Robbers will compete by writing programs to solve Pseudoku puzzles to consume as little as time possible solving these puzzles.

I need some help ironing out the format, but here is what I have so far:

  1. I will provide a Java framework for running the contest. This framework will connect to clients by TCP/IP so contestants can choose whatever language they want to write their Cops and Robbers (so long as I can run them on my system). I will also provide a basic Cop and Robber for these users to try out to see what sorts of times they take. I will publish the times they generate on my system so contestants can estimate how their entries will run on my system.

  2. I will give each Cop ten minutes to generate as many Pseudoku(N>= 3) puzzles as they can, but they should be able to generate at least Pseudoku(N=4) puzzles. They can choose what sizes they want the puzzles to be, but they have to be valid with exactly one solution. My server will naively check each one to guarantee their validity; any Cop that generates an invalid puzzle is disqualified. I recommend configuring the Cop programs to be parameterized externally so that Robbers can test their code against basic Cop configurations, but then the Cops can send me secret, optimized configurations before the contest completes for their actual execution. I will provide a couple days after the deadline ends for conferring with the Cop programmers if their settings do not work as expected on my system. Cops should generate different puzzles every time with reasonable expectations; that means no spamming with the same puzzle repeatedly or reading pregenerated puzzles from a file system, Internet source, or internal cache. In addition, I don't want to see a Cop that uses the same removal pattern for every puzzle (that may not guarantee valid puzzles, anyway).

  3. Each Robber will be tested against each puzzle generated by the Cops. The Robber will have to generate the correct solution for each puzzle as quickly as possible. I will probably need to see some timings before I make a final decision, but each Robber will be capped with some amount of time to solve a puzzle (maybe an hour?) before the time-to-completion defaults to twice that cap. These Robbers will be permitted to use any technique for solving the puzzles that my system supports except for packet sniffing. I am on the fence as to whether the Robbers will be on an honor code to not study Cop code since I plan to have secret parameterizations anyway.

  4. All the times for all the puzzles will be sorted from least to greatest and then assigned an index as one would in a Mann-Whitney U test. Each Cop and Robber will be scored using the sum of the indices of their contributions: Cops for the times the Robbers spent solving their puzzzles, and Robbers for the times they spent solving puzzles. The winning Cop will have the highest sum and the winning Robber the lowest. Cop ties will be broken first by the average time required to solve one of its problems (more is better), then by the number of puzzles generated (more is better), then by the name I deem cooler (here's hoping that doesn't happen). Robber ties will be broken first by the average time spent solving puzzles, then by the sum of the time, then by the standard deviation, then by the cooler name.

  5. This scoring scheme poses an interesting challenge to Cops: balancing the size of the problems (and the likely amount of time needed to solve them) against the number of problems generated. A Cop that generates only one puzzle that no Robber can solve in the time limit is likely to lose to another Cop that generates many moderate problems. Similarly, a Cop that spams many small problems is likely to be beaten by another Cop that generates fewer problems of larger sizes. Since the official contest configurations should be kept secret until the contest starts, other Cops can study the other programs to try to determine what their opponents are likely to do and plan accordingly.

I am interested in any and all feedback that the community might have about this challenge.

\$\endgroup\$
9
  • \$\begingroup\$ I pronounce Pseudoku as SOO-do-ku and Sudoku as soo-DO-ku, to align with the pronunciation of Pseudo. \$\endgroup\$
    – Pavel
    Jan 6, 2017 at 0:22
  • \$\begingroup\$ I don't know if you'll get a lot of submissions. Sudoku is a bit difficult to program. Also, TCP-IP is not something people are used to using for their submissions. \$\endgroup\$
    – mbomb007
    Jan 6, 2017 at 16:25
  • \$\begingroup\$ It is? Well, part of what I am looking for is whether people would participate. I would need at a minimum two Cops and two Robbers or there is no point. Could people comment saying whether they would play and whether they would play as a Cop, a Robber, or both? \$\endgroup\$
    – sadakatsu
    Jan 6, 2017 at 17:17
  • \$\begingroup\$ The scoring system you've chosen adds a large incentive to submit a huge number of programs that are almost identical to your own submission but slightly worse. This means that if some opposing programs generate some puzzles that are harder than yours and some puzzles that are easier (which is likely), you'll push the easy ones right down the leaderboard, making your programs look better in comparison. \$\endgroup\$
    – user62131
    Jan 6, 2017 at 17:47
  • \$\begingroup\$ Good point. This can be resolved by a "one-submission-per-category" rule. \$\endgroup\$
    – sadakatsu
    Jan 6, 2017 at 18:07
  • \$\begingroup\$ If you want, I have some code that can help you communicate with submissions (over standard in/out). However, I think the best solution is to run the cops' submission and kill it after 10 minutes. They should write each sudoku puzzle as a file, which you would then read.. I also wouldn't worry about automated checking to see if the puzzles are valid. I generally assume good faith in these types of challenges, unless it becomes an issue. \$\endgroup\$ Jan 6, 2017 at 18:33
  • \$\begingroup\$ Re: validation... there's a problem here. For it to make any sense, I would need to have at least as good a solver as the best Robber entry, in which case someone would just copy mine in a faster language than Java. I think I would still require a unit testing protocol where I pass solutions to the Cops, the Cops return problems, and then I validate that they sent unique puzzles. \$\endgroup\$
    – sadakatsu
    Jan 6, 2017 at 18:45
  • \$\begingroup\$ Re: standard input/output versus sockets... I don't get the aversion to network programming. I used TCP in my Speed Clue contest a couple years ago, and it worked great (though I admittedly had few entries). So long as I guarantee an environment for the contest (probably Linux), even C/C++ developers can write code with platform-specific libraries if they wish. Using networking also allows a good method for timing responses: I start the clock once I get the ACK after sending a command, and I stop the clock after I ACK that I received a response. File dumping makes timing Cops difficult. \$\endgroup\$
    – sadakatsu
    Jan 6, 2017 at 18:50
  • \$\begingroup\$ 1. I don't think you've taken account of how badly things scale. It's easy to spit out valid pseudokus for N=100; validating them in a reasonable time requires supporting every rule which the cop knows. 2. The stuff about secret parameterisations doesn't really make sense to me. Taken to extremes, that could mean that we make the actual generation code the "parameterisation" and the cop "program" is just an eval. 3. The cop/robber setup means there's inherently a submission deadline. That's generally a bad thing, but even more so with something which can get extremely complicated. \$\endgroup\$ Jan 10, 2017 at 15:49
2
\$\begingroup\$

broken keyboard workaround

|nspired by BASTA´s song and memories from earlier work:

Your keyboard is broken but there is some urgent work you have to complete; you have no back^up hardware - and the shops are closed so you can´t buy a new keyboard!

All you have left to work with is your mouse.

6iven two texts as input (the one you have and the one you want to have), create a program or function that tells you the cut, copy&paste actions that will turn the one text into the other.

Using the mouse is strenuous, so you don´t want too many cut/copy/paste actions. Keep your output as short as possible.

Remember: Your keyboard is broken = you can´t use any characters in your code that you don't have ~ you must get alon9 with those that are provided in th1s {["te%t"]}. For7unately your keyboard 7ook qu17e a wh1le 7o bre4k down c0mpletely 4nd y0u used numb3rs 4nd sp3c*4l ch@r$ t0 r3pl@c3 br0k3n l3773r$; $0 y0u $h0uld h@v3 m0$7 0f 7h3m @v@*l@bl3.

Also, you don´t want to do too much C&P to cre8 your code, so keep that as short as possible, too.


  • You can assume that the second text contains no characters that are not present in the first text.
  • You can pick any input format and method that is convenient for you; but the output format should match that. (e.g. if you take input from files, output should also go to a file).

NOTES

Note that the challenge description contains all letters and digits except j and z. If you absolutely need them: they are hidden in the YouTube link. (I didn´t check for upper/lower case though.)

Curlys, brackets, braces, single and double quotes and all operators I could think of are there, so the challenge should be fine for most languages that use printable ASCII.

Still trying to find a more fluent way to include curlys, brackets, double quotes and circumflex, though.

I thought there was a tag [string-manipulation]; but couldn´t find it in the list.

I think about dropping the "output method should match input method" restriction.

\$\endgroup\$
2
  • \$\begingroup\$ Try [tag:code-golf] and [tag:restricted-source] \$\endgroup\$ Jan 9, 2017 at 16:49
  • \$\begingroup\$ The part of your question with weird characters in it is a bit hard to read. Maybe tone it down a bit. Also, some examples would be helpful for understanding the challenge. \$\endgroup\$
    – mbomb007
    Feb 1, 2017 at 4:51
2
\$\begingroup\$

Find B1nar0 Solutions

B1nar0 puzzle is a paper and pencil game with 0 and 1. The goal is to fill the grid accoring to 3 rules :

  1. No more than 2 consecutive 0s or 1s
  2. Each row/column has half 0s and half 1s
  3. No identical row/columns

Example :

[1]

  • A is 0 according to rule 1
  • B is 1 according to rule 1
  • C is 0 according to rule 2
  • D is 1 according to rule 2
  • etc.

Edit : Grids are square grids of even size (4, 6, 8, 10, 12 or 16 are usual sizes).

Input : Any binary grid (array or string) with 0,1 and any other character you want for empty cells.

Output : Same format as input but filled with a correct grid.

Test case (see GIF)

0 11
  0 
 0  
1 1 
\$\endgroup\$
7
  • \$\begingroup\$ Are the grid dimensions always 4x4 ? \$\endgroup\$
    – Arnaud
    Jan 17, 2017 at 8:14
  • \$\begingroup\$ Non, any even number should fit, generally 4-6-8-10-12 or 16 games. \$\endgroup\$
    – Crypto
    Jan 17, 2017 at 8:16
  • \$\begingroup\$ Nice challenge, but I suggest you add some test cases for the larger grid sizes too. Also, may we assume that we will get input that makes it possible to solve the puzzle? For instance not: [[1,1,1, ],[ , , , ],[ , , , ],[ , , , ]]. Can we assume that there will only be one valid solution? For instance, not an empty grid. \$\endgroup\$ Mar 9, 2017 at 14:22
  • \$\begingroup\$ Also, the 6x6 test case is a lot harder than the 4x4. The 4x4 can be solved going through the matrix checking the different rules one after the other. To solve the 6x6 grid you need an algorithm that's a lot more sophisticated. Do you require that the program should be able to solve any input, regardless of the difficulty. Even if it requires brute-forcing the solution (which may take a loong time for a 16x16 matrix \$\endgroup\$ Mar 9, 2017 at 14:22
  • \$\begingroup\$ Then you should add a few 10x10, 12x12 and 16x16 test cases (with solutions). Requiring that submissions can solve all possible boards regardless of difficulty makes this a really hard challenge. You should also impose a time limit. Otherwise I can just write a script that checks all possible combinations and claim that it will eventually find the right solution \$\endgroup\$ Mar 9, 2017 at 14:22
  • \$\begingroup\$ I added the comments I had on the post when it was on main. Some of them are a bit out of context now, but I guess you remember what they're about. :) \$\endgroup\$ Mar 9, 2017 at 14:23
  • \$\begingroup\$ Nice challenge, but I suggest you add some test cases for the larger grid sizes too. Also, may we assume that we will get input that makes it possible to solve the puzzle? For instance not: [[1,1,1, ],[ , , , ],[ , , , ],[ , , , ]]. Can we assume that there will only be one valid solution? For instance, not an empty grid \$\endgroup\$ Mar 9, 2017 at 14:23
2
\$\begingroup\$

Enthusiastically Russianify a String

Greetings Comrades,

Many of you may have interacted with people from Russia on the internet at some point, and a subset of you may have noticed the slightly odd method they have of expressing themselves.

e.g. деинсталляция игра нуб))) - (forgive the google translate)

where the ))) are added for emphasis on the previous statement, I have been working on a theory that the ratio of )'s to the rest of the string is directly proportional to the amount of implied emphasis, however I oftentimes find it difficult to compute the ratio on the fly, as I am also trying to cope with a slew of abuse, so I would like the shortest possible code to help me calculate what the resulting string should be, for a value of enthusiasm between 0 and 500%, given the original, unenthusiastic string, this will aid my research greatly as i will not have to type out bulky scripts every time I wish to test my hypothesis.

so, the challenge:

write a full program or function, which, provided two arguments, a string of unknown length, and a number, in either integer format (between 0 and 500) or in decimal format (between 0 and 5, with 2 points of accuracy) will

  • return the original string, suffixed with a number of )'s
  • the number will be the calculated as a ratio of the input number to the string length.
  • so if the number 200, or 2.00 was provided, 200% of the string must be suffixed as )'s
  • the number of brackets rounded to in decimal situations does not matter.
  • script is required to support Printable ASCII characters.
  • only has to support one input number format, of your choice.

examples:

"codegolf" 125      = codegolf))))))))
"codegolf" 75       = codegolf))))))
"noob team omg" 0.5 = noob team omg))))))
"hi" 4.99           = hi!)))))))))))))))

example code (powershell) (with decimal input):

Function Get-RussianString ([string]$InputStr,[decimal]$Ratio){
    $StrLen = $InputStr.Length
    $SuffixCount = $StrLen * $Ratio
    $Suffix = [string]::New(")",$SuffixCount)
    return $InputStr + $Suffix
}

Get-RussianString "codegolf" 0.5
codegolf))))

this is so shortest code wins!


This is my first challenge, any feedback is greatly appreciated.

\$\endgroup\$
6
  • \$\begingroup\$ Privyet tovarisch, but challenges on PPCG need an objective winning criterion (eg code-golf for shortest code) \$\endgroup\$ Jan 25, 2017 at 16:27
  • \$\begingroup\$ @TùxCräftîñg - apologies this is code-golf, I included a mention of it in the 'background' block shortest possible code i'll include the tag now though. \$\endgroup\$
    – colsw
    Jan 25, 2017 at 16:49
  • \$\begingroup\$ @AdmBorkBork the minimum character set would be that, full Cyrillic alphabet support would be ideal, but I decided to simplify that aspect as much as possible, I could change it to the full ASCII set or otherwise if you believe it would be of benefit? - i'll include space as a default charachter, and remove the ! in the examples for now though. \$\endgroup\$
    – colsw
    Jan 25, 2017 at 16:52
  • 1
    \$\begingroup\$ Restricting the input to "Printable ASCII" would probably be sufficient. \$\endgroup\$ Jan 25, 2017 at 16:58
  • \$\begingroup\$ If anything that's actually more understandable - i'll edit that in now, thanks! \$\endgroup\$
    – colsw
    Jan 25, 2017 at 17:00
  • 3
    \$\begingroup\$ Please edit the answer down to a hyperlink to the posted answer on the main site and delete it now that it is posted. \$\endgroup\$
    – mbomb007
    Feb 1, 2017 at 4:49
2
\$\begingroup\$

Animate the text in your terminal

The goal

The goal is to "animate" the string "Hello world" in your output so that each character gets capitalised after each other.

Your program can exit after each letter has been capitalised.

For example;

# Iteration 1
Hello world

# Iteration 2
hEllo world

# Iteration 3
heLlo world

# Iteration 4
helLo world

# Iteration 5
hellO world

# Iteration 5
hello world

# Iteration 6
hello World

# Iteration 7
hello wOrld

# Iteration 8
hello woRld

# Iteration 9
hello worLd

# Iteration 10
hello worlD

Input

No input is required, but "Hello world" must be the string that is "animated".

Output

The string "Hello world" must be animated. The output must be as 1 line to create a sort of wave animation. Example gif;

https://i.gyazo.com/be12b693063b463540c5bf1f03d2454a.gif

I saw this on a metasploit youtube video and thought the effect was pretty cool, which is where I recorded the gif from, so it's a little laggy, but I hope it illustrates the output fine

This is code-golf, lowest byte-count will be deemed the winner.

\$\endgroup\$
1
  • \$\begingroup\$ I think that you should make it that you take input and animate that. \$\endgroup\$ Jun 9, 2017 at 15:01
2
\$\begingroup\$

Packing Primes for Posterity

Introduction

You've calculated which of the first n numbers are prime, and want to save your achievement for all future generations. Unfortunately, you're broke, and want to minimize storage costs (you'll be paying them forever, after all.)

You need to determine the best way to pack all of the primes <=n and still be able to answer the question "is p prime?" in O(1) time.

Challenge

A submission to this challenge must include both a compress algorithm and an isPrime algorithm.

compress

Input: n -- the number that you have checked prime-hood through.

Output: Bytes to feed into your isPrime algorithm.

isPrime

Input: The output of your compression algorithm, and an integer i >= 0. i is guaranteed to be <= n.

Output: True if i is prime, otherwise False.

This algorithm must run in O(1).

The winner of this challenge is the (compression, isPrime) pair that is

  • Correct
  • Has the best compression ratio, as determined by the average compression ratio for

    n in {10^3, 10^4, 10^5, 10^6, 10^7, 10^8, 10^9}

as compared to the naive solution below.

Consider the following solution in Python:

def compress(n):
    # simple sieve of Eratosthenes. Note: this is not a 
    # prime generation challenge; a list of the first 
    # billion numbers will be provided in this format.
    primes = [1] * (n + 1)
    primes[0] = 0
    primes[1] = 0
    upper_bound = int(math.sqrt(n)) + 1
    for i in range(2, upper_bound):
        factor = i
        if not primes[factor]:
            continue
        factor += i
        while factor <= n:
            primes[factor] = 0
            factor += i
    primePackStr = ''.join(str(i) for i in primes)
    return primePackStr

def isPrime(compressed, i):
    return compressed[i] == '1'

Example Input and Output

Input to compress:

20

Output:

"001101010001010001010"

Input to isPrime:

("001101010001010001010", 13)

Output:

True

Notes

  • This is not a prime generation challenge. The compress executable can assume that there is a file called primes.txt in the same directory that contains the first billion numbers in the format s[i] = 1 if i is prime, 0 otherwise. (Zero-indexed)
  • Naturally, the isPrime executable cannot make use of this file.
  • The isPrime executable must not hardcode any primes.
  • Please provide instructions on how to compile/run your code on either OSX 10.12 or Ubuntu 16.04, if it's not obvious.
  • This is not a code golf challenge. Any length of code is fine, as long as isPrime doesn't attempt to cheat.

Notes for sandbox

  • I'll include a link to a downloadable primes.txt
  • Any thoughts on a better restriction than "The isPrime executable must not hardcode any primes?"
  • Should I test on random values of n instead?
  • thanks!
\$\endgroup\$
8
  • 1
    \$\begingroup\$ This is an interesting idea, and I hope it can be made to work, but it does have a big problem in the subtlety of what you mean by saying that isPrime must run in O(1) time. Interpreted with maximum pedantry, it's impossible because O(1) time isn't sufficient to read i from the input, even assuming random access to the input (which some key models of computation don't, and many interpreters won't give you). \$\endgroup\$ Mar 8, 2017 at 9:12
  • \$\begingroup\$ If you instead restrict answers to accessing a fixed (independent of n and of the length of the compressed text) number of bytes of the compressed text and doing a fixed (independent of n and i) amount of processing on them, you're pretty much killing the challenge because the only feasible compression will be bit-packing with a wheel and the competition will just be how big to make the wheel. \$\endgroup\$ Mar 8, 2017 at 9:12
  • \$\begingroup\$ In particular, a wheel size of 10^9 would trivialise the challenge. \$\endgroup\$ Mar 8, 2017 at 12:38
  • \$\begingroup\$ As far as your first comment goes, I could clarify to say that isPrime can assume that the entire output of compress is already in memory - or that isPrime may be called many times, with different i but the same compressed and it only has to be amortized O(1). Unfortunately, you're totally right about the prime wheel - though the idea is that the algorithm would work for arbitrary values of n, not just up to 10^9. \$\endgroup\$ Mar 8, 2017 at 14:34
  • \$\begingroup\$ Maybe I could entirely remove the isPrime in O(1) restriction and simply make this a challenge about the most efficient compression algorithm for prime numbers. (Allowing arbitrary compression.) @PeterTaylor \$\endgroup\$ Mar 8, 2017 at 14:34
  • \$\begingroup\$ If you do that then everyone will compress the list to 0 bytes unless you fix the decompression. A variant which might work is to ditch isPrime and say that the output of compress will be passed through zcat | sort -n so that the challenge is finding a good ordering of the primes which exploits Lempel-Ziv behaviour. \$\endgroup\$ Mar 8, 2017 at 14:45
  • \$\begingroup\$ That might be interesting, though I'd need to add some sort of polynomial time restriction - you could theoretically test all O((n/(log n))!) orderings of primes <= n otherwise. I'm going to abandon this for now, but may come back eventually if I have an epiphany. Thanks for your help! \$\endgroup\$ Mar 8, 2017 at 14:56
  • \$\begingroup\$ This is a really interesting idea, and I hope you can come up with a way to make it work successfully. \$\endgroup\$ Mar 8, 2017 at 21:00
2
\$\begingroup\$

Challenge about loudly interjecting in a courtroom

One of the most important things about being a courtroom lawyer is loudly interjecting before you make your point. In this challenge, we're going to edit a typical courtroom transcript to include these interjections.

Any lawyer (and in fact, any character at all in the transcript), uses these rules to interject:

  1. Use an interjection when the character who is speaking changes to you.

Take the following example:

SAHWIT: I remember the time I found the body exactly.
SAHWIT: It was 1 P.M.
PHOENIX: Frankly, I find that hard to believe!
PHOENIX: Your statement directly contradicts the autopsy report.

There is one change in speaker, so an interjection will be added in at that point like this:

SAHWIT: I remember the time I found the body exactly.
SAHWIT: It was 1 P.M.
PHOENIX: Hold it! Frankly, I find that hard to believe!
PHOENIX: Your statement directly contradicts the autopsy report.
  1. Use Hold it! if the previous statement ends with a single full-stop or exclamation mark, Take that! if the previous statement ends with an elipses (...), and Objection! if the previous statement ends with a question mark.

For instance:

JUDGE: What evidence proves the clock is running slow?
PHOENIX: The victim had just returned from abroad the day before the murder.
PHOENIX: The time difference between here and Paris is 9 hours!
PAYNE: But modern day clocks automatically adjust for time zones...
PHOENIX: This is an antique!

Becomes:

JUDGE: What evidence proves the clock is running slow?
PHOENIX: Objection! The victim had just returned from abroad the day before the murder.
PHOENIX: The time difference between here and Paris is 9 hours!
PAYNE: Hold it! But modern day clocks automatically adjust for time zones...
PHOENIX: Take that! This is an antique!

That's about it. I'll write some longer test cases a bit later. This challenge is probably Retina-bait to be honest.

\$\endgroup\$
1
  • \$\begingroup\$ This challenge might work better if the interjections made more sense in context. For example, "Objection!" likely works best after questions (as most objections in an actual court case are to try to invalidate a question that fails to follow the rules). \$\endgroup\$
    – user62131
    Mar 14, 2017 at 4:35
2
\$\begingroup\$

Normal quine, weird quine

Note: This Sandbox entry has a fairly long history, and is basically an attempt to produce a challenge inspired by this comment, but that's immune to wilful misinterpretation (or misunderstanding) of what counts as an error in order to trivialise the question.

Background

In the world of programming languages, there are lots of different ways to produce output on the usual output streams. Most languages have a way to print a string intentionally, called print, write, or something like that. Sometimes you can even just leave a value to be printed implicitly. Most languages also have situations in which the implementation interjects with its own output, e.g. warnings produced during the compile. We'll call this weird output.

Task

For each method of output to standard output or standard error in a programming language, consider how much of that output is under the programmer's control and thus can contain arbitrary text (e.g. specified as a parameter, part of the program's filename, taken from a variable that can be assigned to, or the like), as opposed to being a single possibility (or a finite set of possibilities) hardcoded into the interpreter. We'll call this output method normal if no more than 3 bytes are outside the programmer's control; and weird if there are 4 or more hardcoded bytes that the programmer cannot control.

In this challenge, you need to write a full program that's a variant, obeying the proper quine rules. Specifically, after performing the entire process of building and running the program (i.e. if there's a separate compile step required, its output counts too):

  • All the output produced on standard output and standard error via normal output methods must be identical to the program's source code;
  • All the output produced on standard output and standard error via weird output methods must also, separately, be identical to the program's source code.

In other words, the program is a quine in two different ways. You can think of this as being a quine that's also an error quine (also known as a "Kimian quine"), except that the notion of "error" is restricted in order to avoid abuse (mechanisms which would let the program provide an arbitrary "error message" count as normal output, not weird output, on the above definition), but generalized to allow things like warnings, banners that the implementation prints as it loads, and other weird ways to produce output.

Clarifications

  • For the purpose of the proper quine definition, the fixed part of the output that's inherent in a weird output method is considered to not be encoded by the corresponding part of the program (even if that part of the program causes an error). As such, only the normal part of the quine can fail to be a proper quine.
  • PPCG doesn't normally count output that's inherent to an implementation (such as compiler progress messages and fixed banners). This challenge is about handling that sort of thing, though, so such output is definitely relevant here (in addition to everything else on the standard output and error streams).
  • Unlike in many challenges, the switches given to the compiler, and the program filename, are likely to be highly relevant in this challenge. Using an unusual build configuration may well be required to make the challenge possible, and as such is legal here; however, if you run the implementation in an unusual way, remember that PPCG rules charge a byte penalty for doing so (equal to the number of additional characters that you'd need to add on the command line over the shortest "normal" way to run a program), and thus you'll need to specify the size of the penalty in your post. (For example, if the interpreter you're using reads the program from a file, and has no particular restrictions on the filename, the shortest normal way to run the program would be from a file with a 1-character filename; thus, if you need a 100-character filename to make your program work, you'd incur a byte penalty of +99.)
  • The compiler/interpreter version you use may well be relevant, so as part of your submission, please state a specific compiler or interpreter on which your program works, and which version is required. (For example, a C submission might state "C (gcc 6.2.0)" in the header.)
  • Note that this task may not be possible in all languages. In the languages where it is, the easiest method will likely be to find an error or warning message for which it's possible to customize some subset of the text (via changing the name of something that gets quoted in the message; filenames are a common choice here, but not the only one). Obviously, if you could customize the entire thing, it wouldn't be weird output and thus wouldn't work. I'll be particularly impressed (and surprised) if someone finds a way to do this using only error and warning messages whose text is entirely fixed.

Victory condition

This is a challenge, so an entry is considered to be better if it has a smaller byte count. As such, once you've got your program working at all, you want to optimize it to bring the number of bytes down as far as possible. (However, don't be discouraged if there's already a shorter entry, especially if it's in a different language; what we're really looking for here is to shorten a particular algorithm or idea behind a program as much as possible, but seeing multiple solutions in different languages or that rely on different principles is always worthwhile.)

Sandbox questions

This was moved here from main because many answerers seemed to disagree with everyone else as to what an error message was.

I've aimed to avoid the problem in this rewrite by focusing not on what is and isn't an error message, but rather on the amount of hardcoded content in the message. Is this likely to be interpreted the same way by everyone? Is it objective?

Also, should I edit the original challenge, or should I post it as a new challenge? Out of the two non-deleted answers, one will stay valid (although the explanation will end up somewhat out of context), the other will need to be deleted (although I consider it to be invalid under the original specification too, and thus arguably no changes are being made to which answers are correct).

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

Garbled Phone Numbers

(de)

You know how you get a voicemail message and the person's connection wasn't great, and you're trying to figure out how to call them back, but you're not sure if that was a "5" or an "8" they said?

That's this challenge.

The good news is that the caller read off their number twice, but it's garbled in both places.

Your program should take input like this:

5551231234 / 5551231234

Where the first seven digits are the first time the phone number is said in the voice mail and the second set are the second time it's said. Only...it'll look more like this:

555?AAA1_36? / 55?522_1?234

A digit followed by a question mark means that that's the best-guess for that digit (e.g. "5?" means "probably a 5, compare with repeat"). An underscore indicates a known missing digit, something too fuzzed by static to be deciphered at all. Letters are just that: letters. Treat them as their respective digits (ABC -> 2, DEF ->3, HIJ -> 4, etc).

You can safely assume the following judgement calls:

5? / _     -> 5  //5 is the best guess we have, use it
5? / 4?    -> ?  //conflict
 5 / 4     -> ?  //conflict
5? / 4     -> 4  //solid information overrides possible value
 5 / 4?    -> 5  //solid information overrides possible value
 _ / _     -> ?  //no information available

Additionally you can assume that all inputs will contain ten-digit phone numbers, not including the question marks. Inputs that aren't ten digits (e.g. 1234567 / 1234567) can either be treated as unsolvable (falsey output) or throw an error.

Output option A: Output a truthy value indicating whether or not a given input can be resolved to a single valid ten-digit phone number.

Output option B: If it can be parsed to a single valid ten-digit phone number, output the phone number. Otherwise output some form of error indication (e.g. -1, false, empty line).

Shortest wins, as per usual.

[Sample inputs]

\$\endgroup\$
7
  • \$\begingroup\$ I'm not sure what your intended meaning for letters is. If it's just A=1,B=2,C=3... then they're a bit pointless and weird in this context. You should also probably choose only one between option A and option B before posting (I vote for B). \$\endgroup\$
    – Leo
    Apr 9, 2017 at 16:39
  • \$\begingroup\$ @Leo Letters as they appear on a dial pad: A,B,C = 1, DEF = 2, GHI = 3, etc. \$\endgroup\$ Apr 9, 2017 at 21:05
  • 2
    \$\begingroup\$ You need an explicit mapping for letter→number. Most phones I've seen map A/B/C to 2 (apparently they follow this international standard). \$\endgroup\$
    – user62131
    Apr 9, 2017 at 22:07
  • \$\begingroup\$ @ais523 Whoops, that's what I get for posting late at night just before bed, then making the comment gia tablet at a rest stop somewhere in western Pennsylvania, 6 hours from home. \$\endgroup\$ Apr 10, 2017 at 4:43
  • \$\begingroup\$ I think you should omit 'output option A' and just keep B; B includes A pretty much. \$\endgroup\$ Apr 10, 2017 at 9:36
  • \$\begingroup\$ @officialaimm I think that's the beret idea, yes. There were a mess of ideas running around in my head, such as scoring based on a given input list, but never congealed well enough to make it to paper. A and B were the only two that did. \$\endgroup\$ Apr 10, 2017 at 12:18
  • \$\begingroup\$ Any other comments before I start generating some inputs and posting it? \$\endgroup\$ Apr 17, 2017 at 19:46
2
\$\begingroup\$

Write a "21" game in exactly 21 characters

Challenge

You must write a program which implements the following algorithm:

Let x = 0
Let y = truthy value
while (y is not falsy AND x <= 21) do:
  Let x = x + a uniform random number from {1,2,3,...,11}
  Output the value of x
  Input a value of y from the user (you may assume input is valid)
Output the value of x

(You do not have to follow the pseudocode exactly. For example, if your language happens to initialise variables to a truthy value automatically, you don't have to include the y:=TRUE line. Similarly, you don't have to use a while loop. The important thing is that it repeatedly takes user input until either x exceeds 21 or the user chooses to stop, and it outputs the current value of x after each user input.)

Score

Let n be the length of the shortest program which meets the spec which can be obtained by deleting 0 or more characters from your code. Then your score is:

- 500            if n > 21
- 1 + (n-21)^2   if n < 21

The winner in each language is the program with the lowest score.

Questions

  • Is this a resonable idea? I can't find similar challenges, so maybe there is a problem with ones like this? (Trivial solutions etc.)
  • Is the specification too complicated (maybe more languages could enter if it was a simpler algorithm, for example just taking user input once?)
\$\endgroup\$
1
  • \$\begingroup\$ This victory condition is code-shuffleboard. I don't think it adds much over just doing golf, though; it's normally fairly easy to pad out a program in a way that can't be fooled via simple character deletion. (Also, I suspect 21 characters isn't enough in most languages, although golfing languages should be able to beat that; it'll be interesting to see whether some of the terser practical languages can.) \$\endgroup\$
    – user62131
    Apr 11, 2017 at 12:31
2
\$\begingroup\$

Tetris Programming

The Task

Your program or function should take as input one character from the set IJLOSTZ, which represents one of the seven tetrominos as usual:

I  J   L   O   S    T    Z

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

You should output the number of shapes which are equivalent to this tetromino up to rotation. For example, the I only has two arrangements, horizontal and vertical, whereas the J has four different orientations. The O looks the same no matter how you rotate it, so there's only one shape. Here all possible input/output pairs:

I  2
J  4
L  4
O  1
S  2
T  4
Z  2

The Source Code

The main part of this challenge is the source code restriction:

  • You may choose either linefeeds (LF, 0x0A), carriage returns (CR, 0x0D) or LR-CR pairs to represent newlines in your code (consistently). These split the source code into a 2D grid of lines (which aren't necessarily the same length).
  • This 2D grid must be completely made up of tetrominos where all 4 characters in each tetromino must be the same. For example, this would be a valid program:

    aaa
    bba
    cbddd
    cbd
    c
    c
    
    eeee
    

    Note that the individual characters don't necessarily need to be distinct, so there may be larger connected regions of the same character, as long as this region can be segmented into non-overlapping tetrominos. Also note that this restriction also applies to spaces, so the following is not a valid program, because the two spaces don't form a tetromino.:

      x
    xxx
    

The Score

For each of the seven tetrominos count how often it appears in your source code. Your score is the maximum of these seven values.

That means you don't want to make up your code entirely of Is but instead try to use about the same number of each of them to keep the maximum of the seven values down.

The Small Print

You may either write a programs or a functions and use any of the standard methods of receiving input and providing output, as usual. Note that these loopholes are forbidden by default.

\$\endgroup\$
2
  • \$\begingroup\$ It strikes me that most solutions are going to put most of the code in a comment, and it wouldn't surprise me if a score of 1 were achievable in some languages. Do you consider that reasonable? \$\endgroup\$
    – user62131
    May 5, 2017 at 12:25
  • \$\begingroup\$ @ais523 I'm not sure about the task yet. It's hard to find something that isn't too hard for the restriction to become a pain but that is intricate enough to allow people to use several parts of a tetromino. \$\endgroup\$ May 5, 2017 at 14:25
2
\$\begingroup\$

So I've been puzzling over the best way to present this idea I had, so this will probably need a lot of help. I am open to completely reworking the challenge, but this is the best polish I've managed to figure out so far.

At work I have to secure my laptop with one of those 4-digit cable locks and it occurred to me that there was a puzzle here: figuring out the combination by looking at the typical behavior of setting the lock: never allowing any given wheel to "rest" on its unlocked value. e.g. if the combination is 1234 then never walking away with a 1 in the first position, a 2 in the second, and so on (e.g. 1111 would not be considered locked, but 2111 would be). Or possibly by not letting any digit of the unlocked combination be visible (so even 2111 would be "bad" but 6789 would be ok...unless a transpose was also considered to be insufficiently random, however such choices are often up to the user of the lock). I also subsequently changed my behavior (not that I have any real risk of my laptop being stolen).

A standard challenge of "write some code that examines a series of locked values to determine the unlocked value, scoring by number of entries needed" is non-viable, as the sequence list would need to be carefully chosen such that there is a strictly known optimal solution (i.e. a minimum number of locked values), as finding a shortcut in that specific sequence might be possible, but invalid on another sequence.

Then the other night it occurred to me that it might be possible to do this as : one side has to randomize their locks (albeit following a set of rules that allows exploitation), the other side has to break them open. The downside being that it will be a nightmare to validate scores as there will be no easy way to pipe input and output back and forth between two programs running arbitrary languages.

I'm also not sure if there's enough room for freedom in designing the lock randomization code (i.e. interesting for the cop) for it to be plausibly crackable without resorting to brute force (an uninteresting challenge for the robber). Ostensibly the robber half is brute force, but it's guided in some manner towards a determinable value ("ah, I see, the first spindle is never set to 1 when locked, ergo the first digit in the code must be a 1) rather than indeterminate ("ah, I see, no spindle is ever set to 1, ergo there is a 1 somewhere in the code" -> 4 digits ^ 4 spindles -> 256 plausible values with further attempts gaining no new information).


Combination Locks (Cops)

8585: Locked

Your goal is to write a program that produces a 4 digit random number as a combination lock entry code. Your program needs to keep this value a secret, but must produce output that is the result of the lock being locked and its tumblers spun, the value printed being the digits shown along the set row (8585 in the above image).

Your program will then take input of a 4 digit code that is an attempt to unlock the lock. If it is the correct value, output the number of attempts made and the seed value, otherwise print another randomized lock value. Repeat until successfully unlocked.

Rules:

  • Your program must have some way of setting the combination (for scoring), eg. providing a seed value for the random number generator (inputting the correct combination is allowed).
  • All locked combinations must be considered random. However:
  • The nature of "random" is what is to be exploited here. Obviously you wouldn't want your random lock to actually remain unlocked after shuffling the dials!
  • You may chose any rules by which to keep the lock locked, provided that it can be exploited. No outputting 0000 every iteration or cycling between predetermined sets (1234,4567,7890,1234). You're trying to emulate what appears to be smart behavior of a human being, not create an unbreakable lock.
  • Every digit from 0-9 should be possible with some degree of uniformity. That is, if the correct combination is 1234 you are allowed to prevent 1 from showing up as the fist digit, but you may not prevent 1 from showing up in other positions.
    • Blanket removal of all four digits of the combination from all four columns reduces the problem to brute forcing 256 possible combinations.
    • Similarly, allowing a ban on a digit for up to three columns reduces it to brute force against 3136 possible combinations (banning only the combination digits from 3 columns is 81 possible combinations). None of these are interesting challenges.
    • Entries shown to devolve to a brute force guessing will score based on the worst-case lucky guess (i.e. the number of attempts needed to identify the brute-force point, +1).
  • If your language does not have a way to "wait for input" then....??? (requirements for fixed-seed randomness across multiple attempts, e.g. for a given combination and the same number of attempts made, the next output should be the same)
  • Your program should store no data about attempts to break the lock or prior output values, the only data that may be stored are the Random instance (if needed), the correct combination, and number of attempts made. Outputting an attempt value back out (intentionally) would be underhanded.

Scoring

The ratio of your code's byte-length to the best (lowest) number of attempts needed by any robber against your lock.


Combination Locks (Robbers)

8585: Locked

Your goal is to exploit the non-pure-random nature of locked 4 digit combination lock. After all, no one leaves a portion of the correct code in the lock after they shuffle the wheels!

You are to write a program that attempts to deduce the correct combination for a given lock, given only a series of locked (incorrect) combinations. Your program will read a single 4 digit number as the current state of the lock and produce a 4 digit number output as an attempt to unlock the lock. If additional input is given, the attempt was unsuccessful. Your program need not self-terminate (i.e. there is no requirement to take input telling your program that it was successful; ctrl-C interrupt is succificient).

As you are an accomplished thief, you know exactly how each lock gets randomized. You are to exploit the built-in rules to bypass the lock in the fewest number of attempts by looking for patterns in the lock's "output" and narrowing down the list of possible correct combinations.

  • Locks will have a way to predetermine their combination (e.g. random seed or specific 4 digit combination). Your program may not know these values, they are used for scoring only. Remember the standard loopholes: hardcoding the output is disallowed.
  • If a human is unable to find the solution with the data known at that the point of solving, the number of attempts will not count for scoring as it can be considered a lucky guess (arbitrary threshold: 10 or fewer attempts will be automatically assumed as such). This should be treated like a logic puzzle, not a slot machine.
  • If your language of choice doesn't do "programs" it is acceptable to write a function taking in an array of inputs [XXXX, AAAA, XXXX, BBBB, XXXX] (where XXXX represents the combinations displayed on the lock, and AAAA/BBBB represents the prior attempts made) or similar. Note that there will be one more value from the lock than values from attempts, as your function would be producing the paired half as its output.
    • Supplementary output to support ease of alternative input methods acceptable (e.g. a newline followed by the input array for the next iteration to be copy-pasted).

Scoring

The ratio of your code's byte-length to the best (lowest) number of attempts needed top open any lock.

\$\endgroup\$
4
  • \$\begingroup\$ @Ilikemydog I browsed other cops and robbers questions while writing, scoring did not seem unusual. This one has scoring, so does this one, and this one calls for short code (typical scoring method), while this one scores based on number of different cops entries cracked. However, that's not my main concern, "I'm also not sure if there's enough room for freedom in designing a lock.." \$\endgroup\$ May 28, 2017 at 18:06
  • \$\begingroup\$ never mind then. I'll delete the comment. I'd like to give you some more feedback but I didn't follow some of it (mfny) and all I can say is have a +1 \$\endgroup\$ May 28, 2017 at 18:11
  • \$\begingroup\$ No feedback, except I've had this exact thought that a code could be guessed by tracking where the lock was left set to when it was locked over time. Similar idea, but you actually fleshed it out. \$\endgroup\$
    – BLT
    Mar 11, 2018 at 19:48
  • \$\begingroup\$ @BLT That was pretty much where I'd been approaching from. Still not sure there's a good code challenge here, though. :\ Thanks for the look over! \$\endgroup\$ Mar 12, 2018 at 3:15
2
\$\begingroup\$

Wasn't able to find anything in my searches, but please let me know if this or something very similar has been done before. Appreciate any feedback, first post in sandbox.

Can I leave yet?

I'm bored at work, and want to know how close I am to being able to go home. To represent this, I wish to know what percentage of work I have completed for the day.

Inputs

None - Current local/computer time shall be used

Outputs

Percentage of work completed for this day

  • Formatted as either a percentage value or a decimal value: 0.57, .57, 57%, 57.0%
  • Output should be accurate to at least +/-0.5%. Additional accuracy/digits are allowed.
  • The work day is a total of 8 hours.
  • Work starts at 08:00, and ends at 17:00.
  • Lunch is between 12:00 and 13:00. Working during lunch is forbidden, and thus should not count towards the percentage of work completed.
  • Output should be correct during any time of day, including before work starts (0%) and after the work day ends (100%).

The response for a full 24 hour day is shown below:

ResponseGraph

Valid Test Cases

Time Ran     Output
03:55        0%
04:31        0.000
08:00        0
09:00        12.5%
11:31        44%
12:37        .5
16:30        0.94
21:08        100%

Incorrect Test Cases

09:00        12.5     (Interpreted as 1250%
11:31        43%      (Error of 0.9%)
12:37        .58      (Did not account for lunch)
16:30        0.9      (Error of 3.8%)

Notes

  • I work 7 days a week 365 days a year; you do not need to check if it's a weekend, holiday, etc.
  • I live in an area with no Daylight Savings Time, Leap Seconds, or any other confusing time-changing events.

This is , so lowest byte-count score wins.

\$\endgroup\$
2
  • \$\begingroup\$ Does no feedback mean it's perfect the way it is and I should post it? Or it's so bad that nobody wants to touch it? \$\endgroup\$
    – qoou
    May 24, 2017 at 16:08
  • 1
    \$\begingroup\$ I think it's pretty solid. \$\endgroup\$ Jun 20, 2017 at 14:57
2
\$\begingroup\$

Bitcoin Trading

?

This is mainly an idea for something I could potentially host on my KOTH server.

Everybody knows that bitcoins are the next big thing. It's just a question of when they are going to take off. Right now, they are worth $250 each, but who knows, maybe someday they will be worth over $1000! The growth trend is phenomenal.

You are a tech-savvy investor who wants to get in on this action.

The Challenge

Your goal is to write a bot that can predict the market and tell you how you should invest your money, given hourly updates of the Bitcoin price.

Keeping Balance

To overcome the fastest-gun-in-the-west effect, wherein early answers have more time to make more money, this challenge will not keep track of any absolute balances. Instead, the assets of each entrant will be scaled up/down between each round.

Each entrant will be given a single float in the range 0 to 1 representing the percent of total assets are currently invested in Bitcoin. This is calculated by (BTC_cur_rate*BTC_owned)/(USD_owned + BTC_cur_rate*BTC_owned).

A value of 0 means that you currently have nothing invested in Bitcoin, while a value of 1 means that you have everything invested in Bitcoin. An input of 0.3 means that 30% of your total value is in Bitcoin, while the other 70% of your value is in dollars.

Examples

input    ->    assets as portion of your total value
                 BTC     %      USD     %
 0.0     ->      0.0    0%      1.0  100%
 0.3     ->      0.3   30%      0.7   70%
 0.6     ->      0.6   60%      0.4   40%

Price Data

Players will also have access to a file history.txt which will contain the BTC price history, measured in cents, over the duration of the competition. Each time a player is called, they are presented with a fresh copy of history.txt, with one line appended each turn. Do not attempt to modify this file.

Example File

This could be the history.txt file after 3 hours of competition. The most recent price is $247.49.

24694
24724
24749

There will be a trailing newline at the end of the file.

Making a Trade (ouput)

The output of your program should be another float in the range of 0 to 1, representing the new portion of your assets that you want invested in Bitcoin. The difference between your input number and output number represent the amount of value being exchanged.

Examples

input -> BTC USD  |  output -> BTC USD  |  trade being made
 0.3  -> 0.3 0.7  |   0.2   -> 0.2 0.8  |  0.1 in BTC -> 0.1 in USD
 0.3  -> 0.3 0.7  |   0.6   -> 0.6 0.4  |  0.3 in USD -> 0.3 in BTC

Calculating Score for a Round

Your score for a round is based on your change of value for that round. You start every round with a total value of 1, but your ending value is influenced by two things:

  • A 0.2% commission on your trade taken by the controller
  • The change in Bitcoin value over the next hour

Taking Commission

Commission is taken whenever you buy or sell bitcoins. Whenever you convert a certain amount of value from one currency to the other, you will receive 0.2% less of the new currency than what you actually ordered.

Examples

input  |  output  |    trade     |  commission  |  result after commission
 0.3   |   0.6    |  0.3 -> BTC  |  0.0006 BTC  |  0.5994 BTC & 0.4 USD
 0.75  |   0.05   |  0.7 -> USD  |  0.0014 USD  |  0.05 BTC & 0.9486 USD

Adjusting BTC Value

After taking commission, your value of BTC is multiplied by the price percent change in BTC over the next hour. The amount of value you have in USD will stay constant.

Examples

BTC after commission  |  prices in cents  |  % change  |  new BTC value
         0.5          |  30000 -> 29850   |   -0.5%    |    0.4975
         0.236        |  20000 -> 30447   |   +2.0%    |    0.24072

Overall Process of a Round

Below is an example showing all of the steps in a single round.

BTC    USD
.3     .7  = 1.0      input to entrant is 0.3
.6     .4  = 1.0      output of entrant is 0.6
.0006  .0             0.2% commission of the trade
.5994  .4  = 0.9994   result after commission
+0.3%                 percent change in bitcoin price over 1 hour
.6012  .4  = 1.0012   result after the flow of time = score for that round
.60048 .39952 = 1     input for the next round is 0.60048 after scaling

Determining the Winner

For a given round, your score is your new total value. This is after taking the 0.2% commission and calculating the change in Bitcoin value. For the above example, the score was about 1.0012.

At any given time, the aggregate score for an entrant shall be the product of the scores for its most recent (up to) 50 rounds. At any given time, the current winner is the player with the highest aggregate score.

For example, a bot could get these scores for its first 5 rounds: 1.001 1.002 0.998 0.999 1.003. The total score of the bot is about 1.00299.

The Controller

I haven't written the controller yet, but I think it's going to be written in Perl with support for entrants in a variety of other languages (Java/Python/Ruby/C++).

I plan to use this API for bitcoin price data.

The controller will probably run all of the entrants in parallel, each with their own thread. This simply allows it to put a stop to any infinite looping that may occur. I hope it will work if all of the programs are reading the same history file at once.

Additional Rules

Since this is a PvE competition and not a PvP competition, and takes place on a server, there are some slight differences in rules.

  • There's no set restriction on submitting multiple bots, since you can't make a team.
  • Similar to always, you can't call other programs, like the controller or other bots, during your turn.
  • The time limit is loose. A long as a single round with all of the bots doesn't take up most of an hour to perform, it'll be fine. It really shouldn't take more than a couple minutes for each bot to make a move.
  • You may create a single file, with the filename [botname]-data.txt, in the current directory. This file will persist, even across updates of your bot or the controller.
\$\endgroup\$
5
  • \$\begingroup\$ 1. What determines whether the commission is taken in bitcoin, dollars, or some mixture of the two? 2. What is the score of a round? (It's mentioned in the example, but it needs to be more prominent). 3. Is there any input other than the balance? Or are entries allowed to access external data sources? Or is it pure uninformed guessing? \$\endgroup\$ Oct 11, 2015 at 20:09
  • \$\begingroup\$ @PeterTaylor I've added some details. I'm not completely decided on how much data the entrants will be able to access/store. Right now it is just the price history. \$\endgroup\$
    – PhiNotPi
    Oct 11, 2015 at 23:41
  • \$\begingroup\$ Do you have access to Mathematica? Also, how precise are the input and output? \$\endgroup\$ Oct 16, 2015 at 1:04
  • 1
    \$\begingroup\$ How much of your assets are in BC to start with? \$\endgroup\$ Oct 21, 2015 at 23:59
  • \$\begingroup\$ IT'S 2016 AND PHINOTPHI STILL HASN'T... /s \$\endgroup\$ Dec 12, 2016 at 2:29
2
\$\begingroup\$

Raindrops are falling on my... glasses?

\$\endgroup\$
11
  • \$\begingroup\$ So a minimum of 216 seconds runtime? Note that TIO times out after 60 seconds. \$\endgroup\$
    – Adám
    May 21, 2017 at 15:36
  • \$\begingroup\$ How many newlines are "enough"? May we assume a 5-lines screen? \$\endgroup\$
    – Adám
    May 21, 2017 at 15:36
  • \$\begingroup\$ @Adám is there anything you like in this post? And however large your screen is. If you want to reduce the size of the screen, feel free. \$\endgroup\$ May 21, 2017 at 15:39
  • \$\begingroup\$ Don't get me wrong. This challenge is good. It just needed so tightening up. That's what the sandbox is for. Better get constructive criticism here than downvotes on the main site. \$\endgroup\$
    – Adám
    May 21, 2017 at 15:40
  • \$\begingroup\$ So, if one can choose screen size you may as well just specify that glasses (if not changed in-place or the screen is cleared) must be separated by a FormFeed or one or more newlines. \$\endgroup\$
    – Adám
    May 21, 2017 at 15:43
  • \$\begingroup\$ What about cursor movement with terminfo (like \e[10D\e[2A to move 10 spaces left and 2 lines up)? The solution would only work in the terminal, but there it would certainly look as if the image stays the same (and would look way better than other approaches). Is this allowed? \$\endgroup\$
    – eush77
    May 21, 2017 at 20:40
  • \$\begingroup\$ @eush77 sure why not? \$\endgroup\$ May 21, 2017 at 20:41
  • \$\begingroup\$ @RandomUser I guess it was just not clear to me from the statement. \$\endgroup\$
    – eush77
    May 21, 2017 at 20:46
  • \$\begingroup\$ What do you expect to happen when almost every space is at @ but some are at O? Locations are still chosen totally randomly, so the visible effect will be that almost nothing is happening? \$\endgroup\$ May 22, 2017 at 6:43
  • \$\begingroup\$ @SteveBennett yes. It's an unfortunate side effect \$\endgroup\$ May 22, 2017 at 6:46
  • \$\begingroup\$ You could change the behaviour so that rain never lands on @'s, although it's hard to implement this in a way that doesn't verge on infinite loops. \$\endgroup\$ May 22, 2017 at 6:50
2
\$\begingroup\$

The alphabet - my way

Your pointy-haired boss gives you a list of words and tells you to sort them. So you give him back a sorted list. "Wrong!" he says. "I want them sorted according to MY alphabet..."

Challenge

Given a new ordering of the alphabet and a list of words, sort the words according to that new alphabet ordering.

The new ordering is given as a 26-character string, guaranteed to contain all letter of the alphabet exactly once, in lower case.

All words in the list of words will be made up of lower case letters only -- no capital letters or punctuation. There will be no repeat words.

If there is a word in the list that is the prefix of another word, then the shorter (prefix) word should appear first in the sorting. For example, "golf" should appear before "golfing".

Examples

Example 1

Input:

qwertyuiopasdfghjklzxcvbnm
apple
banana
currant
dragonfruit
elderberry
fejoia

Output:

elderberry
apple
dragonfruit
fejoia
currant
banana

Example 2

Input:

qwertyuiopasdfghjklzxcvbnm
uranium
plutonium
uranus
pluto
polonium

Output:

uranus
uranium
polonium
pluto
plutonium

Example 3

Input:

abcdefghijklmnopqrstuvwxyz
four
score
and
seven
years
ago

Output:

ago
and
four
score
seven
years
\$\endgroup\$
3
  • \$\begingroup\$ Shouldn't pluto/plutonium be before polonium \$\endgroup\$
    – ASCII-only
    May 29, 2017 at 11:26
  • \$\begingroup\$ No, because 'o' comes before 'l' in that alphabet. Just like when you alphabetise using the standard alphabet, ties are broken by the alphabetical rank of subsequent letters. \$\endgroup\$ May 29, 2017 at 11:42
  • \$\begingroup\$ Oh wait read polonium wrong sorry \$\endgroup\$
    – ASCII-only
    May 29, 2017 at 11:43
2
\$\begingroup\$

Print a shuffled deck of cards

\$\endgroup\$
8
  • \$\begingroup\$ What prevents me from outputting the cards in the same order every time? It's hard to specify randomness, as we've seen in other meta posts. You could say "I will run your program 100 times; no two outputs should be identical" since the probability of this happening is miniscule if the output is truly randomized. \$\endgroup\$ Jun 2, 2017 at 23:05
  • \$\begingroup\$ I believe "all permutations must have an equal opportunity of being chosen" is what is usually used. \$\endgroup\$ Jun 3, 2017 at 0:57
  • 2
    \$\begingroup\$ I don't think having to output the Unicode card characters adds anything to the challenge and the answers (except for bytes...). \$\endgroup\$ Jun 3, 2017 at 0:58
  • \$\begingroup\$ All I see in my browser is a bunch of rectangles with diagonals. \$\endgroup\$
    – Dennis
    Jun 3, 2017 at 21:30
  • \$\begingroup\$ @Dennis Install the Noto fonts. \$\endgroup\$
    – anna328p
    Jun 4, 2017 at 1:09
  • \$\begingroup\$ "all permutations must have an equal opportunity of being chosen" is actually EXTREMELY difficult, the random number generators of most languages aren't up to that -- even making sure every combination can come up is quite tricky as you need 225 bits of randomness. \$\endgroup\$ Jun 4, 2017 at 21:15
  • \$\begingroup\$ @programmer5000 It's already only a title \$\endgroup\$
    – anna328p
    Aug 1, 2017 at 23:30
  • 1
    \$\begingroup\$ It should still be deleted. \$\endgroup\$ Aug 10, 2017 at 20:59
2
\$\begingroup\$

Title


Challenge

In your language of choice, write 25 programs, functions, or snippets that output or return the integers 1 through 25, inclusive. However, the goal is to simultaneously minimize the number of distinct chars used and the length of the code.

Scoring

This is a variation on : If your 25 entries have N distinct characters and a total length of L, your score is N × (L + N). The submission with the lowest score wins.

Example

Say the challenge only went up to 10, and your ten snippets were:

1
2
3
4
5
6
7
8
9
10

That's 11 bytes total, and 10 distinct chars; therefore, your final score would be 10 × (11 + 10) = 210.

Now, if your snippets were:

1
1+1
1+1+1
1+1+1+1
1+1+1+1+1
1+1+1+1+1+1
1+1+1+1+1+1+1
1+1+1+1+1+1+1+1
1+1+1+1+1+1+1+1+1
1+1+1+1+1+1+1+1+1+1

That's 100 bytes total, and 2 distinct characters (+ and 1); thus, the final score is 2 × (100 + 2) = 204, a small improvement over the literal numbers.

One last example. If your snippets were:

1
-~1
1-~1
-~1-~1
1-~1-~1
-~1-~1-~1
11-1-1-1-1
11-1-1-1
11-1-1
11-1

That's 58 bytes total, and 3 distinct chars (-, ~, 1); therefore, your final score would be 3 × (58 + 3) = 183, an improvement over both.

Rules

  • Each output may be a string of digits rather than a literal number.
  • Each output may have trailing decimals, as long as they are all 0s (e.g. 1.000 is allowed, but 1.000001 is not).

Meta

  • Is 25 a good number? I originally had it at 100, but that seems a little tedious.
  • Will the scoring system work well enough?
  • Is this even a good idea?
  • Title and tag suggestions?
\$\endgroup\$
5
  • \$\begingroup\$ Unary/Lenguege/Glypho would automatically win, \$\endgroup\$
    – Okx
    Jun 5, 2017 at 17:37
  • 2
    \$\begingroup\$ @Okx The length still factors into the score, so no, they wouldn't. \$\endgroup\$ Jun 5, 2017 at 17:41
  • \$\begingroup\$ Ah, sorry. My mistake :P \$\endgroup\$
    – Okx
    Jun 5, 2017 at 17:49
  • \$\begingroup\$ The "make a lot of snippets for the first few natural numbers" bandwagon already seems overloaded this week. \$\endgroup\$ Jun 5, 2017 at 22:27
  • 1
    \$\begingroup\$ @PeterTaylor Yeah, I'll wait a while before considering posting this to main... \$\endgroup\$ Jun 6, 2017 at 11:11
2
\$\begingroup\$

Compare string repetitiveness

Given two strings, decide which one is more repetitive. This is the string whose most common character appears more often in it. If these are equal, then tiebreak by counting their respective second most common characters, and so on. Once a string's distinct characters have been exhausted, all further counts are zero.

Give one consistent output if the first string is more repetitive, and a different consistent output if the second one is. You will never be given a complete tie.

You may assume input strings will be non-empty and use only ASCII characters.

Scoring: Your code's score is its repetitiveness, with comparing lower being better. Put in your header the counts of the top 3 most common characters, and the full frequency list in your body.

Test cases:

TODO

\$\endgroup\$
7
  • \$\begingroup\$ additional tie break is probably just timing (of the post, not the programs computations) \$\endgroup\$ Jan 3, 2017 at 8:17
  • \$\begingroup\$ @DestructibleWatermelon I was thinking alphabetical order (in the code page). Maybe that's interesting to optimize? If not, yes, I'll make it earlier post as standard. \$\endgroup\$
    – xnor
    Jan 3, 2017 at 8:19
  • 2
    \$\begingroup\$ A somewhat meatier task might be good, otherwise golfing languages might easily score 1 without even trying. Otherwise, I do think this scoring mechanism could be interesting. \$\endgroup\$ Jan 3, 2017 at 9:14
  • \$\begingroup\$ Maybe you could use order-0 entropy. calculate it and the score is your own entropy? \$\endgroup\$
    – Christoph
    Jan 3, 2017 at 11:42
  • \$\begingroup\$ I can't edit, so: "alternative is too have" -> "alternative is to have". To make the task harder, how about, when counting a specific letter, you start with the original string, but then each time it's found, the string you're going through is shifted by one through the Caesar cipher? \$\endgroup\$
    – 0WJYxW9FMN
    Jan 3, 2017 at 13:27
  • 2
    \$\begingroup\$ I think I prefer it less-meaty. It presents it as an interesting scoring mechanism to main, and since languages don't compete against each other, I'd be rather interested in how well non-golfing languages fair. \$\endgroup\$ Jan 4, 2017 at 16:37
  • 1
    \$\begingroup\$ I think I like this version better, as it isn't quite so easy for golfing languages while not being out of reach for some esoteric languages. \$\endgroup\$ Jun 7, 2017 at 20:06
2
\$\begingroup\$

Range without Range Builtin

Challenge

Given an integer y where y > 0, output a list of in some reasonable format that contains every integer in increasing order up to but not including y, without using any builtin that generates a range of any sort.

If your language has a feature whose specification uses a range, that is not allowed (for example, you cannot use the map quick in Jelly on a single integer because that maps over the range). You can assume that y will not exceed your program's capacity for integers, but it must be able to theoretically work on any integer given no memory, time, or otherwise language constraints.

A format is reasonable for a list a = [a0, a1, ..., an] if and only if there exists a string x, a string y, and a non-empty string z such that the output is x + z.join(a) + y.

\$\endgroup\$
14
  • \$\begingroup\$ This seems extremely simple :P for(i=0;i<y;i++)printf("%d ",i); \$\endgroup\$
    – MD XF
    May 26, 2017 at 19:44
  • \$\begingroup\$ @MDXF Yes, but there's a 4-byte solution in Jelly. :P \$\endgroup\$
    – user42649
    May 26, 2017 at 19:48
  • \$\begingroup\$ Which you have disallowed.... \$\endgroup\$
    – MD XF
    May 26, 2017 at 19:48
  • \$\begingroup\$ @MDXF No, there's a 1-byte solution that I disallowed. There's also a 2-byte solution which I disallowed with the rule about the specification backend. Hint: Iterating through a list or iterating like you did is permitted. \$\endgroup\$
    – user42649
    May 26, 2017 at 19:52
  • \$\begingroup\$ Ah, now I see. This would probably get 50 submissions in 10 minutes, have fun with the clogged inbox :P \$\endgroup\$
    – MD XF
    May 26, 2017 at 19:53
  • \$\begingroup\$ @MDXF I don't mind :P \$\endgroup\$
    – user42649
    May 26, 2017 at 19:53
  • 4
    \$\begingroup\$ I don't think this question would be closed, but I have to voice my dislike for this challenge. I am not a fan of banning builtins in the first place, I feel it has a number of issues. My main problem is it is hard to enforce/judge when someone is using a builtin. This challenge is going to take that and push it to its limits. I feel that this for this question to work you would need a very solid definition of what a built in is and I don't think such a thing can be made. \$\endgroup\$
    – Wheat Wizard Mod
    May 27, 2017 at 0:24
  • \$\begingroup\$ @WheatWizard Thank you for your feedback. I will try to get a fully objective way to determine what a builtin is and if I can find one I will mention you again in a comment for your review, and if I can't then this challenge will probably die and be buried by the rest of the sandbox posts because I don't want bad challenges :P \$\endgroup\$
    – user42649
    May 27, 2017 at 0:34
  • \$\begingroup\$ I'd recommend posting this after adding a few rules - in what order do the integers need to be printed? What's the max value y can be? "In a list of some reasonable format" is a bit too broad IMO. \$\endgroup\$
    – MD XF
    Jun 7, 2017 at 20:45
  • \$\begingroup\$ @MDXF I will clarify in the post, thanks. \$\endgroup\$
    – user42649
    Jun 7, 2017 at 22:07
  • \$\begingroup\$ @MDXF "in increasing order" I think I clarified. \$\endgroup\$
    – user42649
    Jun 7, 2017 at 22:07
  • \$\begingroup\$ Looks great! My last suggestion is to make it a bit more readable: The # Challenge right at the top doesn't really add anything. And I'd recommend splitting the paragraph in half, i.e. making If your language has a feature whose specification uses a range... its own paragraph. \$\endgroup\$
    – MD XF
    Jun 7, 2017 at 22:09
  • \$\begingroup\$ @MDXF Yes, that makes it much more readable. Thanks! \$\endgroup\$
    – user42649
    Jun 7, 2017 at 22:10
  • \$\begingroup\$ Also, the # Challenge is the header of the actual question; the title won't be there in the actual post. :) \$\endgroup\$
    – user42649
    Jun 7, 2017 at 22:10
2
\$\begingroup\$

Fence Matrix

Given a positive integer n, output the 2n+1 x 2n+1 "fence"-matrix

0  1  0  1  ...  0 
1  2  1  2  ...  1
0  1  0  1  ...  0 
1  2  1  2  ...  1 
⋮   ⋮  ⋮   ⋮       ⋮  
0  1  0  1  ...  0 

Alternatively you can also return a nested array or print a string (even with other entry delimiters than spaces or none at all) or output a raster image where each entry is represented by one pixel.

Examples

n = 1
0  1  0
1  2  1
0  1  0

n = 2
0  1  0  1  0
1  2  1  2  1
0  1  0  1  0
1  2  1  2  1
0  1  0  1  0
\$\endgroup\$
4
  • \$\begingroup\$ related, but not at all close to a dupe \$\endgroup\$ Jun 7, 2017 at 23:13
  • 2
    \$\begingroup\$ 1. The challenge should specify better about what constitutes a fence matrix. I suggest stating "A fence matrix is a representation of a square matrix where the 0-indexed element at index a of 0-indexed line b has the value a%2+b%2`" \$\endgroup\$ Jun 7, 2017 at 23:25
  • \$\begingroup\$ @fireflame241 This suggests using your particular solution, but there are many more to achieve that. \$\endgroup\$
    – flawr
    Jun 8, 2017 at 8:54
  • \$\begingroup\$ @DestructibleLemon Ha, I would never have seen the connection if you did not point it out :) \$\endgroup\$
    – flawr
    Jun 8, 2017 at 8:54
2
\$\begingroup\$

Anyone who would like may post this challenge to main. Just give credit to @Lordofdark.

How long will I sleep

You need to go to bed, but what you need more is to know how long you will sleep until your alarm rings.

Your task

Write a program or function that takes a time (hours and minutes) as input, and outputs the number of hours and minutes until the next occurence of this time.

Rules

  • In this challenge every clock in 24h format.
  • You must always get the current time for the same timezone; you can assume the input is in this timezone

Input

The input time must be in hours and minutes in any convenient 24h format for your language.
Hours and minutes must always be separated by at least one character

Valid inputs for 8h30:
"8h30"
8H30M
8,30
8 30
[8,30]
...

Invalid inputs for 8h30:
8.5
830
510min

Ouptut

The output is the difference between current time and the next occurrence of the input time (it can only be today or tomorrow).

The same formatting rules apply : hours and minutes separated by at least one character an in 24h format.

Note that the output will always be between 0h00 and 23h59

Examples :

If it is currently 20h10 :

7h30 -> 11h20m
20h -> 23h50m
21h -> 0h50m

Challenge

This is , so the shortest answer in bytes wins. Standard loopholes are prohibited

\$\endgroup\$
9
  • \$\begingroup\$ This is my first challenge so I'm not sure about the I/O rules \$\endgroup\$
    – Fabich
    Jan 31, 2017 at 14:51
  • \$\begingroup\$ Hello and welcome to PPCG! :) Your challenge seems fine, though I recommend specifying that you should use a 24h clock earlier in the post. Aside from that, the "minutes are always two figures" part is a bit odd. Does that mean that if I used the format [8, 30] I would then have to return [8, 05]? Personally I would recommend just saying that hours and minutes have to be separate, as it is simpler and would require less space to show. \$\endgroup\$ Jan 31, 2017 at 17:07
  • \$\begingroup\$ What timezone is the input and the current time? Do we assume UTC? What happens if a language can't get the current time? \$\endgroup\$
    – Artyer
    Jan 31, 2017 at 22:16
  • \$\begingroup\$ @FryAmTheEggman You are right I removed the 2 figures condition, and I specified at the beginning the 24h format. \$\endgroup\$
    – Fabich
    Jan 31, 2017 at 22:58
  • \$\begingroup\$ @Artyer I guess I should add a condition about input and current being in the same timezone. Something like "You must always get the current time for the same timezone; you can assume the input is in this timezone". What do you think I could do for language without access to current time ? \$\endgroup\$
    – Fabich
    Jan 31, 2017 at 23:02
  • \$\begingroup\$ @Lordofdark in general, it's good to not exclude challenges for arbitrary reasons, but in this case there's a very good reason for certain languages to not be allowed. If it can't get the time, it can't compete. \$\endgroup\$
    – Pavel
    Feb 1, 2017 at 0:37
  • \$\begingroup\$ Are multi-character separators allowed in the input format (e.g. 8 hours 30 minutes)? They probably shouldn't be, or people may well figure out a way to put their entire program in the separators and thus get a score of 0 (or however many bytes eval is in their language). \$\endgroup\$
    – user62131
    Feb 8, 2017 at 5:36
  • \$\begingroup\$ @Lordofdark can I adopt this abandoned challenge? \$\endgroup\$
    – user58826
    Jun 9, 2017 at 12:03
  • \$\begingroup\$ @programmer5000 yes you can. Sorry I totally forgot about this \$\endgroup\$
    – Fabich
    Jun 9, 2017 at 13:27
2
\$\begingroup\$

This message is open for anyone to adopt and post to main. For more details, see the chat room or meta post.

Visualized Tree of 3n+1 Conjecture

Originally by @KeyuGan. Thanks for letting me use this!

Introduction

Probably you are already familiar with 3n+1 conjecture (aka Collatz conjecture). As is stated in this golfing problem:

  • Start with an integer n > 1.
  • Repeat the following steps:
    • If n is even, divide it by 2.
    • If n is odd, multiply it by 3 and add 1.

And it is proven that for all positive integers up to 5 * 260, or about 5764000000000000000, n will eventually reach 1.

It is easy to draw a chain of the whole process for an integer (e.g. for 5, the chain is 1<-2<-4<-8<-16<-5).

Task Description

You are asked to print a string of a visualized 3n+1 tree of all chains resulting from positive integers from 2 to n, containing new lines if necessary.

Input and Output

There is only one input n, which can be read from stdin, be a function parameter or from any external sources.

You can safely assume input is valid and does not exceed your language's processing ability. However, your code should be able to deal with inputs of 2 - 446. Under such circumstances, the biggest number involved is 13120.

[Sandbox note: Is 446 a proper minimum ? It turns out to be the largest number in which the biggest number involves is less than 32767]

The output is flexible, as long as:

  • It is a textfile, or a string, or an array of characters, or an array of lines.
  • It contains only 0-9, -, |, <, >, ^, v, spaces or new lines, where <, >, ^, v are for arrows, -, | are for lines.
  • Not hardcoded
  • Correctly visualized and in proper directions (for instance, 1->2->4->8->16->5 and 1-2-4-8-16-5 are not accepted.)
  • All numbers included in the output occur exactly once.
  • All leaves of the visualized tree should lie in the range of 2 ~ n, that is, all numbers in the output must be necessary for the result.
  • the destination of every chain is 1

Besides, the output should meet the following formatting criterion:

  • A number should be arranged horizontally and connected.
  • There should not be horizontally-adjancent digits from different numbers. For instance, in the following example, 17<34 23<46 is OK, while 17<3423<46 is not. Space(s) should be put between the two numbers under this circumstance.
  • There should not be vertically-adjancent digits as well.
  • There should not be zero(es) before a number (such as 0016).
  • There should be only one arrow for a line.
  • The line between two numbers must be straight.
  • As is demonstrated in output, - and | can be omitted if not neccessary.
  • Lines should not be crossed. A solution without crossed lines is proved to be available. A simple explaination is: Thinking in reverse, you can start from integer x, and draw 2x and (x-1)/3 (if result is odd) following x, and repeat the process for every new number. Stop when you have all required integers from 2 ~ n in the graph and erase all unneccessary numbers.
  • You can only draw a line onto and from a number directly, that is, the arrow of the line must be pointing at a digit. e.g. |<--, ^<--, |-- and ^-- are not accepted.
  • The direction of arrows and lines must be correct. e.g. ^- and <| are not accepted.
  • There should not be spaces between arrow and number.
  • There should not be spaces between arrows and lines, neither in lines.

[Sandbox note: Tell me plz if you come up with other loopholes.]

Output is assumed to be printed in a monospaced font (all characters have same width).

Sample

Input

15

Possible Output 1

1<2<4<8<16
         ^
         5<10<20<40<80<160
           ^     ^     ^
           3<6<12|     53<106
                 |        ^
                 13<26<52 35<70
                       ^     ^
                       17<34 23<46
                          ^     ^
                          11<22 15
                             ^
                             7<14<28
                                  ^
                                  9

Possible Output 2

                   15
                   v
                   46
                   v
                   23
                   v
                   70
                   v
                   35
                   v
                   106
                   v
                   53
                   v
                   160
                   v
                   80
                   v
1<2<4<8<16<5<10<20<40<13<26<52<17<34<11<22<7<14<28<9
             ^
             3
             ^
             6
             ^
             12

Possible Output 3

1<2<4<8<16<5     80<160<53<106<35<70<23<46<15
           ^     v
    12>6>3>10<20<40<13<26<52<17<34<11<22<7<14<28<9

Scoring

Your answer should include verifiable output of input 42, without a violation to output requirements. And you should verify your answers with different answers on this page: TBD

[Sandbox note: I will provide a js checker on my site to validate an output.]

Among all accepted codes, shortest code wins.

\$\endgroup\$
8
  • \$\begingroup\$ Smallest output can be a useful winning criterion in some cases, where there is the possibility of continuously finding smaller outputs with little chance of finding an optimal solution. However, in this case the sequence will always be the same, so the winning criterion is how short an output format can be made before being judged unreadable. This has two problems: 1. This will force output formats towards the subjective boundary between readable and unreadable, making judging validity difficult. 2. An output format does not require programming skill. \$\endgroup\$ Oct 22, 2016 at 19:47
  • \$\begingroup\$ You might want to consider taking out the "readable" requirement and just keeping the objective description about adjacent numbers and spacing, as that cannot lead to ambiguity. Then you can use a different winning criterion (such as code golf), and people can be flexible in the output format they choose depending on what allows for the shortest code in their language. \$\endgroup\$ Oct 22, 2016 at 19:56
  • \$\begingroup\$ Looks like I was commenting on the version before your edit - apologies if some of this no longer applies... \$\endgroup\$ Oct 22, 2016 at 19:57
  • 1
    \$\begingroup\$ @trichoplax thanks. I believe your words have convinced me that subjective 'readable' judgement is not that good for this challenge. \$\endgroup\$
    – Keyu Gan
    Oct 22, 2016 at 20:04
  • \$\begingroup\$ @trichoplax I have modified the problem a little bit to take out that requirement \$\endgroup\$
    – Keyu Gan
    Oct 22, 2016 at 20:15
  • 1
    \$\begingroup\$ One way to test that your requirements are objective is to write a validator program that takes the output of a submission as input and indicates whether it is valid. If you can write this program then the requirements are objective, and it will also ensure everyone is working with the same definition. Any problems you run into while writing it will also help to identify any ambiguities in the requirements. \$\endgroup\$ Oct 23, 2016 at 10:51
  • \$\begingroup\$ Can I post this abandoned proposal? \$\endgroup\$
    – user58826
    Jun 9, 2017 at 12:50
  • \$\begingroup\$ @programmer5000 Sure. Mention me if it doesn't bother you. XD \$\endgroup\$
    – Keyu Gan
    Jun 9, 2017 at 13:26
2
\$\begingroup\$

Perfect Hash Generator

Given N words you are to generate a perfect hash function (ala gperf). A perfect hash function for a set of strings is a hash function with no collisions. An additional condition is that the range of the generated hash function must be [0...O(N)] (i.e. at most a constant times larger than N). You can use any language for the generated function.

Can we get some feedback on this old post? I'm wondering if it is possible to avoid the obvious loophole of a cat program.

\$\endgroup\$
2
  • \$\begingroup\$ Sounds good at first blush. Do you foresee this as a [code-golf] or some more extensive challenge? If the later what metric would be used to judge it? I think that evaluation of results for compliance is easy enough if the resulting hashes are composed into programs---in unix: entry < testfile > hash_program && hash_program < testfile | sort -u | wc -l and compare to wc -l testfile---but less obvious if the submitters don't provide a scaffold (and if they do should it be counted toward length in the event that this is a [code-golf]?). \$\endgroup\$ Jun 22, 2011 at 1:24
  • \$\begingroup\$ Perl solution, 2 bytes (1, plus 1 for -pE instead of -E): ; Or, wait, did you mean that our program has to print another program that generates a hash? Then say";" I suppose, at 6 bytes. \$\endgroup\$
    – msh210
    Jun 16, 2016 at 14:52
2
\$\begingroup\$

This message is open for anyone to adopt and post to main. For more details, see the chat room or meta post.

Find the mines!

Tags:

You are a mine remover. Your job is to find all mines on a field, without a mine explodes. So, you write an application that can find the mines carefully.

The input

The input can either be provided through command line arguments or through STDIN (tell what you use in your submission). The input items are separated by commas.

The input looks like this:

<current step (zero-based)>,<mine count>,<field width>,<field height>,<field data>

The field data is like a Minesweeper field. Rows in the field data are separated by semicolons, columns are separated by nothing, as each column is just one character. Here are the characters you can get:

  • X This means that you don't yet know what's there, the real data is still hidden. At the start, you get a field full of Xs.
  • / This means that there is nothing on that location.
  • <number> Specifies the count of mines around the location of the number.
  • F This is marked by a flag by you.
  • ? This got a question mark from you. There might be a mine on it, but you are not sure. This is just used as a reminder for you, it doesn't mean something specific to the controller.

Example input:

2,1,3,3,XX1;X1X;XXX

That input means that it's currently your third step, there is one mine, the field is 3x3, and the field looks like:

X X 1
X 1 X
X X X

The output

The output consists of 4 parts: the X of which you want to see the data (like a click in Minesweeper), the location on which you want to put a flag mark, the location on which you want to put a question mark and a sign, used to let the controller know whether you are finished or not (0 for not finished, 1 for finished). Locations are written as X;Y, zero-based. If there is something you don't want to do, output -1. You can also remove flags/question marks using the same way.

Example output:

4;3,-1,3;3

Specifications

  • If your first output data is the location of a mine, you hit the mine and you die, but you'll still get a score.
  • If you select a X which hides an empty location (/), all adjacent empty fields (and their borders, which are numbers) will be revealed.
  • For every step, your program is executed again with the updated arguments.
  • When looking for mines, you are allowed to have more flags than the amount of mines. Only if you finish, the amount of flags must not be more than the amount of mines. If the amount of flags is greater than the amount of mines, your submission is disqualified (for every test!) and excluded from the scoreboard.

Testing

When I test your submission, I'll run 100 tests on every submission, with randomly generated fields, which I created using a program that I'll write after I got some feedback. Every submission gets the same test fields, so it's fair. Test fields look like this:

  • 10 tests with a 10x10 field and 10 mines.
  • 10 tests with a 10x10 field and 12 mines.
  • 10 tests with a 12x12 field and 14 mines.
  • 10 tests with a 15x10 field and 16 mines.
  • 10 tests with a 15x15 field and 35 mines.
  • 10 tests with a 20x20 field and 40 mines.
  • 10 tests with a 25x25 field and 50 mines.
  • 10 tests with a 25x25 field and 60 mines.
  • 10 tests with a 50x50 field and 100 mines.
  • 10 tests with a 50x50 field and 125 mines.

Scoring

You get 10 points for every mine you find, you lose 5 points if you think there is a mine somewhere when there is none and you lose 2 points for every mine you missed. The scoring is always the same, it doesn't matter whether you finish or die. The highest score wins.

In case of a tie, the count of steps is a tie breaker.

Controller

I'll start working on this after I got some feedback.

\$\endgroup\$
15
  • 1
    \$\begingroup\$ You say "like Minesweeper" a couple of times, but on a cursory read I didn't see anything which differentiates it from Minesweeper. Why is this not a dupe of codegolf.stackexchange.com/q/24118/194 ? \$\endgroup\$ Jul 24, 2014 at 14:58
  • \$\begingroup\$ @PeterTaylor You are right, only the winning criterion is different. As there is many discussion going on about these dupes with only a different winning criterion, I'll wait for some more opinions about whether it is different enough or not. \$\endgroup\$
    – ProgramFOX
    Jul 24, 2014 at 15:08
  • \$\begingroup\$ Maybe you could distinguish it by more than just the winning criterion. How about something crazy like a 3d grid of cubes where you can only access cubes that can be reached from the outside, so you slowly clear it from the outside in. \$\endgroup\$ Jul 28, 2014 at 22:36
  • \$\begingroup\$ @githubphagocyte I'm not sure what you mean by "where you can only access cubes that can be reached from the outside". \$\endgroup\$
    – ProgramFOX
    Jul 29, 2014 at 6:49
  • \$\begingroup\$ That bit isn't essential - a 3d grid would work without that restriction. What I mean is restricting the cubes that can be uncovered or marked to just those on the outside of the big cube at first. Imagine it like breaking blocks to get through to blocks behind them. \$\endgroup\$ Jul 29, 2014 at 8:58
  • \$\begingroup\$ The equivalent in the 2d minefield would be treating the 2d playing area as an actual field which you have to walk across, so you can't walk to a square you want to test without testing the squares on a path to it first. \$\endgroup\$ Jul 29, 2014 at 9:00
  • \$\begingroup\$ 3d was just my 1st idea - but you could make it different in other ways. You could stick with the integer grid of squares to uncover, but let the mines beneath the grid take on floating point positions. The number in an uncovered square would be floating point because each of the eight squares adjacent to it may contain only part of a mine (which would explode if any of the squares it is overlapping were uncovered). If mines are squares the same size as the grid squares, then it may take 1, 2 or 4 flagged squares per mine, and each flagged square may contain overlap with 1, 2 or 4 mines. \$\endgroup\$ Jul 29, 2014 at 9:03
  • \$\begingroup\$ A simpler change would be to keep everything integer but let the mines be 2x2 squares. \$\endgroup\$ Jul 29, 2014 at 9:09
  • \$\begingroup\$ @githubphagocyte Thanks for your comments! What about just changing it into a 3d grid, but keep the 'normal' rules? Doing what you said about only accessing blocks if you broke the block that hides it looks complicated to implement. Unfortunately, there will still be one problem left: if everyone would post an optimal solution, then the scoreboard will boil down to luck. \$\endgroup\$
    – ProgramFOX
    Jul 29, 2014 at 9:33
  • \$\begingroup\$ Yes I think with the normal rules there will be a clear optimal solution. I guess even working in from the outside there would still be only one objectively best move at each step. \$\endgroup\$ Jul 29, 2014 at 10:03
  • \$\begingroup\$ If you want to avoid the possibility of an optimal solution, there are 2 possibilities. 1.Make it a king of the hill and somehow have bots competing against each other in the same minefield. That way an optimal solution against one bot will be sub-optimal against another. 2.Make a change to the game that makes the search space too large for an optimal solution to be found. Then answers will consist of interesting heuristics and there will be the possibility of continually finding better solutions over a long period of time. \$\endgroup\$ Jul 29, 2014 at 10:05
  • \$\begingroup\$ @githubphagocyte Your KotH suggestion is a good idea, thanks! I'll think of a good way to do this. \$\endgroup\$
    – ProgramFOX
    Jul 29, 2014 at 10:13
  • \$\begingroup\$ I guess just taking turns would work. You'd just need to decide the winning criteria: survivor when the opponent hits a mine / player who identifies the most mine / player who uncovers the most safe squares / ... \$\endgroup\$ Jul 29, 2014 at 10:54
  • \$\begingroup\$ Hello! This looks like a good but abandoned meta post, would you be willing to offer it for adoption? (If you want to, you can still post to main.) Due to community guidelines, if you don't respond to this comment in 7 days I have permission to adopt this. \$\endgroup\$
    – user58826
    Jun 9, 2017 at 16:54
  • \$\begingroup\$ Hey @programmer5000, feel free to adopt it. \$\endgroup\$
    – ProgramFOX
    Jun 9, 2017 at 16:55
2
\$\begingroup\$

Inspired by lifecompetes.com

Multiplayer Game of Life (GOL)

There are n players that play the Game of Life (standard rules) on an 50 x 50 grid. (Size, border conditions? Toroidal, Absorbing, Mirroring?)

Before first GOL-Step

When the game starts, each player has 12 cells that he can place anywhere he want as long as they do not overlap. Before the first GOL-step occures every player has to place 6 cells. If two players place their cell on the same spot no cell wil be placed an thei cells will remain in each players bank.

During game

In each GOL-Step, each player can place as many new cell on the grid as he has in his bank. If two or more players want to place a cell on the same spot, no cell will be placed there (the cells will remain in each players bank). Every six GOL-steps all the players who have less that 12 cells in their bank will get a new cell in their bank.

Goal

The goal is achieving the maximum number of cells on the grid during 1000 GOL-steps.

How to participate

Each participant has to write a javascript function of the following form (multiple return statements allowed.)

function my_bots_name(field, bank, golstep){
  /* your code */
  return p;
}

Where p is a 2d array of points [[x1,y1],[x2,y2],[x3,y3],...] that the player wants to set. field contains a 2d array of the GOL grid, bank indicates the number of cells in the player's bank, and golstep is the index of the current GOL step (golstep == 0 before the first GOL-step occurs). The function may not the global variables and cannot access Math.random() or Date(). In field the empty cells will be set to 0, the own cells will be set to 2 and the other player's cells will be set to 1. (You will not be able to distinguish between various other players.)

The winner will be determined with a game that contains all valid submissions after one week after the first submission.

TODO

The exact environment will be provided so everyone can test the own function before the official runs.

  • What size of the grid is appropriate? (dependent on number of players?)
  • How many steps should be computed?
  • What border conditions should be chosen?
  • Is the restriction of Math.random() and Date() apropriate? (The idea was that the games will be the same no matter of who/when they will be run. (Deterministic) )
\$\endgroup\$
14
  • \$\begingroup\$ relevant. also relevant. \$\endgroup\$ Aug 6, 2014 at 12:20
  • \$\begingroup\$ It looks like it was abandoned, since the user has not been here for more than a month. I was not able to read everything yet - is there something important that should be considered or is it a challenge that shouln't even be started? \$\endgroup\$
    – flawr
    Aug 6, 2014 at 13:03
  • \$\begingroup\$ I just thought you might want to have a look to get some inspiration from a previous spec. \$\endgroup\$ Aug 6, 2014 at 13:09
  • \$\begingroup\$ Ok thank you, I wil read them later. \$\endgroup\$
    – flawr
    Aug 6, 2014 at 13:21
  • \$\begingroup\$ What do you mean by "standard rules"? The standard rules for Life have binary cells, and this doesn't. \$\endgroup\$ Aug 7, 2014 at 22:07
  • \$\begingroup\$ Well each cell of the grid can have two states: occupied by a live cell or not. For executing a GOL-Step it does not matter which cell is of which player, they are all treated the same. (As it is in lifecompetes.com) \$\endgroup\$
    – flawr
    Aug 7, 2014 at 22:15
  • \$\begingroup\$ What happens to an empty cell that has 3 neighbours of different players? Are new cells only born if they have 3 neighbours of the same player? \$\endgroup\$ Aug 10, 2014 at 20:23
  • \$\begingroup\$ Thank you for pointing this out, I did never think about this special case but I just checked livecompetes and they handle this as follows: A new cell is born if two or three of the neighbours are from the same player. If there are three different players invovled the space remains empty. \$\endgroup\$
    – flawr
    Aug 10, 2014 at 20:40
  • \$\begingroup\$ why n players instead of 2 players? \$\endgroup\$
    – Sparr
    Aug 18, 2014 at 4:31
  • 1
    \$\begingroup\$ Can you provide some thoughts why only two players would make a better game? If you could start it with n players at once you can let all submissions compete against each other as you do in the original lifecompetes.com \$\endgroup\$
    – flawr
    Aug 18, 2014 at 8:11
  • \$\begingroup\$ @programmer5000 Yes, feel free to adopt! Just make sure work out the details in the sandbox before posting. If you want me to help in one way or another, just ping me! \$\endgroup\$
    – flawr
    Jun 9, 2017 at 17:43
  • \$\begingroup\$ Can you add support for other languages? \$\endgroup\$ Jun 9, 2017 at 18:46
  • \$\begingroup\$ @programmer5000 I thought you wanted to adopt it?!? \$\endgroup\$
    – flawr
    Jun 9, 2017 at 19:32
  • \$\begingroup\$ Please next time say that you want to list it for adoption rather than adopting it yourself! \$\endgroup\$
    – flawr
    Jun 9, 2017 at 19:39
2
\$\begingroup\$

This message is open for anyone to adopt and post to main. For more details, see the chat room or meta post.

Edit: I'll have to clarify the optional features and there may be more. Essential I want to have the basic features covered, and if anything beyond gets implemented because it saves characters that is okay, but not required.

Edit: Updated but still working on it. Will definitely include edge cases and more examples as test cases.

Edit: It might be cool to have this implemented as a function, and then have some follow up questions where you are allowed to call the function created here while only counting the function call as characters, and not the contents.

Still working on the specifics, but getting it the idea out there.


2-Dimensional Regex

Given a 2-Dimensional regex and a block of text, do a match, a single search and replace or a global search and replace depending on the input.

Implement this as a function. The input should be two arguments to the function. The first is the regex, and the second argument is the string to match. The output should be a truthy or falsey value when doing a match, or the string when doing a search and replace.


Match

Input:

/aaa/
/bbb/
/ccc/

and

aaaab
dbbba
ecccc

Output:

A truthy value

Single Search and Replace

Replace the first instance of the match. The search order is the match that includes the top most character. If multiple matches end up with the top-most character on the same line, then include the left-most match.

Input:

s/bb/cc/
 /bb/cc/

and

abbaabba
bbbaabba
bbbaaaaa

Output:

accaabba
bccaabba
bbbaaaaa

Global Search and Replace

Replace all occurrences of the match. Matches do not overlap, and you use the same search order as the single search and replace.

Input:

s/bb/cc/
 /bb/cc/

and

abbaabba
bbbaabba
bbbaaaaa

Output:

accaacca
bccaacca
bbbaaaaa

Another example:

Input:

s/aba/bbb/
 /aba/aba/
 /aba/bbb/g

and

aaaabaaaa
  aabaababa
aababaababa
aabaaabbaba
 aba

Output:

aaabbbaaa
  aabaabbbb
aabbbbababa
aabaaabbbbb
 aba

Rules

  • Only ASCII characters 32 through 126 are valid.
  • Character classes are valid, [a-c4-6] would match an a,b, c, 4, 5, or 6. And [b?7] matches one b, one ?, or one 7.
  • . matches any character.
  • Use \ to escape there special characters to match their literal character instead of their special meaning: {}[]/\.?*.
  • a? matches 0 or 1 a's.
  • b+ matches 1 or more b's.
  • c* matches 0 or more c's.
  • b{2} matches 2 b's. Ranges such as {2,5} to match 2 to 5 b's is optional.
  • g flag replaces all of the occurrences, without it only the first occurrence would be replaced. This flag is optional.

Optional features:

  • Capture groups are optional. Please specify whether to use () or \(\) to match literal parenthesis.
  • Grouping such as (ab)+ matching all of abababab.
\$\endgroup\$
11
  • \$\begingroup\$ Sounds interesting, but apart from the character-class and . addition it's very similar to codegolf.stackexchange.com/questions/37867/programmers-garden. Some specifics you should clarify (I know you're still working on it, but before I forget it...): Is the regex always rectangular? Are regex and replacement equal in shape? And make sure to specify that matches found with g never overlap. \$\endgroup\$ Sep 17, 2014 at 17:04
  • \$\begingroup\$ First occurrence with which search order? What about all the other things which make up a regex (in particular, full alternation and repetition)? \$\endgroup\$ Sep 17, 2014 at 17:13
  • \$\begingroup\$ @MartinBüttner I got the inspiration for it while working on the garden one since 2-D regexes would help a lot with that problem! I think it would be cool to implement a lot of regex features and that would be a different problem. /i for case insensitive, maybe even capture groups. The replacement could be a different size than the match (I'll have to define how that affects making a previous match now invalid while using /g). \$\endgroup\$
    – hmatt1
    Sep 17, 2014 at 17:58
  • \$\begingroup\$ @PeterTaylor I'd love to define and add other regex features, but I don't want to make the challenge too hard. I'll think about how to implement repetition and non-rectangular searches. Definitely interested in hearing ideas about making this interesting and feasible! \$\endgroup\$
    – hmatt1
    Sep 17, 2014 at 18:00
  • \$\begingroup\$ As far as overlapping matches goes, it might be okay to have that in the input, but then have the one that would get replaced would be the first in whatever search order we end up choosing. \$\endgroup\$
    – hmatt1
    Sep 17, 2014 at 18:02
  • \$\begingroup\$ If the only regex features you have are a small subset of character classes, it's potentially misleading to call it a regex problem at all. It might be less confusing to talk about 2D pattern matching instead. \$\endgroup\$ Sep 17, 2014 at 21:11
  • \$\begingroup\$ @PeterTaylor I'm planning on adding more regex features. Good point though! Thanks! \$\endgroup\$
    – hmatt1
    Sep 17, 2014 at 21:16
  • \$\begingroup\$ Having implemented a large part of the ECMAScript regex flavour before, let me tell you that a) getting the spec right and b) implementing regular expressions is a lot of work. Starting with your spec: is repetition greedy? You've got character classes with ranges - what about invalid ranges? What about - at the beginning or end of the string? What about character class negation? What about []? Likewise, what about invalid {m,n} quantifiers? Also, I'd definitely leave out grouping and capturing - that complicates things significantly. \$\endgroup\$ Sep 24, 2014 at 22:17
  • \$\begingroup\$ Added to that are the difficulties from the fact that your regex is 2D. How do I specify that the stuff in two lines is repeated the same amount of times? E.g. if I want to match an n x 2 block of as, I couldn't just write a+ in two lines, right? Because the +s are technically independent. What if there's a + in one line and no + in another? etc... \$\endgroup\$ Sep 24, 2014 at 22:19
  • \$\begingroup\$ @programmer5000 you are welcome to adopt this! \$\endgroup\$
    – hmatt1
    Jun 9, 2017 at 19:36
  • \$\begingroup\$ The second and third examples are the same. \$\endgroup\$ Jun 11, 2017 at 4:38
2
\$\begingroup\$

Sandbox

This will be my first kolmogorov-complexity submission, does this question fall under that category?

Is the question clear enough?

Is it too trivial?

Problem

Given no input write a program or a function that outputs or returns the following string:

(<(<>(<>.(<>.<(<>.<>(<>.<>)<>.<>)>.<>).<>)<>)>)

Rules

  • Shortest program wins.
  • Trailing whitespace allowed.
  • Trailing newlines allowed.
  • Unused parameters for functions allowed.
\$\endgroup\$
4
  • \$\begingroup\$ Can you give more context to the string you're outputting, its significance etc? \$\endgroup\$ Jun 15, 2017 at 11:24
  • \$\begingroup\$ It's a poor ASCII representation of a crowd of blank stares a single person being (<>.<>) \$\endgroup\$
    – LiefdeWen
    Jun 15, 2017 at 11:25
  • \$\begingroup\$ a more common representation being (-_(-_(-_(-_(-_-)_-)_-)_-)_-) \$\endgroup\$
    – Mayube
    Jun 15, 2017 at 11:28
  • \$\begingroup\$ @Mayube Yes, I just used a broader face so the outputted string is longer \$\endgroup\$
    – LiefdeWen
    Jun 15, 2017 at 11:29
2
\$\begingroup\$

Implement Nopfunge

Background

Nopfunge is a very simple Befunge derivative, with no stack and no real form of data storage; all it has is an instruction pointer and five commands ("turn north", "turn south", "turn east", "turn west", "continue in same direction"). However, what it does have is a program that repeats forever in two dimensions, which turns out to be enough to make it Turing complete.

The task

Your program must take, as input, four 2D arrays of characters, a, b, c, and d, via any reasonable means. Each of these will have the same dimensions, and they will be rectangular (although not necessarily square). (Note: This is a simplification from the actual syntax of Nopfunge, but is still just as Turing-complete.)

The program will then conceptually work on an infinite array formed out of sub-arrays identical to the inputs, formed by placing a in the top left corner, b along the top edge, c along the left edge, and d everywhere else, like this:

abbbbbbb …
cddddddd …
cddddddd …
cddddddd …

⫶⫶⫶⫶⫶⫶⫶

(Note that because you can't assume your language can do infinite work in finite time, you won't be able to actually represent the compressed array in memory, so you won't be able to calculate the value at a particular coordinate pair in advance; rather, you'll have to calculate it lazily and/or every time it's needed.)

Then simulate the progress of a Nopfunge program on this array. Specifically, there's an instruction pointer that has a position on the array, and a direction; it starts at the top-left corner, going to the right. Repeatedly, run the command specified by the character at the instruction pointer:

  • >: Move the instruction pointer one position to the right; it now points right
  • <: Move the instruction pointer one position to the left; it now points left
  • ^: Move the instruction pointer one position upwards; it now points up
  • v: Move the instruction pointer one position downwards; it now points down
  • (space): Move the instruction pointer one position in its current direction

Should the instruction pointer ever attempt to move outside its infinite array (by moving above the top edge or to the left of the left edge), your program should exit. If the instruction pointer never attempts to move outside its infinite array, the program should never exit. (Or in other words, the task is to halt if and only if the Nopfunge program does.)

Clarifications

  • You can input the arrays as arrays of character codes (i.e. integers) rather than characters if you wish, but if you do, they must use the ASCII/Unicode encodings, 62 60 94 118 32 for > < ^ v .
  • Your program can do anything if the input arrays aren't all the same size or aren't rectangular.
  • You may take additional inputs for the dimensions (width and height) of the input arrays, if you wish.
  • It doesn't matter what (if anything) your program outputs; all that matters is whether or not it halts.

Victory condition

This is , so shorter programs (in bytes) are considered to have a better score.

Sandbox questions

  • Is the specification easy to understand and unambiguous?

  • Is this the best possible input format? I wanted to avoid the secondary task of having to parse Nopfunge's input format (which uses = and ; to split one array into the four given here), but am not sure whether this format or that one is more convenient for solving the task.

\$\endgroup\$
1
  • \$\begingroup\$ Note so I don't forget: it was pointed out in chat that test cases will be helpful. \$\endgroup\$
    – user62131
    Jun 21, 2017 at 10:15
1
28 29
30
31 32
145

You must log in to answer this question.

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