7
\$\begingroup\$

This is my first question in Code golf I found it in stack-overflow (originally in JavaScript however all languages are acceptable):

Render on screen NxN (where N in range 1-16) grid where each cell have black boundary and red number inside - cells are numerated in hex starting from left-upper corner to bottom-right. Example output (for N=16) shows how result should looks like (font can be different than in picture):

enter image description here

The image in text uri form (which works on major browsers) in output is also acceptable - a as example blow:

<img src="data:image/png;base64,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"/>

This is my (not optimised) attempt to this task

document.write('<style>.row { display: flex; font-size: 9.5px; text-align: center; color: red } .cell { width: 10px; height: 10px; margin: 1px; border: 1px solid black;}</style><div id="container"></div>')

let n=10, s='';

for(let i=0; i<n; i++) {
  s+= '<div class="row">'
  for(let j=0; j<n; j++) s+= `<div class="cell"> ${(i*n+j).toString(16)} </div>`;
  s+= '</div>'
}

container.innerHTML = s;

but I wonder how small code can produce similar effect?

\$\endgroup\$
14
  • 7
    \$\begingroup\$ Was starting to work on a brainfuck solution until I realised it can't output text in red :'( \$\endgroup\$ Sep 18, 2019 at 7:29
  • 1
    \$\begingroup\$ Related \$\endgroup\$ Sep 18, 2019 at 9:04
  • 1
    \$\begingroup\$ @KamilKiełczewski if "NxN (where N in range 1-16)" is no longer a requirement it should be removed from the spec, although I don't know why you're allowing a uri now. \$\endgroup\$ Sep 18, 2019 at 9:23
  • 2
    \$\begingroup\$ Why are some of your comments deleted now?.. An few hours ago you said input wasn't required, and @JonathanAllan asked to remove it from the challenge description as response. And now those comments are removed without a change to the challenge description.. So, do we take an input or not? And please edit the challenge description accordingly.. \$\endgroup\$ Sep 18, 2019 at 12:29
  • 2
    \$\begingroup\$ I've VTCed this as unclear as, other than the issue of whether or not we should take input, there are a lot of things not covered by the spec including, but not limited to, border size, margins, padding and justification of text. \$\endgroup\$
    – Shaggy
    Sep 18, 2019 at 21:15

6 Answers 6

4
\$\begingroup\$

Could go smaller, but here's a quick one:

let n=10;container.innerHTML=(d='<div class="')+'grd" style="width:'+n*14+'px">'+[...Array(n*n)].reduce((a,b,i)=>a+d+'cell">'+i.toString(16)+(e='</div>'),'')+e;
.grd { display: inline-block; font-size: 9.5px; text-align: center; color: red;}
.cell { display:inline-block; width: 10px; height: 10px; margin: 1px; border: 1px solid black;}
<div id="container"></div>

\$\endgroup\$
4
  • \$\begingroup\$ Hello and welcome to codegolf ! I invite you to put your code on tio.run and export it here. The website has a special export for StackExchange and will show your score on your answer. \$\endgroup\$ Sep 18, 2019 at 8:35
  • 1
    \$\begingroup\$ @Therandomguy, would the numbers stay red when run on TIO? \$\endgroup\$
    – manatwork
    Sep 18, 2019 at 8:39
  • \$\begingroup\$ @manatwork you actually got a point here ... \$\endgroup\$ Sep 18, 2019 at 8:39
  • \$\begingroup\$ I believe this needs to be changed to take the n as input since the spec states, "NxN (where N in range 1-16)". \$\endgroup\$ Sep 18, 2019 at 9:11
3
\$\begingroup\$

Red, 131 bytes

n: -1 view collect[loop 16[keep 'across
loop 16[keep compose[field 20x20 font-color red(to""to-hex/size n: n + 1 2)]]keep 'return]]

enter image description here

If the leading zeroes need to be discarded:

Red, 154 bytes

n: -1 view collect[loop 16[keep 'across
loop 16[s: to""to-hex/size n: n + 1 2 parse s[remove"0"]keep
compose[field 20x20 font-color red(s)]]keep 'return]]

enter image description here

Note: The first screenshot is taken on my Win 10 PC, the second one - on my Win 8.1 laptop, hence the difference.

\$\endgroup\$
4
  • 1
    \$\begingroup\$ It is actually mostly red, yeah... \$\endgroup\$ Sep 18, 2019 at 19:12
  • \$\begingroup\$ The first line shouldn't include leading 0s. \$\endgroup\$
    – Shaggy
    Sep 18, 2019 at 19:54
  • \$\begingroup\$ @Shaggy Ok, I'll fix it tomorrow. \$\endgroup\$ Sep 18, 2019 at 20:53
  • 2
    \$\begingroup\$ On second thought, it might be worth asking whether they are allowed first. \$\endgroup\$
    – Shaggy
    Sep 18, 2019 at 21:16
2
\$\begingroup\$

PowerShell, 319 bytes

-1..15|%{If($_-lt0){$s="┌──";0..14|%{$s=$s+"┬──"};Write-Host "$s┐";}Else{$i=$_;0..15|%{Write-Host "│"-NoNewline;Write-Host ("{0:X2}"-f($i*16+$_))-f 12 -NoNewline;};Write-Host "│";$s=("├","└")[$_-eq15]+"──";0..14|%{$s=$s+(("┼","┴")[$i-eq15]+"──")};Write-Host("$s┤","$s┘")[$_-eq15]}}

Screenshot of the output:

enter image description here

Only my second PowerShell answer, so can definitely be golfed substantially.. Also, is it possible to create and use an Alias for the Write-Host?

Explanation:

TODO: Will add one later.

The X2 could be x2 to format the hexadecimal as lowercase letters.

\$\endgroup\$
3
  • \$\begingroup\$ @LuisMendo Fixed.. Can definitely be golfed some more though.. It's only my second PowerShell answer ever, so I'm not too sure what I'm doing. ;) EDIT: Hmm, comparing it to the challenge screenshot, I might need spaces between blocks.. >.> \$\endgroup\$ Sep 18, 2019 at 11:41
  • \$\begingroup\$ how N could be parameterized? \$\endgroup\$ Sep 18, 2019 at 12:19
  • \$\begingroup\$ @NahuelFouilleul OP said it was always 16 in the comments and as you can see at JonathanAllan's response, he asked to delete it from the challenge in that case, but now OP deleted his comments.. :S I honestly don't know anymore what the challenge is asking, since it keeps changing in the comments, without any substantial edits to the description.. >.> Three hours ago OP stated there wasn't any input required; now it sounds like there is an input required.. I'm gonna close as unclear until OP clarified AND edited the challenge description. \$\endgroup\$ Sep 18, 2019 at 12:26
2
\$\begingroup\$

Japt, 51 49 bytes

Wrong tool for the job, but I got it working eventually with a little help from my solution to Little Boxes on the Hillside. The spec doesn't include any details on margins, padding & border width so this won't look exactly like the reference image.

G²ÇsG ici%Ãú òG
£OlX¬,$...$¡`Þ:so¦d #000;¬l:d

Test it (Open your browser's console)

If input is required then this should work for 50 48 bytes.

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

PHP, 157 bytes

<?php for(;$i++<$n=$_GET[n];)for(print'<p>';$$i++<$n;)echo'<x style="color:red;border:1px solid #000;display:inline-block;width:25px">'.dechex($x++).'</x> ';

This should be run as a webpage, not from CLI. Pass input as a URL query string named n. For example: grid.php?n=16

Sample output for n=8:

<p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">0</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">4</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">5</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">6</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">7</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">8</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">9</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">a</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">b</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">c</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">d</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">e</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">f</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">10</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">11</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">12</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">13</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">14</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">15</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">16</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">17</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">18</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">19</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1a</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1b</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1c</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1d</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1e</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">1f</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">20</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">21</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">22</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">23</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">24</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">25</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">26</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">27</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">28</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">29</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2a</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2b</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2c</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2d</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2e</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">2f</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">30</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">31</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">32</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">33</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">34</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">35</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">36</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">37</x> <p><x style="color:red;border:1px solid #000;display:inline-block;width:25px">38</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">39</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3a</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3b</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3c</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3d</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3e</x> <x style="color:red;border:1px solid #000;display:inline-block;width:25px">3f</x> 

TIO link to get raw outputs (you have to save them as HTML to see the result): Try it online!

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

JavaScript (web browser console), 160 bytes

I think a JavaScript golfer should be able to golf this idea a lot more (I'm not one!).

function(n){for(x=i=0;i++<n;console.log(...a))for(j=0,a=[''];j++<n;a.push('float:left;border:1px solid #000;color:red'))a[0]+='%c'+(x++).toString(16).padEnd(2)}

A 155 bytes version, but it prints some noises on top and right of the grid:

function(n,a=[]){for(x=0;x<n*n;a.push('float:left;border:1px solid #000;color:red'),a[0]+='%c'+(x++).toString(16).padEnd(2))x%n?0:console.log(...a,a=[''])}

This only works in modern browsers console.

Sample usage in console: f=...code above...; and then f(16);

Or open your browser's console and then click on Run code snippet button.

f=function(n){for(x=i=0;i++<n;console.log(...a))for(j=0,a=[''];j++<n;a.push('float:left;border:1px solid #000;color:red'))a[0]+='%c'+(x++).toString(16).padEnd(2)};
f(16);

Explanation:

In a modern browser console, you can use this format to apply CSS to your values printed in the console:

console.log('%c Value', 'color: red; font-size: 10px;');

For every %c you have to add a new argument with your styles and those styles will be applied until the next %c. So to style and print two values in same line, we can use something like this:

console.log('%c Value %c Value2', 'color: red; font-size: 10px;', 'font-weight: bold;');

In the function above, I'm collecting arguments for each row in an array called a and each row gets a single console.log for itself.

\$\endgroup\$
4
  • 1
    \$\begingroup\$ It almost work in Opera, the 1st line is displayed shorter than the other ones. \$\endgroup\$ Sep 18, 2019 at 11:39
  • 1
    \$\begingroup\$ @Therandomguy golfed more and this one should work in any modern browser's console. \$\endgroup\$
    – Night2
    Sep 18, 2019 at 11:52
  • \$\begingroup\$ I don't think you need the float, do you? \$\endgroup\$
    – Shaggy
    Sep 18, 2019 at 19:50
  • \$\begingroup\$ @Shaggy without float I lose the top border for each cell. OP says "each cell have black boundary". \$\endgroup\$
    – Night2
    Sep 18, 2019 at 19:52

Not the answer you're looking for? Browse other questions tagged or ask your own question.