573
\$\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\$
2
  • \$\begingroup\$ What if I posted on the sandbox a long time ago and get no response? \$\endgroup\$
    – None1
    Commented May 15 at 14:05
  • \$\begingroup\$ @None1 If you don't get feedback for a while you can ask in the nineteenth byte \$\endgroup\$
    – mousetail
    Commented May 29 at 13:27

4766 Answers 4766

1
62 63
64
65 66
159
1
\$\begingroup\$

Sample the Sierpinski traingle

Inspired by this video..

Task

Your task is to implement the following method to sample a Sierpinski triangle and plot all the intermediate steps.

Method

Given three points a,b,c and some starting point x_0, for each iteration you sample one of the three points a,b,c with equal probability. You then place x_{i+1} in the middle of the edge between x_i and the sampled point. Repeating this draws the Sierpinski triangle.

Input

You'll receive the coordinates of the three starting positions through any default accepted input method. The exact format can be flexible: a matrix, a list per point [xa,ya],[xb,yb],[xc,yc], a list for x and y [xa,xb,xc],[ya,yb,yc], a flat list [xa,ya,xb,yb,xc,yc] are all allowed.

The starting point x_0 is [0,0]. You can assume [0,0] would fall within the overall shape.

Output

For each iteration, including the initial, draw a plot of all the points up to that point. There should at least be a 100ms delay between two plots. If your language does not support graphical displays, you can also write your images to a file.

Since the triangle is an infinite fractal, the program should loop forever (given infinite memory and all that jazz).

Criteria

Shortest code wins!

Example code (R)

Sierpinski <- function(p, q) {
  x11()
  par(mar = rep(0, 4))
  plot(p, q, col= "red", pch = 15, cex = 1, axes = FALSE)

  x <- 0
  y <- 0

  repeat {
    Sys.sleep(0.1)
    n <- sample(1:3, 1)
    x <- floor(x + (p[n] - x) / 2)
    y <- floor(y + (q[n] - y) / 2)
    points(x, y, pch = 15, cex = 0.5)
  }
}

enter image description here

Meta

  • Duplicate? There are a couple 'draw a sierpinski triangle' challenges, but I couldn't find any that use this method of drawing them.
  • Is the specification of the algorithm clear enough or should I add pseudocode?
  • Is the 100ms delay between iterations reasonable?
\$\endgroup\$
1
  • \$\begingroup\$ What do you guys think? Is this sufficiently different from this existing one (codegolf.stackexchange.com/questions/38173/play-the-chaos-game)? Mine adds actually showing the animation of the game in progress, but I am not sure if that is different enough. \$\endgroup\$
    – JAD
    Commented Jun 16, 2017 at 20:18
1
\$\begingroup\$

Cops & Robbers, the ultimate 1-up.

This is a cops and robbers game.

Cops

Hello, cops. you've just solved a Code Golf challenge on the stack exchange website. How wonderful. You go to post your answer, and soon after a robber comes and beats you by 1! How infuriating!

Your task:

Produce two programs.

The first program can be in any language, of any length, and cannot use default loopholes. it does one thing: Prints out a number.

The second program must use the same language as the first, must use less bytes than the first, and CAN use forbidden loopholes. The second program must print out a number which is equal to 1+ the output of your first program

post your first program and wait 7 days. If someone cracks your program within those seven days by robbing you, please edit your answer to include [cracked] in the header. If your program is not cracked, you can edit [safe] in the header.

Robbers

Hello, robbers. You're sneaky and looking for ways to win a golf, even if it's underhanded. You see that a cop has posted a golf for a decent score, and decide to take the lead from them.

Your task is to take a cop's answer, and beat it. Your program must use less bytes than the cop's answer and print out a number equal to only 1+ the cop's answer. You're program must also be in the same language as the cop's answer. You may use underhanded tricks and loopholes to solve the challenge. Once you complete this, you may post your solution and let the cop know they've been beat.

Example I Os

cop: 16
robber: 17
Correct: Yes!

cop: 16
robber: 16+1
Correct: Yes!

cop: 16
robber: 16.1
correct: NO! (alternative symbols for '+' are not allowed)

cop: 16
robber: 18-1
correct: Yes! (evals to 17)

cop: 16
robber: [234,32,54,17,45,23]
correct: NO! (output must be exact).

cop: 16
robber: "1+ the cop's answer" [OR] "a number equal to only 1+ the cop's answer"
correct: NO! (smartassery is not a loophole)

cop: 16.001
robber: 17
correct: NO! (16.001+1 <> 17)

EXCLUSIONS: you may use any underhanded trick / loophole you want, BUT your output must match the description exactly. no new line. no trailing space.

The following loopholes are still forbidden:

\$\endgroup\$
8
  • 3
    \$\begingroup\$ Open season on loopholes is a bad idea. E.g. for languages with short builtins for HTTP GET it becomes a search for the shortest URL shortener rather than a code golf. \$\endgroup\$ Commented May 23, 2017 at 7:33
  • \$\begingroup\$ @PeterTaylor howso? the robbers must use the same language as the cops, so if you don't want to have yours cracked, use a language that doesn't support GET requests (or atleast not simply). \$\endgroup\$
    – tuskiomi
    Commented May 23, 2017 at 18:34
  • 3
    \$\begingroup\$ You need to explain cops-and-robbers rules here, in case people haven't seen them before. In particular, I'm assuming that the cop posts are required to be crackable, in which case you need to mention that the cop must keep the second program secret, but reveal it when marking the post as safe. \$\endgroup\$
    – user62131
    Commented May 24, 2017 at 2:39
  • \$\begingroup\$ The Your Task bit isn't clear, I think you mean the end result of a cracked submission will have two programs but it kinda reads like the cops have to write two programs. \$\endgroup\$
    – Notts90
    Commented May 25, 2017 at 9:18
  • 4
    \$\begingroup\$ "no new line. no trailing space." Why ban trailing newlines? \$\endgroup\$ Commented May 31, 2017 at 15:09
  • \$\begingroup\$ As a robber, can output the string a number equal to only 1+ the cop's answer? \$\endgroup\$
    – user58826
    Commented Jun 15, 2017 at 15:37
  • \$\begingroup\$ @programmer5000 no, smartassery is not a loophole. \$\endgroup\$
    – tuskiomi
    Commented Jun 15, 2017 at 15:38
  • 1
    \$\begingroup\$ @tuskiomi actually, it's the most voted of them all \$\endgroup\$
    – user58826
    Commented Jun 15, 2017 at 15:50
1
\$\begingroup\$

Beat the turing test

Both you and your bot have to connect to a speed dating chatroom (details below) where you will either be paired up with another bot, or with another human. You get 30 seconds to converse with your partner before you are disconnected, and are presented with the choise of wether you think the person you spoke with is a human or not.

This process will be repeated in a round robin fashion for a maximum of 10 minutes, or until everyone has spoken with everyone. You will not be paired with your own bot.

You will be given an equal number of votes for human/robot, as you will be facing an equal number of each. Both you and your bot will be given the option to change these after the conversations.


Scoring

Robots get 2 point for fooling a robot, and 5 points for fooling a human. Humans are not awarded any points for correct guesses, but lose 2 points if they are wrong.


Rules

  • Bots may the internet aswell as external datafiles
  • Gentleman's rule: Please do not pretend to be a robot. If every human said nothing but Beep beep, I am a robot it would ruin the challenge for everyone.

Meta

This will be a one-time event on a specific date. There will be a webapp for humans and an API for bots. Until the final date there will be a sandbox site online for testing purposes. I am still undecided on the specifics of the API, and on how long the timespan between posting the challenge and running it should be.

I can also run (some) bots locally, communicating on stdin/stdout

\$\endgroup\$
5
  • 2
    \$\begingroup\$ Can't a human just accuse everyone of being a robot, thus preventing points from being gained? \$\endgroup\$
    – Neil A.
    Commented Jun 22, 2017 at 21:49
  • 1
    \$\begingroup\$ I suspect that participation in this will be very low (as it's a highly difficult task), which is a problem for a challenge that inherently has a deadline. Stack Exchange might not be the best place to run this. \$\endgroup\$
    – user62131
    Commented Jun 23, 2017 at 2:47
  • \$\begingroup\$ @NeilA. You are absolutely right. I think my new scoring system fixes that, but ultimately I rely on participants being honest to make this a fun challenge, which is why I think Stack Exchange is a good place to do this \$\endgroup\$
    – BlackCap
    Commented Jun 23, 2017 at 18:04
  • 1
    \$\begingroup\$ 1. Timezones are an issue. 2. You need to clarify the sequence. Do I have to call bot/human immediately after the conversation, or do I have all the conversations first and then call? 3. I suspect that even the recently raised 60k character limit to answers could be a problem for writing a sophisticated bot. Can answers use additional data files stored somewhere public such as github? \$\endgroup\$ Commented Jun 23, 2017 at 21:26
  • \$\begingroup\$ @PeterTaylor I think allowing you to change votes at the end would make programming bots more fun because you can compare the conversations against each other to determine humaness. Nice point \$\endgroup\$
    – BlackCap
    Commented Jun 23, 2017 at 21:55
1
\$\begingroup\$

Repetitive Primes

A repunit in any base B is a number consisting solely of 1s in that base.

Your task is to figure out if a repunit of length f N in base B is a prime number.

Rules

  • N >= 2
  • B >= 1
  • N and B may be taken in any order and in any reasonable method.
  • Output a consistent value to indicate primeness and a different consistent value to indicate compositeness.
  • Programs and functions are acceptable.
  • This is code golf, shortest code in bytes wins.
  • Standard loopholes apply

Test cases

B, N => Result

2, 7 => prime
1, 97 => prime
10, 19 => prime

9, 11 => composite
20, 10 => composite
7, 23 => composite

Meta questions

  • Dupe? Unclear? Too broad? etc.
  • Would this be a better question with a different winning criterion such as ?
  • Should I change the title?
  • Any other constructive criticisms?
\$\endgroup\$
5
  • \$\begingroup\$ I don't think fastest-code would be a good fit, code-golf should work just fine. You can also add base-conversion and decision-problem. I suggest appending "Primes" to the title. \$\endgroup\$
    – Laikoni
    Commented Jun 23, 2017 at 13:20
  • \$\begingroup\$ 1. "repunit consisting of N in base B" feels to me as though it's missing 1s, although perhaps a better phrasing would be "repunit of length N in base B". 2. Although it's easy to show that N must be 1 (which is not valid input) or prime, the test cases should still include at least one where N is composite. \$\endgroup\$ Commented Jun 23, 2017 at 17:48
  • \$\begingroup\$ @Laikoni: I agree it might be an interesting code-golf question, but I also want to see people use cool optimizations such as the length must be prime, or base 9 doesn't have any repunit primes, etc. as opposed to everyone using a base conversion followed by slow trial division. \$\endgroup\$
    – Neil A.
    Commented Jun 23, 2017 at 22:40
  • \$\begingroup\$ Slow trial division? Golfing languages will use the isPrime builtin, which probably uses BPSW or Miller-Rabin with carefully selected bases. \$\endgroup\$ Commented Jun 24, 2017 at 22:52
  • \$\begingroup\$ This is actually relatively simple to solve. You just need to check whether ((N + 1) % B) == 0 \$\endgroup\$
    – Okx
    Commented Jun 26, 2017 at 16:16
1
\$\begingroup\$

Monopoly KoTH

This is going to take me a while to finish and may never be fully done. Don't expect this to be posted anytime soon. However, this will be an ongoing project under development.


Who hasn't heard of Monopoly? If not, don't worry, as I will explain the rules! If you already know the rules, read on, for they may be different in this rendition.

The Rules of Monopoly

Monopoly is played on a board, with 36 different squares, that looks somewhat like this

monopoly board

For this version, we'll use the original British version, because I'm British and proud of it!

Squares are split into 3 categories:

  • Property. These are the ones with a coloured bar at the top, such as Old Kent Road or Whitehall. They also include the 4 stations in the middle of each side, and the utilities (Electric Company and Water Works)
  • Bonus Cards. These are the squares marked Community Chest or Chance. These allow for a player to either receive or lose money, depending on a random card choice.
  • Special Squares. These are the 6 other squares in the board, the 4 corner squares and the taxes (boo!)

Let's look at these categories in a bit more detail.

Property

Properties are grouped, depending on the colour of said property. Each property has a rent value that contains the amount that a player must pay to the owner of the property, when they land on that property. If one player owns all of the properties in one colour, the rent for each is doubled.

Players can also buy properties, which is how they own them. Each property also has a price, which is then deducted from the buyer's cash and given to the Bank, in exchange for the property. Stations cost £100 each and all other properties available to buy have their cost written below their square.

Stations' rent increases the more stations that someone owns. In the following progression

  • 1 Station: Rent = £25
  • 2 Stations: Rent = £50
  • 3 Stations: Rent = £100
  • 4 Stations: Rent = £200

Utilities' rent depends on the dice roll. If a player owns 1 utility, multiply the roll by 4 and that is the rent. If the player owns both, multiply the roll by 10 to get the rent due.

Properties can be built on. That means that a player builds houses and hotels on them, in order to increase that properties rent. A player can build houses and hotels on a property if

  • it has a coloured bar at the top
  • the player owns all of the properties in the group
  • they have enough money. Each house costs £50 and each hotel costs £100.

Each property can have a maximum of 4 houses. After that, the player must build a hotel. A property can only have 1 hotel on it. Houses and hotels drastically increase the rent of a property, for example £4 (no buildings) to £450 (one hotel).

Bonus Cards

The name of these are a bit of a misnomer. These are denoted on the board by ? symbols and chests on squares and can either give or take money from you. For this game, we will ignore Get Out of Jail Free cards and the Goto cards. The cards can result in a random integer between -1000 and 1000 added to your score. If this results in bankruptcy (we'll see this later), so be it.

Special Squares

  • Go. If you land on Go, you get given a £400 reward. If you simply go past it (Mayfair -> Old Kent Road), you get £200. It's also where the pieces begin.
  • Jail. If you roll and land on this square, don't worry, as you don't go to jail. You are "Just Visiting"
  • Free Parking. This is where the taxes go! If you have to pay taxes, either because of the Tax squares or because of a Bonus Card, that money goes to Free Parking. If a player lands on it, they get all the money there!1
  • Go to Jail. This does what it says on the tin. You go straight to Jail. But this time, you're in Jail, not just visiting. You stay in Jail until you roll a double.1 After which, game continues as normal. You cannot collect rent while in Jail.
  • Taxes. Super Tax and Income Tax are two squares which charge you £100 and £200, respectively. However, you can regain that money as it goes straight to Free Parking!

Bankruptcy

In Monopoly, if you run out of money, you are bankrupt. Here, you have two options. You can either mortgage your properties or, if you don't have any, you are out of the game! The last one with any money wins the game and the KoTH!

When you lose, all your properties go to the player who bankrupted you. If that's the Bank by virtue of Bonus Cards, then all your properties are available to be bought again.

Mortgage

You can mortgage properties in order to get more money if you're in a pinch. Unfortunately, this "deactivates" the property, meaning that you don't get any rent when people land on it. If you have enough money, you can unmortgage a property for 110% of its mortgage value. (£100 -> £110)

Auctions

If you land on an unbought property and don't buy it, either because you don't have enough or you just don't want to, the property goes on auction. This means that all players can bid on the property. Bidding starts at £1, which means that a player can, theoretically, get the property for a much lower or higher price than its original price.

Trading

I am hoping to be able to include trading but this does depend on my ability as a coder. In an ideal world, I will be able to get it working but, unfortunately, this may not happen :(

1: I am aware that this changes depending on who you're playing with, but this is how we'll do it in this version.

Rules of the KoTH

I have written (still finishing) a Player class in Python which contains all of the things that a Monopoly player can do. Your task is to rewrite 2 of the functions that can change your player's behaviour.

While thinking about how to make this KoTH, I listed out the complete process that gives you a chance to change what you do. Let's go over that process! This flowchart shows the process for each turn. Green items show the choices that you have to make.

This is the text version:

1. Roll dice and move
2. Is the property owned by the Bank?
    1. Yes. Nothing happens.
    2. No. Pay the due rent.
3. Choice of:
    1. Buy
    2. Auction
4. Choice of:
    1. Trade
    2. Build
    3. Mortgage
    4. Unmortgage
    5. Move On
5. Repeat until bankrupt

Auction

1. Choice of:
    1. Play the auction
    2. Don't play the auction
2. Are you playing the auction?
    1. Yes.
        1. Choice of:
            1. Bid new max
            2. Skip one round
            3. Skip all rounds
            4. 'All in'
        2. Repeat until 1 player left bidding
    2. No. Don't do anything.

Trade

1. Choose a player to trade with
2. Offer properties and/or money
3. Does the other player agree with the trade options?
    1. No. They counter offer. Do you like their options?
        1. No. Do you want to continue negotiating?
             1. Yes. Go to point 2 above
             2. No. The trade is over.
        2. Yes. You trade the agreed upon items.
    2. Yes. You trade the agreed upon items

But, for you coders out there, I'll explain using a bit of code.

Your submission should contain a single class that inherits from Player. You may add in as many extra attributes as you want, but in order to be used, your code must refer to them. I'm not editing the controller just for your bot to work.

However, each class must look like this

class NameOfPlayer(Player):
    def turn(self, square, roll):
        (code that determines your actions per turn)
    def auction_action(self, price, bidders):
        (code that determines your auction actions)
    def trade_actions(self, players, last_offer):
        (code that determines your trading actions)

    (any other functions you want)

Your turn function will return 3 numbers as a list e.g. [1,2,3] which are the results of the choices above. The first item should be either 1 or 2 (Buy or Auction), the second should be one of 1,2,3, 4 or 5 (of the 4. Choice of: options) and the third should be either 1 (play the auction) or 0 (don't play the auction) such as [1,5,0] would buy the property, move on to the next player and not play the auction on this turn (doesn't matter as there wasn't an auction).

Your auction_action function will return either a number (your bid) or one of a (all in), s (skip this round) or q (quit auction), which determines what you will do on that round of the bidding. This continues until either you quit the auction of you are the only one left.

Your trade_actions function will return a list every time it is called. The list consists of [agree with previous offer (as a bool), properties to trade (as a list), cash to trade (as an int)]. When a trade has just begun, the first item in the list will be ignored and the last_offer parameter will be ignored. The last_offer parameter contains the second 2 items returned by the person you are negotiating with, so that you can decide whether you want to continue trading or not.

If you lose all your money, your program with be taken out of the active players and placed into the results table. The last one standing wins!

\$\endgroup\$
8
  • \$\begingroup\$ I call dibs on the Go submission that always go to jail. \$\endgroup\$
    – Uriel
    Commented Jun 25, 2017 at 16:35
  • \$\begingroup\$ While you are allowed to use the monopoly rules, I'm not sure about using the picture of the board? \$\endgroup\$ Commented Jun 26, 2017 at 4:44
  • \$\begingroup\$ @DestructibleLemon what do you mean? \$\endgroup\$ Commented Jun 26, 2017 at 5:59
  • \$\begingroup\$ If I'm reading this correctly, this is a variant which doesn't allow trading properties, and that's the most interesting part of the game. The rules stated also fail to state what happens to the properties of a player who goes bankrupt. (Correct answer: they must mortgage all of them and then forfeit them to the player to whom they owe rent. I'm not sure offhand what happens if they're going bankrupt due to taxes, but presumably the properties revert to the bank and when someone lands on them they buy or auction). \$\endgroup\$ Commented Jun 26, 2017 at 9:23
  • \$\begingroup\$ @PeterTaylor I'm currently writing the controller and a base class, which will determine what I can and can't allow in the game. Once that's finished and all issues with the controller are sorted out, I will update the rules here to fit with it's capabilities. Also, the version I've played allows for a player to mortgage their properties to avoid bankruptcy (as in you mortgage and if you're still bankrupt, you lose) \$\endgroup\$ Commented Jun 26, 2017 at 13:54
  • 1
    \$\begingroup\$ My point is that unless it's a two-player game, you lose is not a sufficient description because the game needs to continue until there's only one winner. The comment about mortgaging is because if I owe you more money than I can get by mortgaging all my properties, I have to mortgage them and give you the money obtained and the mortgaged properties, and so you have to pay to unmortgage them before you can benefit from them. \$\endgroup\$ Commented Jun 26, 2017 at 14:05
  • \$\begingroup\$ What stops this from going into an infinite loop without a winner \$\endgroup\$ Commented Jul 27, 2017 at 16:12
  • \$\begingroup\$ Feedback copied from TNB: I think this would be way more interesting if the Goto cards were included, and the random amount given/taken was less significant (£1000 is a lot). The Goto cards add a bit of strategy in which properties to buy. Also, my version has the income tax be either £200 or 10% of the player's net worth. Is that different in yours, or is it just removed for simplicity? \$\endgroup\$
    – rydwolf
    Commented Feb 23, 2021 at 5:01
1
\$\begingroup\$

Mutation-hardening quine

Your task is to make a program that prints out its own output.

"Hey, we already have this challenge, and tons of variations of it! Why are you making another one?" you may ask, but this one is going to be one of the most difficult ones.

Your quine must be "mutation-hardened", which means the quine still must work, even after any one of its characters is duplicated in place.

For example, if you have a program:

abcd

These programs must all output abcd:

aabcd
abbcd
abccd
abcdd

(In each of those programs, a, b, c and d are each duplicated in-place, which means the duplicated character was placed directly after the original character.)

Rules:

  • Standard quine rules apply.

This is , so shortest code in bytes wins!

Meta:

  • Is this challenge too hard?
  • What other rules should I put up?
\$\endgroup\$
3
  • 2
    \$\begingroup\$ Is this even possible? \$\endgroup\$
    – Shelvacu
    Commented Jul 1, 2017 at 22:57
  • \$\begingroup\$ For hard problems, try to find at least one solution. \$\endgroup\$
    – Maya
    Commented Jul 2, 2017 at 17:50
  • 1
    \$\begingroup\$ @Shelvacu It doesn't have to be \$\endgroup\$ Commented Jul 14, 2017 at 17:21
1
\$\begingroup\$

Make a Quiz Parser

Your task is to create a program that will take an input of multiple 4-choice questions (A, B, C, D) in the format shown below, display each question (format also shown below) and its 4 answer choices, get the user's answer to each question, and, at the end of the quiz, output their score as a percentage.


The Format

Questions in input

Q<space><Insert question here>:<Insert letter of correct answer here>
<indent 1 space>A<space><answer choice text>
<indent 1 space>B<space><answer choice text>
<indent 1 space>C<space><answer choice text>
<indent 1 space>D<space><answer choice text>
<you can add a newline between questions if it makes things easier>

How to output questions

<question number>. <question>
  A. <answer choice A>
  B. <answer choice B>
  C. <answer choice C>
  D. <answer choice D>
<2 spaces before each answer letter>

How to output scores

Your score is: <score here>%

Test Case

Q What is the average airspeed velocity of an unladen swallow?:B
 A African or European?
 B 22 mph
 C I don't know that!
 D What?

If this were question number 42, it would output like this:

42. What is the average airspeed velocity of an unladen swallow?
  A. African or European?
  B. 22 mph
  C. I don't know that!
  D. What?

As usual, standard loopholes are strictly forbidden.


This is , so may the shortest code win and the best programmer prosper...

\$\endgroup\$
2
  • \$\begingroup\$ I like this challenge, but I think it could use a complete test case \$\endgroup\$ Commented Jul 5, 2017 at 18:41
  • \$\begingroup\$ @musicman523 Ok. I will use an output from fotoforensics for example. \$\endgroup\$
    – ckjbgames
    Commented Jul 5, 2017 at 18:53
1
\$\begingroup\$

The task

Your code should take in an integer 0 < x < 1965593254291461501637330902918203684832716283083 and output the smallest integer m such that x^m mod 1965593254291461501637330902918203684832716283083 = 1. This long number is the next prime after 2^100 so can be encoded efficiently.

You may take the input in any format that is convenient and output in any convenient form too.

Your code should take less then one minute to run on a standard desktop no matter what the input.

Examples

2, 4235851503548771316711413838489497242205033676
3, 16943406014195085266845655353957988968820134704
169434060141950852668456553539579889688, 16943406014195085266845655353957988968820134704

Those with python or similar can check the answers with e.g. pow(3,16943406014195085266845655353957988968820134704, 1965593254291461501637330902918203684832716283083) which equals 1.

You may not use any builtin or library function which solves this problem for you.

\$\endgroup\$
10
  • \$\begingroup\$ Is there a reason you picked that specific number? \$\endgroup\$
    – Pavel
    Commented Jul 6, 2017 at 20:07
  • \$\begingroup\$ I think that unless there's a simple formula that gets that number, hardcoding that value would take more bytes than the rest of the code. \$\endgroup\$
    – Pavel
    Commented Jul 6, 2017 at 20:07
  • \$\begingroup\$ @Phoenix I added a simple formula. \$\endgroup\$
    – user9206
    Commented Jul 6, 2017 at 20:13
  • \$\begingroup\$ I don't think it's a great idea to use nubmers that are so large that many languages require special constructs to represent them, it gives an unfair advantage to languages with arbitrary precision integers, which already tend to be shorter. \$\endgroup\$
    – Pavel
    Commented Jul 6, 2017 at 20:19
  • \$\begingroup\$ @Phoenix I take your point but the point of this challenge is to devise efficient code for large inputs. Languages with builtin large number support tend to be quite slow (e.g. python) compared to e.g. C. I would like to leave it like this. \$\endgroup\$
    – user9206
    Commented Jul 6, 2017 at 20:22
  • \$\begingroup\$ Is there an efficient way to find the multiplicative order modulo a prime of a number, short of factoring p-1? \$\endgroup\$
    – xnor
    Commented Jul 7, 2017 at 4:59
  • \$\begingroup\$ @xnor, none known. \$\endgroup\$ Commented Jul 7, 2017 at 7:35
  • \$\begingroup\$ @PeterTaylor Is 100 bits too big to factorize without calling library code to do it for you? Or could the question allow you to factorize the number beforehand? (Wolfram alpha will do that for free for example for the number in my question minus 1.) \$\endgroup\$
    – user9206
    Commented Jul 7, 2017 at 7:52
  • \$\begingroup\$ @PeterTaylor I am just wondering how much I need to reduce the number by. Currently it is 160 bits. \$\endgroup\$
    – user9206
    Commented Jul 7, 2017 at 8:37
  • \$\begingroup\$ @PeterTaylor Actually even the command line tool factor can handle the 160 bit number it turns out \$\endgroup\$
    – user9206
    Commented Jul 7, 2017 at 8:52
1
\$\begingroup\$

ASCII Art Turtle

As you know, the LOGO programming language allows you to manoeuvre a turtle and draw lines in a graphical way. It occurs to me that we can do this for .

A minimal set of commands to produce would be the R(otate right), F(orward) and P(en) commands. For example, the string FPRRRFRRRRPFPRRRFRRRRPFPRRRFRRRRPFPRRRFRRRRPFPRRRFRRRRPFPRRRFRRRRPFPRRRFRRRRPF would produce the following output:

\|/
- -
/|\

However that AAT code is rather inconvenient so I have chosen the following slightly more compact instruction set:

  • F Move one cell in the current direction. Initially the current direction is east. If the pen is down, the cell just vacated is set to one of -/|\ appropriately.
  • B Move one cell in the reverse direction. (Initially this would be west, of course.) The cell vacated is set in the same way as for F (since the output characters are all symmetric).
  • R Rotate right 45°. Only the current direction changes; nothing is drawn and the current position does not move.
  • L Rotate left 45°. Otherwise as per R.
  • D Lower the pen. Note that the pen starts lowered.
  • U Raise the pen.

The above image could therefore be drawn using the command string BULFDBULFDBULFDBULFDBULFDBULFDBULFDB, while the string LFFUBRFDFFFFFFFFFFFFFFFFFRFFRFBRRFFFFFFFFFFFFFFFFFFFFFUBLLFDFFBLLFFFFFFFFFFFFFFFFFFFFFUBRRFDFRRFFFFFFFFFFFFFFFFFFFFFURBDBBUFLBDBBBBBBBBBLLFFFURBDBBBUFRBDBBBLBB should hopefully produce this somewhat familiar picture:

 /-----------------\ 
/                   \
---------------------
|                   |
---------------------
|                   |
---------------------
\                   /
 \---------|  /----/ 
           | /       
           |/        

Your function or program must take input as a string, or whatever the nearest equivalent is in your language, and output a newline-delimited or newline-terminated string. (For those of you used to using TIO it should be possible to paste the raw string into the ▼ Input field and show the output directly in the ▼ Output field.) Extra blank rows or columns are not allowed, but you are allowed to pad all the lines to the length of the longest non-blank line. You can take input in lower or mixed case if you prefer. You can assume that the input will only use those six letters. You can further assume that U and D commands alternate. You can also assume that you will never write in the same place twice.

This is , so the shortest program that breaks no standard loopholes wins!

\$\endgroup\$
1
  • \$\begingroup\$ The reverse of this could be interesting as a metagolf \$\endgroup\$
    – emanresu A
    Commented Feb 16, 2022 at 9:38
1
\$\begingroup\$

Escape the Labyrinth!


Introduction

You are stuck in a labyrinth. You only have your brain and a map. Now you need to find a way out, of course your brain doesn't have much memory (or else you wouldn't be stuck!) so you need to optimize your mental code for size. Of course we can't trivially program in the brain-language, so your brain will also accept any other language.

Specification

Input

Your input will be a Matrix. You may encode it however serves your language best as long as the format doesn't encode additional information. For the purpose of this challenge I will use a list of lists for representation and explanation.

Said matrix will contain four distinct values:

  • 0: This marks a spot you can move onto
  • 1: This marks a wall
  • 2: This marks the starting point
  • 3: This marks the target point

It is guaranteed that there will be exactly one occurence of type-3 and type-2. You may also change the above values / data-types to your liking as long as you don't encode additional information.

It is guaranteed that you will get an input that has a solution. If the input doesn't have a valid solution, the behavior is left undefined. Your program may not terminate, it may error out, it may simply return nothing, it may blow up, it may become a political activist or it may do something else.

You may assume that the input labyrinth is walled-off, that is you can't actually "leave" the labyrinth.

Output

Your output will be sequence of four different values:

  1. L: Stands for left
  2. R: Stands for right
  3. U: Stands for Up
  4. D: Stands for Down

You may change the values and data types of the above constants to your liking, as long as you document these changes and you can uniquely infer the path.

What to do?

Given the labyrinth, start your virtual character at the position tagged 2 and find a way to the position tagged 3. You may not pass through walls (1 cells) and you may only go one step up, left, right or down in each step. You also need to document your action of course in each step, ie output it as described above.

Note: You do not have to find the shortest path, but rather a path.

Who wins?

This is , so the shortest solution in bytes wins! Standard loophole rules apply of course. Standard I/O rules also apply.

Example

[ 
[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[1,2,0,1,0,1,1,0,1,1],
[1,1,0,1,0,0,0,0,1,1],
[1,1,0,0,0,1,1,1,1,1],
[1,1,1,0,1,1,0,0,1,1],
[1,1,0,0,1,0,0,0,1,1],
[1,1,1,0,0,0,1,0,1,1],
[1,1,1,1,1,1,1,3,1,1],
[1,1,1,1,1,1,1,1,1,1] 
]

might result in:

Going right.
Going down.
Going down.
Going right.
Going down.
Going down.
Going down.
Going right.
Going right.
Going up.
Going right.
Going right.
Going down.
Going down.
\$\endgroup\$
3
  • \$\begingroup\$ Potential questions: What other tags to use? Should it be allowed to receive position information of 2 and 3 in the input as well? \$\endgroup\$
    – SEJPM
    Commented Jul 7, 2017 at 20:15
  • 1
    \$\begingroup\$ I'd be very surprised if this wasn't a duplicate. I'm stuck on mobile for quite a while, but My car only turns right is very similar except you have to manage orientation. I'd look closely at other maze challenges to see that this adds to the site. \$\endgroup\$ Commented Jul 9, 2017 at 21:33
  • \$\begingroup\$ I agree with FryAmTheEggman. This is very likely a dupe. \$\endgroup\$
    – Gryphon
    Commented Jul 9, 2017 at 23:50
1
\$\begingroup\$

An order of primeness

Introduction

In a recent question the concepts of super-primes were explored. A super-prime is a prime whose index is also a prime.

  • 2 is not a super-prime, its index is 1
  • 3 is a super-prime, its index is 2
  • 5 is a super-prime, its index is 3
  • 7 is not a super-prime, its index is 4
  • ...

The first few of these super-primes are 3, 5, 11, 17, 31, 41, 59, ...

Let us call these primes of at least order 2, because they are more prime than regular primes (which are only of order 1).

Primes of order of 3 or greater can be defined similar. A prime is of order 3 if its index is a prime of order 2.

The first few of the primes at least of order 3 are 5, 11, 31, 41, 59, 127, 179, 277, ...

This is sequence A049076. It was defined by Neil Fernandez in 1999. More information can be found in his Exploring Primeness Project.

Task

Given a prime, return its order.
More formally

  • INPUT: A single integer which is guaranteed to be a prime
  • OUTPUT: A single integer which is the order of the input.
  • You can either return or print the result.

This is , so shortest code wins.

Testcases

           2 ->  1
           3 ->  2
           5 ->  3
           7 ->  1
       52711 ->  9
435748987787 -> 11 (happens to be the 11. Prime of order 11)

Sandbox Questions

  1. Does it need any more clarification?
  2. Should I define order 0 (not a prime) and allow any number as input, or would that over-complicate the challenge?
  3. Primes of higher order tend to get big very fast. Should I somehow specify that a language only has to work for test-cases it can actually handle or is their a consensus already?
  4. Is the introduction too big?
\$\endgroup\$
3
  • \$\begingroup\$ This is just a loop round the linked question, and as such qualifies as a duplicate for the purposes of this site. \$\endgroup\$ Commented Jul 10, 2017 at 14:04
  • 1
    \$\begingroup\$ I think this might be an interesting question. \$\endgroup\$ Commented Jul 10, 2017 at 22:14
  • \$\begingroup\$ Last test case -> 10 (or all the other cases ->+1) \$\endgroup\$
    – ZaMoC
    Commented Jul 10, 2017 at 23:24
1
\$\begingroup\$

For technical reasons, many languages have a boundary for number values, which calls for workarounds when operating with numbers outside this range.

Challenge

The challenge is to write a program which is able to multiply two arbitrary large numbers, given an infinite amount of time and memory.

The input will always be two positive decimal integers in any reasonable format (string, list of digits..)

The output should be (exclusively, apart from any whitespace) the exact decimal product of these integers.

  • If integer magnitude is unbounded in your language, you must set an own limit

  • The algorithm has to be written individually. If your language has arbitrary multiplication implemented in any way, (built-in, native support) the program has to be written in a way that assumes that these methods are limited to some number

  • Note that properties like .length can exceed the integer limit. You can't e.g. ordinarily loop over the digits in a 'for' loop

  • A valid solution can not be confirmed by solely test cases but only by analysis of the code

  • This is , so shortest code in bytes per language wins.

Example Input and Output

Input:

5378877047254281056308179853217614491205392080414948189690882584626258197090299384248418705254284062330999044417502407170242320748022675887850236280535223588025381434803683717318134517400400886554441

and

24585803251446564673599904286559945882543472174090101020256415987852946031712809185990398899511551226915139170857973433130460342507187447589801052724967977799120438910759846107262285707877865565231049

Output:

13224401279751560029079048725841743388456506005068978434329060038933262717486337348174589758627669812502604130373896959848172091197634331942663385472131265201616801014468642971825909208942693284219016467181922385520740594984640977937358293657922369959902120240111214073507556243844128492765568914803850594686913014876111459929738682018339519061223975139325785119259348090888269287247476161682038609

Sandbox

Is this different enough from this challenge?

Would this be better suited for ?

\$\endgroup\$
8
  • \$\begingroup\$ The solutions to this will be very interesting. Looking forward to it. \$\endgroup\$
    – Gryphon
    Commented Jul 10, 2017 at 0:01
  • \$\begingroup\$ I don't quite understand your first bullet point... is it disallowing using the * operator in languages with unbounded ints? Would it disallow java's BigInteger::multiply? (Java is perhaps a special case, as int and BigInteger are separated. Furthermore, BigInteger is not a "native" implementation). If you want to disallow builtin solutions, say so... but as it stands I think that java.math.BigInteger::multiply would be a perfectly valid solution... no? \$\endgroup\$ Commented Jul 10, 2017 at 16:18
  • \$\begingroup\$ @socraticPhoenix Good point, I've edited the post. Is it clearer now? \$\endgroup\$
    – Oki
    Commented Jul 10, 2017 at 18:21
  • \$\begingroup\$ "Note that properties like .length are also bounded numbers, and the input can have infinitely many digits". What I'm getting is that no-one should bother attempting to answer, because properties like pointers to memory are also finite and so no program will be able to read the input. \$\endgroup\$ Commented Jul 11, 2017 at 7:35
  • \$\begingroup\$ Note also that long multiplication has been done \$\endgroup\$ Commented Jul 11, 2017 at 11:47
  • \$\begingroup\$ @peter You're right. I made an edit, does it make sense now? Basically it should implement multiplication to the highest magnitude possible for each language. Since memory isn't limited, pointers can always be incremented until input end. \$\endgroup\$
    – Oki
    Commented Jul 11, 2017 at 13:39
  • \$\begingroup\$ No, it doesn't make sense now, and I don't think there's any way of writing it which would make sense. Either you have loops which don't bother with an index (i.e. most golfing languages), in which case limitations on length are both nonsensical and irrelevant; or you need to index into the data structure, in which case your index is subject to the same limitations as length and it's completely impossible. I also think that "reasonable format" directly contradicts limits on length. \$\endgroup\$ Commented Jul 11, 2017 at 14:04
  • \$\begingroup\$ @peter The limitation is not imposed by me. If the program can multiply integers whose length (number of digits) is larger than the INT_MAX (or whatever limit is set), it goes. \$\endgroup\$
    – Oki
    Commented Jul 11, 2017 at 15:36
1
\$\begingroup\$

Stitch the Genome

Introduction

As you probably know DNA (deoxyribonucleic acid) is made up of bases, often denoted as A T C and G. One of the coolest things we can do with DNA is sequence it, or figure out what sequence of base pairs make up the molecule. Sequencing small molecules of DNA is easy, but it is hard to sequence long strands without error. Instead, the long strands are copied many times, then cut up into many little pieces. Those pieces are then fed through the sequencer. What we end up getting are many, many sets of pieces of the strand. In each set, we are near-guaranteed to get every base in the strand, but they aren't in any order. The solution, then, is to compare all of the different sets of strand pieces we have, and try and figure out how to put them together.

Challenge

Your challenge is, given a set of strand pieces, output a possible sequence of the original strand. To simplify real life a bit, you can expect that each set will always contain the entire strand sequence (not in order, mind you), and that there will be at least one possible sequence. Observe a simple example:

Input:
 - [ATC, G]
 - [CG, AT]
Output: ATCG

From the first input, we deduce two possibilities: ATCG and GATC. From the second input, we deduce another two possibilities: CGAT and ATCG. As you can see, the only common possibility is ATCG, and thus that is our answer. Let's look at another example:

Input:
 - [AT, G, C]
 - [A, TG, C]
Output: ATGC or CATG

Here, we deduce six possibilities from the first input: ATGC, ATCG, GATC, GCAT, CATG and CGAT. Then, from the second input, we deduce another six possibilities: ATGC, ACTG, TGAC, TGCA, CTGA and CATG. Since there are two common possibilities, ATGC and CATG, we can output either one.

Essentially, this problem can be reduced to: find a common permutation of the input.

Specifics

  • You may write a program or function
  • You may input in any acceptable format (array of arrays, list of lists, separated string, etc.). Furthermore, you may substitute A T C and G in your input with any other unique values, as long as you're consistent
  • You may output in any acceptable format
  • Standard loopholes apply

Test Cases

Format:

Input:
 - Pieces 1
 - Pieces 2
 - Etc.
Possible Outputs: [Possible output 1, possible output 2, etc.]

Input: 
 - [G, A, C, C, T, A, G]
 - [GAC, C, TAG]
 - [G, AC, CT, AG]
 - [GA, CC, T, A, G]
Possible Outputs: [GACCTAG]

Input: 
 - [G, C, G, C]
 - [G, C, GC]
 - [G, CG, C]
Possible Outputs: [GCCG, CGCG, GCGC, CGGC]

Input: 
 - [TA, A]
 - [TA, A]
 - [T, AA]
Possible Outputs: [TAA]

Input: 
 - [CC, T, A]
 - [CC, T, A]
 - [C, CT, A]
Possible Outputs: [CCTA, ACCT]

Input: 
 - [GAG, C, T, C]
 - [GA, G, C, TC]
 - [GA, G, C, T, C]
 - [G, A, G, C, T, C]
 - [G, AGC, TC]
Possible Outputs: [GAGCTC, TCGAGC]

Input: 
 - [AG, A, C, A, T, G]
 - [AG, A, C, A, T, G]
 - [AGAC, A, TG]
 - [AGA, CA, T, G]
 - [A, G, AC, A, T, G]
 - [A, G, A, C, ATG]
Possible Outputs: [AGACATG]

Input: 
 - [C, A, A, C, T]
 - [CA, A, C, T]
 - [CA, A, C, T]
 - [C, A, AC, T]
 - [C, A, A, C, T]
 - [C, AA, C, T]
Possible Outputs: [CAACT, TCAAC]

Input: 
 - [CA, G, C]
 - [CAG, C]
Possible Outputs: [CAGC, CCAG]

Input: 
 - [A, GT]
 - [A, G, T]
 - [AG, T]
Possible Outputs: [AGT]

There is a set of 100 random test cases here, or you can check out the java program that generated them.

\$\endgroup\$
4
  • \$\begingroup\$ Too much intro, IMHO. \$\endgroup\$
    – Adám
    Commented Jul 12, 2017 at 17:50
  • \$\begingroup\$ @Adám that was fast! I'll look into cutting down at that! Got to go do a thing now though, so it may be a while.... \$\endgroup\$ Commented Jul 12, 2017 at 17:51
  • \$\begingroup\$ any other unique characters or numbers? \$\endgroup\$
    – Adám
    Commented Jul 12, 2017 at 17:53
  • \$\begingroup\$ @Adám hmm... unique values i guess... I'll update it now \$\endgroup\$ Commented Jul 12, 2017 at 18:31
1
\$\begingroup\$

These are two separate challenges.


Convert to mixed-radix ZYX…432.234…XYZ

Related: Convert from mixed-radix ZYX…432.234…XYZ and Convert to and from the factorial number system.

Given a non-negative real number (no greater than 1×1040 or the biggest your language can comfortably accommodate, whichever is less) convert it to mixed-radix ZYX…432.234…XYZ using the base-36 digits [0-9A-Z] or [0-9a-z] with no leading zeros (except for values smaller than 1). Any reasonable rounding is fine.

Examples

00 (0 × !1)
11 (1 × !1)
210 (1 × !2 + 0 × !1)
311 (1 × !2 + 1 × !1)
420 (2 × !2 + 0 × !1)
421300 (1 × !4 + 3 × !3 + 0 × !2 + 0 ×!1)
1004020 (4 × !4 + 0 × !3 + 2 × !2 + 0 ×!1)
123452304111
42949672958B6570020211
1000000000017A5726651220
184467440737095516157BC43F35350835000211
0.50.1
0.3333333333333333330.02
0.250.112
0.10.0022
5.12521.003
2.7182818284590452351.111111111111111111
0.0013888888888888890.00001


Convert from mixed-radix ZYX…432.234…XYZ

Related: Convert to mixed-radix ZYX…432.234…XYZ and Convert to and from the factorial number system.

Given a string (no longer than 71 characters or the maximum that gives a result your language can comfortably accommodate, whichever is less) convert it from mixed-base mixed-radix ZYX…432.234…XYZ using the base-36 digits [0-9A-Z] or [0-9a-z]. Any reasonable rounding is fine.

Examples

0 (0 × !1) → 0
1 (1 × !1) → 1
10 (1 × !2 + 0 × !1) → 2
11 (1 × !2 + 1 × !1) → 3
20 (2 × !2 + 0 × !1) → 4
1300 (1 × !4 + 3 × !3 + 0 × !2 + 0 ×!1) → 42
4020 (4 × !4 + 0 × !3 + 2 × !2 + 0 ×!1) → 100
230411112345
8B65700202114294967295
17A572665122010000000000
7BC43F3535083500021118446744073709551615
0.10.5
0.020.333333333333333333
0.1120.25
0.00220.1
21.0035.125
1.1111111111111111112.718281828459045235
0.000010.001388888888888889


\$\endgroup\$
21
  • \$\begingroup\$ I think this is ready. \$\endgroup\$
    – Adalynn
    Commented Jul 11, 2017 at 21:56
  • \$\begingroup\$ I'd like this more with a list of digits 0-35 in the factorial base rather than including letters. \$\endgroup\$
    – xnor
    Commented Jul 13, 2017 at 8:16
  • \$\begingroup\$ @xnor Interesting. In that case, there should be no specific upper limit, right? \$\endgroup\$
    – Adám
    Commented Jul 13, 2017 at 8:17
  • \$\begingroup\$ @Adám That's right, unless you want a limit for the sake of languages' number bounds. \$\endgroup\$
    – xnor
    Commented Jul 13, 2017 at 8:18
  • \$\begingroup\$ @xnor I assume that's covered by default rules. This simplifies the challenge text, so I'll make the change. Thanks \$\endgroup\$
    – Adám
    Commented Jul 13, 2017 at 8:18
  • \$\begingroup\$ @xnor How is this? \$\endgroup\$
    – Adám
    Commented Jul 13, 2017 at 8:24
  • \$\begingroup\$ @Adám Looks good to me. Is your plan to post a challenge for just one direction? \$\endgroup\$
    – xnor
    Commented Jul 13, 2017 at 8:32
  • \$\begingroup\$ @xnor Uh, did you read the post? \$\endgroup\$
    – Adám
    Commented Jul 13, 2017 at 8:33
  • \$\begingroup\$ @Adám Yes, and I'm not sure if your plan is to post two challenges, or just whichever direction is more interesting. \$\endgroup\$
    – xnor
    Commented Jul 13, 2017 at 8:51
  • \$\begingroup\$ @xnor Two challenges. However, I just noticed that factoradic can easily represent floats too, so should I extend/modify the challenges to that? It would certainly make them different from the existing one. \$\endgroup\$
    – Adám
    Commented Jul 13, 2017 at 8:53
  • \$\begingroup\$ Yes, you should do that so built-ins won't be useful (cough Jelly cough) in addition to distinguishing this from the existing challenge. \$\endgroup\$
    – Adalynn
    Commented Jul 13, 2017 at 19:57
  • 1
    \$\begingroup\$ The original challenge with letters was way better... \$\endgroup\$
    – ZaMoC
    Commented Jul 14, 2017 at 6:25
  • \$\begingroup\$ I actually agree with @Jenny_mathy because languages like Jelly naturally output different bases in a list format, rather than a string of letters. \$\endgroup\$
    – Adalynn
    Commented Jul 14, 2017 at 13:17
  • \$\begingroup\$ @Jenny_mathy Like this? \$\endgroup\$
    – Adám
    Commented Jul 14, 2017 at 14:22
  • \$\begingroup\$ @Zacharý Ping ^ \$\endgroup\$
    – Adám
    Commented Jul 14, 2017 at 14:22
1
\$\begingroup\$

Minimize my cube

Introduction

Using my 6x6 as cubes of smaller size

I have a rubiks cube. It has 6 layers and is great fun to solve. But it takes quite some time, and sometimes I wish I could just solve a cube of smaller size. But theres hope, because every cube with even number of layers can emulate every cube with less layers by only moving certain layers at the same time. Now I need your help to provide the numbers.

Let's get mathematical

Consider this definiton: For every even integer n and a positive integer i <= n there exists a sequence of i positive integers, so that

x_1 + x_2 + ... + x_i = n
x_1 = x_i
x_2 = x_(i-1)
x_3 = x_(i-2)
...

(See test cases for a clearer example). Then such a sequence tells me exactly which layers to combine.

The challenge

For an input n write a program that outputs one of the existing sequences for every positive integer i < n.

Test cases

For n = 6:

[6]
[3, 3]
[2, 2, 2]
[1, 2, 2, 1]
[1, 1, 2, 1, 1]
[1, 1, 1, 1, 1, 1]

For n = 4:

[4]
[2, 2]
[1, 2, 1]
[1, 1, 1, 1]

Scoring and Rules

Lowest number of bytes wins. Standard Loopholes apply.

Sandbox quesions

  • Formatting?
  • Can I make the definition clearer?
  • Should I put more restrictions?
  • Where is my english broken beyond repair?
\$\endgroup\$
5
  • \$\begingroup\$ Tell me if I'm understanding it wrong, but could we output, for the fourth line when n=6 : [2, 1, 1, 2]? or even [2, 1, 2, 1]? or even any permutation of [1, 1, 2, 2]? \$\endgroup\$ Commented Jul 19, 2017 at 16:39
  • \$\begingroup\$ Another thing (that's why separate comment) : you don't explicitly require an input format. So here, could I for example output a string containing : 4\n22\n121\n1111\n (with \n=newline)? Am I allowed to have this trailing newline? Are the commas mandatory? etc. \$\endgroup\$ Commented Jul 19, 2017 at 16:42
  • \$\begingroup\$ About my first comment : if you want, you can even ask for outputting every or any permutation, or a symmetric permutation, or an increasing-ordered one. \$\endgroup\$ Commented Jul 19, 2017 at 16:46
  • \$\begingroup\$ @V.Courtois: I meant it to be symmetric, like [2,1,1,2] and [1, 2, 2, 1] are both symmetric, but [2, 1, 2, 1] is not. Alas, need to better the explanation, I guess. \$\endgroup\$
    – Seims
    Commented Jul 20, 2017 at 5:49
  • \$\begingroup\$ you do need, it's a fact :) And what about saying what output format you want (sorry for the input mistake in 2nd comment) ? \$\endgroup\$ Commented Jul 20, 2017 at 6:40
1
\$\begingroup\$

KOTH: Thirty-One

Challenge

Built a bot that plays Thirty-One against other bots!

Game Rules

Thirty-one is a card game using the standard 52-card deck (the French deck). The objective in each round is to have a hand better than at least one of your opponents'.

At the beginning of the game, each player has a set number of "lives" - for this challenge, each player will get 3 lives. Once you run out of lives, you have lost the game. No matter how many players there are, there is exactly one winner per game.

The player to go first in the first round is chosen arbitrarily. After that, the player to go first rotates clockwise around the "table". The players' order does not change between rounds (except for when players get knocked out).

At the beginning of each round, each player is dealt 3 cards. On each player's turn, they have the option to:

  1. Draw a card from the deck and discard a card
  2. Draw the last card that was discarded and discard a card
  3. Knock if no other player has knocked yet

Knocking

If a player knocks, each other player gets one more turn. Then, the players compare hands. Whoever has the lowest score loses a life, and the round ends.

Scoring

Each player's score is calculated by adding the face values of all their same-suit cards and taking the best score. Two cards of different suits don't contribute to the same score.

The face values for each card are:

Ace: 11
King, Queen, Jack: 10
2-10: their value

For example, consider you hold the cards:

Ace of Spades
Four of Spades
Two of Spades

Your score would be 11 + 4 + 2 = 17.

If you hold the cards:

Queen of Diamonds
Four of Clubs
Nine of Clubs

Your possible scores are 10 and 4 + 9 = 13, so your score is 13, the best of the two.

Finally, if you have:

Six of Hearts
Six of Spades
Three of Diamonds

Your possible scores are 6, 6, and 3, so your score is 6, the best of the three.

The highest possible score you can reach is 31, by holding the Ace and two 10-point cards of the same suit.

Special Cases

  • If the player who would go first knocks immediately on their first turn, the other players don't get a turn - they compare hands right away

  • If a player reaches a score of 31, they should knock immediately and everyone else loses a life

  • If the deck runs out of cards, the round ends and all players compare hands

Input/Output

Your bot will be a subclass of the base class I provide. You need not implement every method, but there will be a minimal amount of functionality required in order to make the turns go forward.

Scoring

I will create a tournament-style bracket that will determine the winning bot. Your bot is allowed keep track of all the information available to it, including between games. The details of the bracket will depend on the number of bots written.


Meta

  • I could use some input on writing the controller and base class. What has worked well in the past? What hasn't worked that I should avoid?

  • Are the rules for the game clear enough? I adapted them from my own knowledge of the game and this website.

  • Obviously this isn't ready for posting yet since I haven't written the base class, but is there anything else unclear or missing?

  • Is there anything I can do to make this more fun or more challenging?

\$\endgroup\$
6
  • \$\begingroup\$ 1. The key thing for the controller is to maintain a persistent connection, because if you have to keep forking processes that becomes a bottleneck. 2. There are a couple of minor points to clarify. "Whoever has the lowest score loses a life": presumably in case of ties everyone with the lowest score loses one. "standard 52-card deck": the French deck, to distinguish it from other standards. Although on the basis of KISS I'd use a deck of four suits and card values 0 to 9 (with three 8s per suit). \$\endgroup\$ Commented Jul 18, 2017 at 13:51
  • \$\begingroup\$ "Draw a card from the deck and discard a card" is presumably followed by shuffling all but the discarded card if the draw deck runs out. "I will run 100 games using everyone's bots" will break badly if there are 17 bots. \$\endgroup\$ Commented Jul 18, 2017 at 13:52
  • \$\begingroup\$ @PeterTaylor Thank you so much for the feedback! 1. Thank you for the advice, I didn't plan on making the program multi-processed, I planned on having the controller simply keep a list of the bots and passing control to each one in turn. 2. Yes the tying rule is correct, I'll add that in. Although that would be a good way to simplify the deck I think I'll keep it 2-11 with four 10s per suit, because I don't want to change the name of the game. 3. Yes, all but the top card would be shuffled back in, I'll add that as well. 4. Why would that break badly? Just because of computation time? \$\endgroup\$ Commented Jul 18, 2017 at 14:05
  • \$\begingroup\$ 3 cards each times 17 players leaves 1 card in the deck. \$\endgroup\$ Commented Jul 18, 2017 at 14:09
  • \$\begingroup\$ Ah, good point...if there are that many participants, I'll have to break it into multiple smaller games and set up a tournament bracket \$\endgroup\$ Commented Jul 18, 2017 at 14:17
  • \$\begingroup\$ I've changed my mind on one thing - the round ends when the deck runs out of cards. Each game will consist of 4 players, and I'll release more information about the gameplay once I see how many bots are written \$\endgroup\$ Commented Jul 18, 2017 at 17:46
1
\$\begingroup\$

KotH: Atom Bomb Chess

(Draft. I'll flesh it out some more later. It will probably be implemented in JavaScript or maybe C++.)

Atom Bomb Chess is a variant of chess played much the same as regular chess. The only differences are:

  1. The game ends when one or both players have no pieces, or if 50 moves have been made without a piece being captured.
  2. When a piece is captured, all pieces a king's move away are also "captured", and the piece doing the capturing is also "captured".

For example, let's look at a 4x4:

pbbr
....
....
RBBP

Where r/R is a rook, b/B is a bishop, and p/P is a pawn. Suppose R moves forward 3 spaces. Then, it captures the p and "explodes":

..br
....
....
.BBP

The idea of this KotH is to make a program that plays Atom Bomb Chess. I will have a few programs to test your submissions against.

\$\endgroup\$
7
  • \$\begingroup\$ This is a really cool idea! Obviously you'll need to flesh out the rules a bit more, but this is a great start. I would also suggest fixing the board size (you seem to suggest it can be played on any size board, but I think it would be easiest to set it as a constant ahead of time). \$\endgroup\$ Commented Jul 23, 2017 at 22:31
  • \$\begingroup\$ @musicman523 Yeah, it'd probably be played on an 8x8 \$\endgroup\$ Commented Jul 23, 2017 at 22:35
  • 1
    \$\begingroup\$ you forgot that pawns are partially nuke proof \$\endgroup\$ Commented Jul 23, 2017 at 23:15
  • \$\begingroup\$ @DestructibleLemon Please elaborate ? I wasn't aware there was some standard rulebook. \$\endgroup\$ Commented Jul 24, 2017 at 1:45
  • 2
    \$\begingroup\$ I'm not entirely sure where it is, but I remember that pawns, while still being eliminated if they are capturing, or are captured, will not get removed if they are adjacent to a capture. maybe use lichess? \$\endgroup\$ Commented Jul 24, 2017 at 2:51
  • \$\begingroup\$ @DestructibleLemon I remember playing it when I was younger with no such restriction, perhaps there are multiple variants. Why suggest lichess? Does it have that mode? \$\endgroup\$ Commented Jul 24, 2017 at 18:02
  • \$\begingroup\$ Apart from pawns being nuke proof, the game ends as soon as you nuke the enemy king, if you play on lichess. There are videos on YouTube which include an explanation of the rules and basic "opening theory". \$\endgroup\$
    – Sleafar
    Commented Jul 28, 2017 at 18:17
1
\$\begingroup\$

How good is my mahjong hand?

Your goal is to calculate the shanten (minimal number of tiles needed for your hand to be a "waiting hand") of a Riichi mahjong hand.

What is Japanese Mahjong (or Riichi)

The goal of the game is to build a 14 tiles valid hand. Your hand is 13 tiles long, and each turn, you draw a 14th. If it doesn't make you win, you discard a tile. The tiles are grouped by colors : man, numbers, let's call them m; pin, circles, p; sou, bamboos, s; and honor tiles, z.

For p,m, and s : tiles are numbered from 1 to 9, with 4 examples each (1m 1m 1m 1m 2m 2m 2m 2m 3m 3m 3m 3m... 9m 9m 9m 9m).
z contains winds : ton for east, e; nan for south, s; sha or xia for west, w; and pei for north, n.
z contains dragons too : chun for red, r; haku for white, h; and hatsu for green, g.
Same rule, 4 examples each.
Honor tiles cannot be sequenced in a chii, they can only combine with themselves, by matching for a pair or for a pon. Don't worry, I will define terms pon and chii in the next part.

So a random hand can look like 1s 1s 1s 2s 2s 2s 3s 9p 9p 4m ez ez nz.

What is a "waiting hand"

What is called a tenpai hand, or hand that is one tile left before winning, is a hand respecting a winning shape. In general, a winning hand is composed of 4 sets of 3 sequenced (chii, like 1s 2s 3s) or matching (pon, like 1s 1s 1s) tiles, plus a pair (like 1p 1p). An example of a winning hand (14 tiles) can be : 1s 2s 3s 4s 5s 6s 6s 7s 8s 3p 3p 3p ez ez
So a "waiting hand" can be : 1s 2s 3s 4s 5s 6s 6s 7s 8s 3p 3p 3p ez where you need only ezto win.

The goal

To output a positive integer (between 0 and 7, inclusive) representing the shanten as defined above. For instance, a hand like 1s 1s 1s 2s 2s 2s 3s 9p 9p 4m ez ez nz is 2 shanten, because :
- you have a set of three 1s (a pon)
- you have a pon of 2s
- you have a pair of 9p (your pair)
- you have another pair of ez (that needs a third one to become a pon)
- you have 3 "isolated" tiles, 3s,4m,nz.

So drawing ez, and creating the pon of ez, makes you discard nz for example. Then let's imagine you draw 2s : you discard 4m, and you are now with a "waiting hand", with :
1s 1s 1s 2s 2s 2s 2s 3s 9p 9p ez ez ez, waiting on 1s or 4s. You drew two "useful tiles" to come to this hand, so you were 2 shanten.

@Sandbox : Is it on-purpose to put two detailed examples? (pro : clarifies what you have to do / con : challenge's wall of text is even bigger)

Another example

Let's see your hand looks like 4p 5p 7p 1m 1m 1m 2s 4s 6s ez sz hz hz.
- you have a pon of 1m
- you have 4p and 5p sequenced, requiring 3p or 6p to be a chii
- you have 2s 4s 6s, requiring 3s or 5s to create a chii
- you have a pair of hz
- you have 3 "isolated" tiles, 7p, ez and sz.

So, as for the first example, we have 3 isolated tiles. But are we 2 shanten? No, because 2s 4s 6s is not complete. So in fact, we have 4 useless tiles, the 4th being 2s or 6s depending on what we draw.
Proof : if we draw 3p, 3s and hz, our hand looks like that :
3p 4p 5p 1m 1m 1m 2s 3s 4s sz hz hz hz
and is waiting on the second sz to form the pair and win. We drew 3 useful tiles, so we were 3 shanten.

Test cases

3m 6m 9m 3p 5p 8p 1s 5s 8s ez sz nz gz -> 7 shanten
3m 6m 9m 3p 4p 5p 8p 1s 5s 8s ez sz nz -> 6 shanten
3m 6m 9m 3p 4p 5p 8p 1s 5s 8s ez nz nz -> 5 shanten
3m 6m 9m 3p 4p 5p 8p 8p 5s 8s ez nz nz -> 4 shanten
3m 5m 6m 9m 3p 4p 5p 8p 8p 5s 8s nz nz -> 4 shanten
3m 4m 5m 6m 3p 4p 5p 8p 8p 5s 8s nz nz -> 3 shanten
3m 4m 5m 6m 3p 4p 5p 8p 8p 5s 5s nz nz -> 2 shanten
3m 4m 5m 6m 7m 3p 4p 5p 8p 5s 5s nz nz -> 1 shanten
3m 4m 5m 6m 7m 3p 4p 5p 5s 5s nz nz nz -> 0 shanten
6s 7s 8s 1p 1p 1p 3p 4p 5p 6p 7p 7p 7p -> 0 shanten
3s 4s 5s 6s 7s 2p 4p 6p ez nz nz hz gz -> 3 shanten
3s 4s 5s 6s 7s 7s 1p 2p 4p 6p nz nz hz -> 2 shanten
3s 3s 4s 5s 6s 7s 7s 2p 4p sz sz nz nz -> 2 shanten
3s 3s 4s 5s 5s 6s 7s 7s 4p nz nz sz sz -> 2 shanten
3s 3s 3s 4s 5s 5s 7s 8s 2p 3p 4p 6p 6p -> 1 shanten
1m 1m 1m 2s 7s 7s 1p 3p 4p 9p sz hz cz -> 4 shanten
3m 6m 9m 3p 8p 1s 5s 8s ez sz nz gz cz -> 8 shanten

Protip

Calculating shanten can be complex, so here is a link that can help you doing so. You can refer to this site if you need any other information on riichi mahjong. Good luck!

Scoring and extra rules

This is code-golf, so shortest answer in bytes wins for its language. Standard loopholes apply.

NB : If you know mahjong, or were curious and dug deeper into the rules, don't mind with specific shapes like seven pairs or thirteen orphans.

tags :
@Sandbox : should I create some sort of in a pastebin or something?
Related
Related too
Something that can help if you speak japanese <- you can copypaste in the field the output from this program :)
Another protip

SANDBOX

Feel free to comment and tell me if this is on-purpose in PPCG, if there is any way to improve the way I say things, if I'm unclear anywhere ...

\$\endgroup\$
8
  • \$\begingroup\$ If you downvote, please explain why (by commenting or suggesting edit) so I can improve. If you don't, then don't downvote, this makes just the post less visible for no reason. \$\endgroup\$ Commented Jul 24, 2017 at 6:17
  • \$\begingroup\$ Didn't downvote this, nor have I read through it yet. But that may be the reason it just appears to be a wall of text. Maybe try splitting it up into multiple posts or breaking the text down into easier read chunks. Or even take bits out that might not be needed. \$\endgroup\$ Commented Jul 24, 2017 at 8:28
  • \$\begingroup\$ @TheLethalCoder in fact I'd like to explain clearly what is mahjong (to put some context in the challenge). Though you're right, it is a wall of text, that's what it looks like to me too. And I can't really "split it" into multiple posts, because it is what the challenge will look like in the end. TL;DR I want to be as clear as possible since this challenge is gonna be hard. \$\endgroup\$ Commented Jul 24, 2017 at 8:32
  • 1
    \$\begingroup\$ I think you should be able to make it clearer by tidying the post up and formatting it more. The problem is a lot of people will open the question see all the text and move on without giving it a chance \$\endgroup\$ Commented Jul 24, 2017 at 8:45
  • \$\begingroup\$ @TheLethalCoder I do know about this. How do you think I can make it tidier without removing content? \$\endgroup\$ Commented Jul 24, 2017 at 8:46
  • \$\begingroup\$ To be honest I have no clue, if I knew more on the subject I'd be able to help more \$\endgroup\$ Commented Jul 24, 2017 at 8:49
  • \$\begingroup\$ @TheLethalCoder mmh okay. Japanese mahjong is a well documented topic (I already linked some docs in the post). So maybe I shouldn't define the rules myself and let a link do the job? \$\endgroup\$ Commented Jul 24, 2017 at 8:52
  • 1
    \$\begingroup\$ Well you'd want the important information in the post so it is self contained. Maybe the "fluff" can be trimmed down. \$\endgroup\$ Commented Jul 24, 2017 at 8:53
1
\$\begingroup\$

Who Won the Chess Game?

Bear with me, this is incredibly bare-bones at the moment; I'll work on this over-time, just wanted to gauge interest on the over-all idea.


Given an input list of moves l, output who won the chess game given that white always goes first, alternating moves from there. Using the following convention for naming the chess squares:

enter image description here

Where the pieces are:

rnbqkbnr
pppppppp
........
........
........
........
PPPPPPPP
RNBQKBNR

The first assumption you will make is that the list of moves passed is a VALID chess game, to completion. The following would be an example input:

[[A2,A4],[A7,A6],...]

The first two moves given would result in:

rnbqkbnr
pppppppp
........
........
P.......
........
.PPPPPPP
RNBQKBNR

Which is white's first move, followed by black's move:

rnbqkbnr
.ppppppp
p.......
........
P.......
........
.PPPPPPP
RNBQKBNR

Then, you would continue parsing moves until a king disappears. Whichever king is left should be declared the winner.


Waiting to Gauge Interest Before Wasting Time on Full Testcase

\$\endgroup\$
1
1
\$\begingroup\$

Nested list unpacking

In Python 3.5+, the * operator can unpack a list within a list.

[1,*[2,3,4],5] == [1,2,3,4,5]

The unpacked elements are placed directly into the outer list without increasing the list depth. Note that this is different from the nested three-element list

[1,[2,3,4],5]

Your goal is to simplify a nested list expression by resolving all instances of unpacking. So, the output will simply be a nested list without any *.

Specifically, the input will be an expression that consists of

  • A non-empty list of expressions [..]
  • An non-empty unpacked list of expressions *[..].
  • A digit 1 through 9

The outermost layer will always be a non-empty list. The output is such an expression without any unpacking.

Input: A string of characters [],*123456789

Output: Its unpacked analogue. This can be a string or list structure.

This challenge can be done in any language. Python and other languages with the same unpacking format may not use eval or exec or equivalents.

TODO: I/O details, test cases

\$\endgroup\$
1
  • \$\begingroup\$ This is similar to least Levenshtein distance to a balanced list (replace *[ with { and then remove unbalanced ]). \$\endgroup\$ Commented Jul 25, 2017 at 7:20
1
\$\begingroup\$

Title: Visualizing Euclid's Algorithm

Problem

We wish to visualize Euclid's algorithm for computing the greatest common divisor of two numbers as a 2-dimensional tiling, such as this one:

euclid

This interactive version may also be helpful in understanding the visualization.

Input

Two positive integers a and b, where a > b. You may take them in any order and in any convenient form: a list, two function args, etc.

Output

An ascii version of the above visualization shown above. This is best illustrated with a few examples:

input = 20, 8

.....................
.       .       .   .
.       .       .   .
.       .       .   .
.       .       .....
.       .       .   .
.       .       .   .
.       .       .   .
.....................

8 goes into 20 2 times, so we have two 8x8 squares, and remainder of 4 (20 - 8*2 = 4). 4 goes into 8 2 times with no remainder, so the remaining rectangle is broken into to 2 4x4 squares and we're done.

input = 5, 3

......
.  ...
.  . .
......

Note: There is an implied connection between any two adjacent dots, so that the above ascii should be interpreted as follows:

connected nodes

input = 7, 3

........
.  .  ..
.  .  ..
........

flexibility

You may choose whichever border characters are prettiest to you, or use combinations of different characters.

.....................   *********************   +-------+-------+---+
.       .       .   .   *       *       *   *   |       |       |   |
.       .       .   .   *       *       *   *   |       |       |   |
.       .       .   .   *       *       *   *   |       |       |   |
.       .       .....   *       *       *****   |       |       +---+
.       .       .   .   *       *       *   *   |       |       |   |
.       .       .   .   *       *       *   *   |       |       |   |
.       .       .   .   *       *       *   *   |       |       |   |
.....................   *********************   +-------+-------+---+

Rotations are also allowed: Any of the above may be rotated 90, -90, or 180 degrees.

Rules

This is , standard loophole rules, etc.

\$\endgroup\$
3
  • \$\begingroup\$ Nice challenge! But I would add a test cases like 8,5 and 21,13 where the recursion goes a bit deeper. \$\endgroup\$ Commented Jul 26, 2017 at 8:16
  • \$\begingroup\$ @BruceForte thanks. unfortunately since posting it I found this, which I fear is too similar: codegolf.stackexchange.com/questions/119714/… \$\endgroup\$
    – Jonah
    Commented Jul 26, 2017 at 17:06
  • \$\begingroup\$ Yeah you're right, didn't know these existed. \$\endgroup\$ Commented Jul 26, 2017 at 17:11
1
\$\begingroup\$

NB: work in progress

Convert MADBACE to DECIMAL

MADBACE is a mixed Roman-hexdecimal system. Hexadecimal digits (0-F) take their normal positional values, while Roman numerals (IVXLCDM) have their normal values (1 5 10 50 100 500 1000). The main parts of the challenge is to determine when to subtract and when C and D are Roman versus hexadecimal.

Rules

  1. C and D will be Roman if possible.

  2. There can never be more than one subtractive symbol to the left of any symbol.

  3. A subtractive symbol must be less than half the symbol it subtracts from

Examples

CM900

MC1100

MD1500

DM792 1000-13×161

LD450

CD400

XD40

ID49 13×160-1

3C52 100-3×161

4C76 4×161+12×160

MADBACE701590 (10×165-1000)+(11×163-500)+10×162+100+14×160

DECIMAL233571513 13×166+14×165+12×164+(1000-1)+10×161+50

\$\endgroup\$
3
  • \$\begingroup\$ Maybe make explicit mention that a smaller symbol to the left of a larger symbol is always subtracted if both are Roman. And if one is Roman? What if neither are? Actually if neither are then the position based value ensures the symbol to the left is always larger. \$\endgroup\$ Commented Jul 25, 2017 at 23:01
  • \$\begingroup\$ If only a single symbol can be to the left for subtraction, how are ambiguous cases like IXL resolved? \$\endgroup\$ Commented Jul 25, 2017 at 23:02
  • \$\begingroup\$ Are all possible inputs from the symbol alphabet to be dealt with, or just some subset? I mean, does the spec resolve all ambiguities or will the challenge specify "only valid inputs will be used"? \$\endgroup\$ Commented Jul 25, 2017 at 23:03
1
\$\begingroup\$

Calculate the maximum possible number of "living" cells on a given grid size for Conway's Game Of Life.

Conway's Game Of Life

Game Rules:

  1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
  2. Any live cell with two or three live neighbours lives on to the next generation.
  3. Any live cell with more than three live neighbours dies, as if by overpopulation.
  4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.

Challenge: For a given grid size (ex 5x5) is it possible to calculate the maximum potential living cells after at least 5 generations with any given starting pattern?

 O O X O O
 O O X O O
 X X X X X
 O O X O O
 O O X O O

In the above example, there are 16 living cells. I am not proposing that this is the maximum, just providing a starting point.

The reason for the 5th generation requirement is because the first generation could technically be 25 (100%) I suppose.

\$\endgroup\$
1
  • 3
    \$\begingroup\$ To me, this is a very interesting challenge because brute-forcing it would be difficult (5x5 board has 2^25=32 million possibilities for starting). That being said, this should be marked as code-golf or fastest-code as a winning criterion (read the code-challenge description). Also, the rules should specify that all eight surrounding cell are included in the count. Is the board toroidal (i.e. edge wrapping) or flat? Are there any limits on the grid size? Importantly, this needs test cases to be a good challenge. If a 5x5 example is too big, do a 3x3 example. \$\endgroup\$ Commented Jul 26, 2017 at 18:37
1
\$\begingroup\$

Can you compete with a supercomputer?

The challenge is to write super fast code for computing the permanent of a matrix of complex numbers.

In a paper from 2016 a team of coders managed to compute the permanent of a 40 by 40 complex matrix on 8192 nodes of what was at the time the world's fastest computer in about 14 seconds. Your challenge is to see how close you can get to this on my desktop.

The permanent of an n-by-n matrix A = (ai,j) is defined as

enter image description here

Here S_n represents the set of all permutations of [1, n].

As an example (from the wiki):

enter image description here

In this question matrices are all square.

Examples (these need updating to have complex entries)

Input:

[[ 1 -1 -1  1]
 [-1 -1 -1  1]
 [-1  1 -1  1]
 [ 1 -1 -1  1]]

Permanent:

-4

Input:

[[-1 -1 -1 -1]
 [-1  1 -1 -1]
 [ 1 -1 -1 -1]
 [ 1 -1  1 -1]]

Permanent:

0

Input:

[[ 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 -1]
 [-1 -1  1 -1  1  1  1  1]]

Permanent:

192

Input:

[[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, -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, 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, -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],
 [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, 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, 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, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]

Permanent:

1021509632

Add the 40 by 40 matrix here

The task

You should write code that, given an n by n complex matrix, outputs its permanent.

To make testing simpler, I will provide a single 40 by 40 complex matrix which you can hardcode into your code in any format of your choosing. Clearly, you are not allowed to precompute the answer however!

Scores and ties

I will test your code on the sample 40 by 40 complex matrix. Your score is your time in seconds divided by 14.

If two people are within 1 second of each other then the winner is the one posted first.

Languages and libraries

You can use any available language and libraries you like but no pre-existing function to compute the permanent. I will run your code under OS X so please give full instructions for how to compile and run it.

Reference implementations

There is already a codegolf question question with lots of code in different languages for computing the permanent for small matrices. There was also a related challenge on computing the permanent of matrices with only +-1 entries. The coding issues when you have complex entries and want things to run fast and multi-core are quite different however.

My Machine

The timings will be run on my Mac desktop. The CPU is Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz.

\$\endgroup\$
3
  • 1
    \$\begingroup\$ Remember #asdfjkl; and ##asdfjkl;, not **asdfjkl;**, for headings. \$\endgroup\$
    – wizzwizz4
    Commented Jul 28, 2017 at 19:07
  • \$\begingroup\$ Why divide the score by 14? I know it ties in with the story, but surely it primarily adds to confusion. Also, will all the input matrices only contain +/-1? \$\endgroup\$ Commented Jul 28, 2017 at 19:34
  • \$\begingroup\$ @FryAmTheEggman No the matrices will have complex entries. I need to change the examples. Dividing by 14 was just for fun to compare with the supercomputer. I can remove that if you think it's better. \$\endgroup\$
    – user9206
    Commented Jul 28, 2017 at 19:35
1
\$\begingroup\$

Survival Island

Work in Progress, mainly trying to get the idea out and see if anyone is interested. Also make sure it hasn't been done already. Ideas taken from The Hunger Game and Player Unknown Battleground

The Board

The game will be played on a square 2-dimensional array with the size of x + ny where n is the number of players, and x and y are to be determined. No wrap

Objects

All objects can be destroyed while on the map, hence their hp. Once they are picked up, they cannot be destroyed unless the player dies.

1.Wall: Denoted by the character 'W'

HP: 10
Object Type: Wall

2.Reinforced Wall: Denoted by the character 'R'. When a wall is upgraded to reinforced wall by the player, 10 hp is added to the remaining hp on the wall.

HP: 20
Object Type: Wall

3.Crossbow: Denoted by the character 'C'. Allow the player to have ranged attack with a distance of 2. The damage dealt will be the player's damage minus 1.

HP: 1
Weight: 1
Upgrade #1: damage + 1
Upgrade #2: attacking distance + 1, damage + 1
Object Type: Item(Equipment)

4.Dagger: Denoted by the character 'D'. If the player is attacking with a distance of 1, it does 1 extra damage.

HP: 1
Weight: 1
Upgrade #1: damage + 1
Upgrade #2: damage + 2
Object Type: Item(Equipment)

5.Binocular: Denoted by the character 'B'. Increase the player's line of sight by 1.

HP: 1
Weight: 1
Upgrade #1: line of sight + 1
Upgrade #2: line of sight + 1
Object Type: Item(Equipment)

6.Shield: Denoted by the character 'S'. Increases the player's block by 1

HP: 2
Weight: 1
Upgrade #1: nothing
Upgrade #2: block + 1
Object Type: Item(Equipment)

7.Armor: Denoted by the character 'A'. negates 1 damage from any incoming damage to the player.

HP: 2
Weight: 2
Upgrade #1: nothing
Upgrade #2: incoming damage - 1
Object Type: Item(Equipment)

8.MedicKit: Denoted by the character 'M'. When used, heal the player's health by 5.

HP: 1
Weight: 0.5
Upgrade #1: hp restored + 3
Upgrade #2: hp restored + 5
Object Type: Item(Consumable)

9.EnergyDrink: Denoted by the character 'E'. When used, increase STR, AGI, and VIT by 1 for 5 turns. (If the player has already drank an energy drink, it will override previous effect).

HP: 1
Weight: 0.5
Upgrade #1: buff duration + 3 turns
Upgrade #2: all attribute + 1
Object Type: Item(Consumable)

10.PoisonedEnergyDrink: Denoted by the character 'E'. When used, decrease STR, AGI, and VIT by 1 for 3 turns.

HP: 1
Weight: 0.5
Upgrade #1: buff duration + 2 turns
Upgrade #2: all attribute - 1
Object Type: Item(Consumable)

11.UpgradeKit: Denoted by the character "U". Used to upgrades other items. All item can be upgraded twice. 1 upgrade kit is used to upgrade an item once.

HP: 1
Weight: 1
Upgrade #1: nothing
Upgrade #2: nothing
Object Type: Item(Special)

12.Player - Denoted by the character 'P'. This is the actual player on the board. See next section for more details.

HP: determined by the player
Object Type: Player

E.g. In the following map, the player have a line of sight of 1.

-------------
|   | A |   | 
-------------
| R | P |   |
-------------
|   |   |   |
-------------

In particular. There's a reinforced wall on the left, and a piece of armor on the top. the player is at the center. This can be represented as [{0,1,A},{1,0,R},{1,1,P}]

The player

Each player have the following 3 attributes:

  • STR: affects damage and carrying capacity of the player. +1 damage for each 2 STR and +1 capacity for each 1 STR

  • AGI: affects player's movement range and line of sight. +1 movement for each 5 AGI, and +1 line of sight for each 3 AGI

  • VIT: affects player's health and block. +3 health for each 1 VIT, and +1 block for each 3 VIT

You are free to assign 0 to 10 attribute points to the above 3 attributes when creating your character. Any character with more than 10 attributes assigned at the start of the game is disqualified.

Each player will start off with the following stats (without attribute bonus):

  • health: 20
  • damage: 1
  • carrying capacity: 3
  • movement: 1
  • line of sight : 2
  • block: 0

Game play

Each turn, the player will perform a move and an action.

Movement phase

Movement can either be '^' for up, 'v' for down, '<' for left, '>' right or '.' for stay.

If you can move 2 or more tiles, you can provide all movements in the order you want them to executed (e.g. "^>" will move up then right, and ">^" will move right then up).

If the first movement fails(due to object being there), the subsequent movements are dropped.

The movement phase is performed by every player performing their first movement, then every player performing their second movement if available, etc.

If 2 or more players attempt to move to the same square, then the player with the highest agility wins. If they have the same agility, then it's determined by a dice roll.

Action phase

Each player can perform the following actions during the action phase

  1. Attack : Denoted by "A ". Performs an attack to the coordinate x,y If the coordinate is out of reach, then do nothing. x and y should be relevant to the player, e.g. 0,-1 is attacking down adjacent to the player.

  2. Block: Denote by "B". Performs an block on each incoming attacks with the chance of block/10. If the block succeeds, negate all damage from that attack.

  3. Pickup : Denoted by "P ". Tries to pick up an object at that direction adjacent to the player. If the tile is empty, or if picking up the item exceeds your carrying capacity, then do nothing.

  4. Drop : Denoted by "D ". Tries to drop an item at that direction adjacent to the player. If the tile is already occupied, or the item does not exist. then do nothing.

  5. Build Wall : Denoted by "W ". Tries to build a wall at that direction adjacent to the player. If the tile is already occupied, then do nothing.

  6. Reinforce wall : Denoted by "R ". Tries to upgrade a wall at that direction adjacent to the player. If the tile is not a wall or player do not have UpgradeKit, then do nothing.

  7. Consume : Denoted by "C ". Consumes an item in your inventory. If the item does not exist, then do nothing.

  8. Upgrade : Denoted by "U ". Upgrades an item in your inventory. If the item does not exist, or if you have no UpgradeKit, or if the item already maxed out upgrades. Then do nothing

  9. Equip : Denoted by "E ". Equips an item. If the item does not exist, then it does nothing, If you have already equipped an item. then put that item in the inventory.

  10. Sleep: Denoted by "S". Increase health by 3. increases all incoming damage by 1. increase movement, damage, and block next turn by 1. Last one turn.

  11. Gaze into the sky: Denoted by "G". Looks up into the sky and ponder about life (Do nothing).

If 2 players try to perform an action at the same tile, It is first determined by the order of actions. If the players uses the same action, then the highest agility player wins. if they have the same agility, then it's determined by a dice roll who should succeed.

Order of actions that is Sleep > Block > Consume > Equip > Upgrade > Gaze > Reinforce Wall > Pickup > Drop > Build Wall > Attack

example: Given an empty tile x. if player a performs pickup at tile x, player b performs drop on tile x, player c performs build on tile x, and player d performs attack on tile x. Then player a does nothing, player b drops an item on tile x. player c does nothing, and player d attacks that item

Input/Output

Each round, the following is output to each player for movement and again for action: round #, phase, player inventory, player equipment, player buffs, player capacity, attack, block, movement, los, player hp, player line of sight, possibly more?

e.g. 14,M,AEEMM,B,P2E3,6,5,1,1,3,19,[{0,1,A},{1,0,R},{1,1,P}]

indicates:

  • round 14
  • currently it's movement phase.
  • player is carrying Armor, 2 * Poisoned? Energy Drink, 2 * Medic Kit
  • player is equipping Binocular
  • player current have a buff of poisoned energy drink with 2 turns remaining, and energy drink with 3 turns remaining
  • player has a maximum of 6 carrying capacity
  • player has an attack of 5
  • player has a block of 1
  • player has a movement of 1
  • player has a line of sight of 3
  • player has a hp of 19
  • player sees the map as shown before

Each round, 2 inputs will be read from the players

Movement phase

use '^','<','v','>' to indicate movement direction and '.' for stay, if you can move 3 times, output 3 characters.

e.g. "<.<" indicates you move left, wait then left again

Action phase

output one of the actions listed in game play

e.g. - "E 1" equips the 1st item in your inventory if possible - "A 1 2" attacks 1 tile to the right and 2 tile above you if possible.

Determine winner

a game ends if only 1 bot is alive or it is played to 1000 turns.

each each live bot gets 1/<# of bots alive> points

x games will be played and the points will be totaled to determine the winner.

Additional Information

  • Damage is calculated by attack - armor defense. If the defending player used Block, then there is block/10 chance to completely negate all damage.

  • All distance are Manhattan distance

  • More items spawn near the center than border (if I can find a way to do this efficiently)

  • Player can pick roughly where they spawn such as near border or near center (if I can find a way to do this efficiently)

Questions/To-Do list

  • Figure out what's a good map size

  • Too many/little actions/objects?

  • Balance items and stats?

  • Is the game clear enough?

  • Is output and input sufficient for the gameplay?

  • Any suggestions or comments?

  • Format question so it looks nicer. Make important information stand out. Fix grammer

  • Catchy title?

  • Figure out how many games to play to get winner

  • Make it shorter? wall of text is not fun D:

  • Figure out how many of each object to spawn

  • When player die, randomly drop an item, drop equipped item, drop nothing?

  • Find time to write the controller

  • Figure out how to use the site

\$\endgroup\$
1
\$\begingroup\$

Proposed Question

Triskaidekaphobic Primes

It is known that a certain number, which lies between 12 and 14, brings bad luck. The Church of Triskaidekaphobia (CoTDP) asserts that the key to salvation is avoiding this number in all situations, such as numbering floors, license plates, space shuttle missions and more.

The IT department of CoTDP is looking for talented developers. Candidates must prove their ability to program in accordance with Triskaidekaphobic dogma. Can you get this prestigious job?

Your Mission

Write a program that prints all prime numbers below 1000, excluding the unlucky one. the program must obey the CoTDP programming rules.

Rules

  1. Numbers whose absolute value is greater than 12 and smaller than 14 are considered unlucky and must be avoided.
  2. Unlucky numbers must not be used in the program:
    • Must not appear in the program, in any representation/base.
    • Must not be the value of an expression or calculation (e.g. 5 + 8).
    • Must not be an intermediate value in an expression (e.g. 5 + 8 + 3, 35 % 22 == 0).
    • Must not be stored in a variable, register, memory etc (e.g. for i in xrange(20):).
    • Must not be passed to a function or returned from one.
    • The above applies to any complex type which contains an unlucky number (e.g. range(20) in Python 2).
    • The above applies to all expressions, not just constant expressions (e.g. x+1 is invalid if x happens to be 12).
  3. No calculation, or intermediate value of a calculation, may yield an unlucky number. For example, and for i in xrange(20): are forbidden.
  4. Output lines bust be separated by line-feed only (no carriage return).
  5. You must find primes using basic mathematical operations. If your language provides tools to find primes or test primality, you must not use them.
  6. Standard Loopholes apply.

Scoring

This is code-golf, the shortest solution (in bytes) wins.

Questions for Meta

  • Do the limitations make sense for all sorts of languages? I think they cover languages such as C/Python/Java that use expressions, and also languages such as BrainFuck that manipulate memory (I think it's obvious that you must not write 13 in a memory cell).
  • Is there a trivial solution that makes it uninteresting?
  • Would it be better as a popularity contest?
  • Or maybe, accept the shortest, but give a bounty for the most interesting/creative answer?
  • Can the expression "Church of Triskaidekaphobia" be considered offensive to followers of some churches?
\$\endgroup\$
8
  • \$\begingroup\$ Should we treat numbers such as 39 (13 * 3) as prime, or not prime for the sake of this calculation? If 13 is not a prime, then 39 is, but it's up to you. (I did something kind of similar to this here) \$\endgroup\$
    – Stephen
    Commented Jul 29, 2017 at 19:15
  • \$\begingroup\$ @StepHen, IMO, an unlucky divisor is still a divisor. I think asking for "primes below 1000, excluding the unlucky one" makes it clear. Your interpretation might make it more challenging, but I'm not sure how it would work - 39 is a multiple of 3 (though you shouldn't actually do this division), so how can it be prime? Maybe 169. \$\endgroup\$
    – ugoren
    Commented Jul 29, 2017 at 19:23
  • \$\begingroup\$ Related: we are not allowed to store 13, right? \$\endgroup\$
    – Stephen
    Commented Jul 29, 2017 at 19:37
  • \$\begingroup\$ @StepHen, I'm not sure what you mean by "store". My intention is that 13 won't be used in any way. I write that it can't be used in the program and can't be derived by calculation, so how can it be stored? \$\endgroup\$
    – ugoren
    Commented Jul 29, 2017 at 20:12
  • \$\begingroup\$ Well you could store it with x = ord("\r"), although if you can't use it there's not much point. \$\endgroup\$
    – Stephen
    Commented Jul 29, 2017 at 20:25
  • \$\begingroup\$ ord("\r") is an expression that yields 13, and is therefore invalid. But it's worth clarifying. \$\endgroup\$
    – ugoren
    Commented Jul 29, 2017 at 20:27
  • \$\begingroup\$ Your post (as it stands) says no calculation, not no expression. \$\endgroup\$
    – Stephen
    Commented Jul 29, 2017 at 20:28
  • 1
    \$\begingroup\$ Numbers whose absolute value is greater than 12 and smaller than 14 are considered unlucky and must be avoided. is 12.5 allowed? \$\endgroup\$
    – l4m2
    Commented Apr 2, 2018 at 19:09
1
\$\begingroup\$

Encrypt/Decrypt a Decimal in Binary

Given either a positive integer a or two positive integers b and c, either encrypt or decrypt the integer(s).


Encryption

Given a=33344492, for example:

  1. Split a into consecutive runs: [333,444,9,2].
  2. Replace all runs with alternating 1's and 0's starting with 1: [111,000,1,0].
  3. Place back into binary: 11100010
  4. Convert to decimal: 226
  5. Calculate decryption key: 3492
    • This key is the unique characters from each distinct run.
  6. Return [226, 3492] as the answer, these represent [b, c] respectively.

Decryption

Given b=226 and c=3492:

  1. Convert b into binary: 11100010
  2. Use c to "replace" in each character.
    • 11100010 -> 33300010 -> 33344410 -> 33344490 -> 33344492
  3. Print the single integer answer, a=33344492.

More Examples (For Decryption, Reverse Examples)

12349149
[170,12349149]

99922211100
[1820,9210]

2
[1,2]

9
[1,9]

10
[2,10]

100
[4,10]

0
[1,0]

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
[10141204801825835211973625643007,1]

111222333444555666777888999000
[954437176,1234567890]

10101010101010
[10922, 10101010101010]
\$\endgroup\$
8
  • \$\begingroup\$ I'm not sure if this should be one or two challenges myself. \$\endgroup\$ Commented Jul 31, 2017 at 14:24
  • \$\begingroup\$ @TheLethalCoder based on the number of inputs, you perform a different function. It's one challenge, though it'd be equally viable as two; but it's not interesting enough for 2 challenges. \$\endgroup\$ Commented Jul 31, 2017 at 14:25
  • \$\begingroup\$ Yeah that's why I wasn't sure. Just commenting in case you hadn't thought of splitting it up. \$\endgroup\$ Commented Jul 31, 2017 at 14:26
  • \$\begingroup\$ The decryption stage might be clearer if you use a number that doesn't contain 0s and 1s. \$\endgroup\$ Commented Jul 31, 2017 at 14:27
  • \$\begingroup\$ @TheLethalCoder fixed. \$\endgroup\$ Commented Jul 31, 2017 at 14:29
  • \$\begingroup\$ For your first test case you show a walkthrough. I'd either move it to an actual walkthrough place or remove the steps. \$\endgroup\$ Commented Jul 31, 2017 at 14:33
  • \$\begingroup\$ The first time you talk about the decryption key you say it's 1092. Shouldn't it be 3492? \$\endgroup\$
    – Charlie
    Commented Jul 31, 2017 at 14:49
  • \$\begingroup\$ @CarlosAlejo it used to be 11100092 but I changed it to 33344492, nice catch; missed that. \$\endgroup\$ Commented Jul 31, 2017 at 14:52
1
\$\begingroup\$

Generate a Spiral Matrix

Given N, generate one out of all the spiral matrices with dimensions N x N using the values [0, 1, ..., n-1].

For example, if N = 5, there are 16 ways to generate a spiral matrix

 0  1  2  3  4    12 13 14 15  0     8  9 10 11 12     4  5  6  7  8
15 16 17 18  5    11 22 23 16  1     7 20 21 22 13     3 18 19 20  9
14 23 24 19  6    10 21 24 17  2     6 19 24 23 14     2 17 24 21 10
13 22 21 20  7     9 20 19 18  3     5 18 17 16 15     1 16 23 22 11
12 11 10  9  8     8  7  6  5  4     4  3  2  1  0     0 15 14 13 12

 0 15 14 13 12     4  3  2  1  0     8  7  6  5  4    12 11 10  9  8
 1 16 23 22 11     5 18 17 16 15     9 20 19 18  3    13 22 21 20  7
 2 17 24 21 10     6 19 24 23 14    10 21 24 17  2    14 23 24 19  6
 3 18 19 20  9     7 20 21 22 13    11 22 23 16  1    15 16 17 18  5
 4  5  6  7  8     8  9 10 11 12    12 13 14 15  0     0  1  2  3  4

24 23 22 21 20    12 11 10  9 24    16 15 14 13 12    20 19 18 17 16
 9  8  7  6 19    13  2  1  8 23    17  4  3  2 11    21  6  5  4 15
10  1  0  5 18    14  3  0  7 22    18  5  0  1 10    22  7  0  3 14
11  2  3  4 17    15  4  5  6 21    19  6  7  8  9    23  8  1  2 13
12 13 14 15 16    16 17 18 19 20    20 21 22 23 24    24  9 10 11 12

24  9 10 11 12    20 21 22 23 24    16 17 18 19 20    12 13 14 15 16
23  8  1  2 13    19  6  7  8  9    15  4  5  6 21    11  2  3  4 17
22  7  0  3 14    18  5  0  1 10    14  3  0  7 22    10  1  0  5 18
21  6  5  4 15    17  4  3  2 11    13  2  1  8 23     9  8  7  6 19
20 19 18 17 16    16 15 14 13 12    12 11 10  9 24    24 23 22 21 20

You are allowed to use a parameter P to determine which out of the 16 spiral matrices you will generate.

Rules

  • This is so make your code as short as possible.
  • N >= 1
  • The parameter P should be a value such as a number, character, or any other reasonably simple value.
  • You may output the spiral matrix as a 2d array of numbers or characters, a formatted string, or any other easily understandable format.
\$\endgroup\$
2
  • \$\begingroup\$ Alternatively, the challenge might be to ignore P and just generate all 16 spiral matrices. \$\endgroup\$
    – miles
    Commented Jul 31, 2017 at 22:05
  • \$\begingroup\$ Also related \$\endgroup\$
    – Luis Mendo
    Commented Jul 31, 2017 at 22:27
1
\$\begingroup\$

Interpret a Maximal Number of Brainf*** Variants

A while ago in chat, I had an idea:

enter image description here

It was prompty shot down as impossible. Because of that, I'm making it a challenge!

Valid Languages

The only valid brainfuck variants you can use are the languages appearing on this link and this link (along with regular brainfuck, of course). Those two links are July 3rd, 2017 captures of the esolangs.org pages for brainfuck derivatives and brainfuck equivalents.

The Task

Your task is to create one program that, when fed code from any variant of brainfuck you say you can interpret, along with input for that program, will execute that code according to the spec of that variant. You cannot tell the interpreter beforehand what variant it is supposed to interpret.

There is one very important note: in brainfuck, for example, all characters not used are ignored as comments. Any program that is entered will not contain comments. All input will only contain characters that are not ignored by the spec.

Knowing this, if two variants of brainfuck overlap enough that you cannot differentiate between two valid, however short, programs in them, and if each language wants a different result, you can only include one of those languages.

Scoring

The most important part of this challenge is maximizing the number of variants you can support. However, you also don't want to make it too long. Therefore, the following is your score:

(variantsSupported * 300) - interpreterBytes

Highest score wins.

\$\endgroup\$
2
  • \$\begingroup\$ yeah the problem is that ignored characters are not well defined. that is, any string of characters, excluding [ and ] (they might be misbalanced) is a valid bf program. that's a part of the spec pretty much \$\endgroup\$ Commented Aug 2, 2017 at 23:25
  • \$\begingroup\$ @DestructibleLemon I'm (trying) to remove that from the spec - if part of the spec is that some chars are no-ops, your interpreter does not have to handle them \$\endgroup\$
    – Stephen
    Commented Aug 2, 2017 at 23:35
1
\$\begingroup\$

Is this 2048 board valid?

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

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

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

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

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

//Explanation of 2048 goes here.

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

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

You must log in to answer this question.

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