Write the whole of the holed using the unholed

55

5

The ASCII characters from decimal code 33 to 126 are:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Notice that in most fonts, 25 of these characters have "holes" in them: (a genus greater than 0 you might say)

#$%&04689@ABDOPQRabdegopq

The other 68 "unholed" characters are:

!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

Your task is to write the shortest program possible using only the unholed characters that outputs each of the holed characters exactly once in any order.

Since Space, Tab and newlines (Line Feed and/or Carriage Return) are empty space they may appear in your program or its output. They still count towards the number of characters. Other ASCII characters may not be used (and certainly not non-ASCII characters).

Notes

  • You do not have to use all of the unholed characters nor only one of each.
  • The output may not contain unholed characters.
  • The Whitespace language may be used.
  • Output should go to stdout or can go to a file. There should be no input.

Bonus: Just for fun, try printing all the unholed characters using the holed characters. I'm skeptical that it can be done in an existing language.

Calvin's Hobbies

Posted 2014-07-29T04:19:35.460

Reputation: 84 000

1How did no one ever notice that I forgot ~?? – Calvin's Hobbies – 2015-03-13T04:50:16.007

9

+1 for the title. We do love stuff like this.

– Jacob – 2014-07-29T07:35:20.823

68163 characters in jSFuck – edc65 – 2014-07-29T09:37:01.937

1Where is the Perl solution?! – Pierre Arlaud – 2014-07-29T09:48:51.033

4Well, no solution in Haskell or C; if it's a program you want, then you need to spell main. – Rhymoid – 2014-07-29T10:22:47.643

Can we output unholed characters as well? – C5H8NNaO4 – 2014-07-29T15:33:58.910

@C5H8NNaO4 No. Only the holed and the specified whitespace. – Calvin's Hobbies – 2014-07-29T17:04:41.657

2Bonus can be done using whitespace. – Joshua – 2014-07-29T19:50:22.420

In Perl and Ruby you can wrap the Bash solution in backticks. Otherwise, I think it's impossible (maybe if you allowed the -p flag, but that seems holey.) – histocrat – 2014-07-29T21:20:33.013

Can you output anything but an error without a p in Python? – Nick T – 2014-07-31T22:53:33.467

Answers

18

Pyth, 43 35 characters

tTFk"*+,-7;=?GHIKVWXYhiklnvwx"C-Ck7

Try it here.

Prints the characters in order except that 9 is at the beginning, newline separated.

String contains all characters 7 greater than the ones needed, except that 9 would become @, so it is special cased. Algorithm thanks to @Howard.

Explanation:

tT                print(10-1)                T=10, t(x)=x-1 if x is an int.
Fk"<string>"      for k in "<string>":
C-Ck7             print(chr(ord(k)-7))       Note that C is overloaded as ord and chr.

isaacg

Posted 2014-07-29T04:19:35.460

Reputation: 39 268

24

GolfScript, 37 36 characters

[":=<?)-/! YX[]VIHKx{}|~vih"{25^}/]+

Try the code here.

The string contains the forbidden characters xor'ed with 25. Fortunately all characters are mapped to valid ones.

Howard

Posted 2014-07-29T04:19:35.460

Reputation: 23 109

22

Brainfuck 119

--[------->++<]>-.+.+.+.++++++++++.++++.++.++.+.+++++++.+.+.++.+++++++++++.+.+.+.[------>+<]>--.+.++.+.++.++++++++.+.+.

Teun Pronk

Posted 2014-07-29T04:19:35.460

Reputation: 2 599

uh, the -- at the start... Are you cycling back to 254 on the initial register there? – WallyWest – 2014-07-29T06:43:16.410

1Yup :) Makes the loop to 36 shorter (in order to get to 35) – Teun Pronk – 2014-07-29T06:45:12.673

Well, it certainly beats my 275... well done... – WallyWest – 2014-07-29T07:03:16.397

@Calvin's Hobbies I'm fairly certain no input is allowed, sorry. OP might want to clarify, though. – isaacg – 2014-07-29T07:07:33.510

@isaacg I know, thats why my main code doesnt take input and the last example isn't a serious one :) – Teun Pronk – 2014-07-29T07:08:22.607

No input should be required. – Calvin's Hobbies – 2014-07-29T07:18:32.600

@Calvin'sHobbies Removed the code that required input :) – Teun Pronk – 2014-07-29T07:31:48.273

There are some tricks here: http://esolangs.org/wiki/Brainfuck_constants for shorter constants in BF, including the following 15 character way to make 35: >+[++<[-<]>>+]<. I'm kind of scared of it, actually, nothing should wrap around that many times. Don't feel obligated to use them or anything.

– isaacg – 2014-07-29T07:57:42.500

20

Bonus - dc, 179 characters

Oh good, another restricted character set challenge where P is allowed.

6A44469PD684P44D4898PDB99P4008D0BP486B48BPA60BPD096P4A68666P460A0D4P690490AP8084088P6B6AB66P6BBB608P80D4BAAPA046PBAD4P60A6668P480DD96P4A040BBP848BP40DD8D0P46840B6P696B48BP48D64BAP

Since dc is apparently obscure enough to require explaining (strange to me considering the weird stuff around here!) here's an overview:

It's primarily an RPN calculator with arbitrary-precision arithmetic. But for this challenge, I'm making use of the P command, which interprets a number as a series of characters in base 256 and prints them. Examples: 65 P prints A (ASCII code 65). 16706 P prints AB (16706=65*256+66).

Aside from that, the only other interesting feature is that it recognizes all of the hexadecimal digits 0-9A-F even when they are not contained in a hexadecimal number. Decimal input is the default, so the input token 999 means 9 hundreds + 9 tens + 9 and ABC means 10 hundreds + 11 tens + 12 making it equivalent to 1122.

The ability to use the digits ABD in decimal partially makes up for the inability to use 12357, and the choice of ordering and grouping does the rest. (If I need some numbers x,y,z and they aren't representable with allowed digits, then I try representing x*256*256+y*256+z instead.)

The program can probably be made slightly shorter by using larger groups. I didn't go past 3 bytes per number.

user15244

Posted 2014-07-29T04:19:35.460

Reputation:

@Joey Easily installable on MSYS2 (pacman -S bc). Also, saving the program as a file is unnecessary: echo 'program' | dc. – jpmc26 – 2016-02-20T00:31:44.623

1@DigitalTrauma the other way around was the Bonus at the end of the problem statement. – None – 2014-07-29T16:44:34.967

Ha! I missed that! Excellent! +1 – Digital Trauma – 2014-07-29T16:46:25.290

Can you explain this? And is there a place we can run this? – Calvin's Hobbies – 2014-07-29T17:08:54.423

4

A place you can run it? dc isn't some silly language designed for making hard-to-read programs, it's a serious calculator. Run it on any unix machine (or cygwin). http://en.wikipedia.org/wiki/Dc_(computer_program)

– None – 2014-07-29T17:15:18.077

@Calvin'sHobbies If you have access to just about any Linux or Unix machine (including OSX), simply save as a text file e.g. bonus.dc, then run dc bonus.dc. dc is one of the oldest languages out there and has been a permanent fixture in *nix for literally decades. Its not well-known though, probably due to its arcane and not-very-readable RPN syntax. Great for some [tag:code-golf] challenges though ;-) – Digital Trauma – 2014-07-29T19:45:16.943

Thanks @DigitalTrauma. Unfortunately I don't have a *nix system handy :/, though I'll try it on cygwin. – Calvin's Hobbies – 2014-07-29T20:45:31.793

@Calvin'sHobbies http://www.cygwin.com/ml/cygwin-announce/2001/msg00188.html

– Digital Trauma – 2014-07-29T20:49:16.933

@Calvin'sHobbies: It'd probably be easier to set up a VM than deal with Cygwin (imho). Especially things like Vagrant enable you to have one running in minutes (and most of that is waiting for the download).

– Joey – 2014-07-30T05:58:15.967

12

Bash+coreutils, 56 bytes

tr \(-y \!-r<<<'*+,-7;=?GHIKVWXYhiklnvwx'
tr C-F 7-:<<<E

As luck would have it, adding 7 to the ascii value of the holed characters yields all unholed characters (with the exception of "9"). So we just do this transformation in reverse, then a similar transformation (subtract 12 from "E") to get the "9".

Output:

#$%&0468@ABDOPQRabdegopq
9

Digital Trauma

Posted 2014-07-29T04:19:35.460

Reputation: 64 644

7I like how the first line subtracts 7 from a bunch of characters, and it contains a -7 conspicuously displayed between punctuation characters, and those 2 facts have nothing to do with each other. – None – 2014-07-29T19:56:42.120

@WumpusQ.Wumbley I hadn't even noticed that :) – Digital Trauma – 2014-07-29T20:03:30.777

6

Perl - 49 Bytes

symlink".",':=<?)-/! YX[]VIHKx{}|~vih'^chr(25)x25

This is pretty much a Perl version of Howard's solution. XORing the string with 25. The output is a file with the name #$%&04689@ABDOPQRabdegopq. I got the idea to use symlink and the file name as the output format because everything else is banned.

Here's another Perl solution I came up with. It can probably be improved a lot and it is pretty long, so I'm leaving in a readable format for now.

until(y/1/1/>32){s//1/}
until(y/1/1/>125+1){
    if(chr(y/1/1/)!~/[!"'()*+,-.\/12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\\\]^_`cfhijklmnrstuvwxyz{|}~]/) {
        symlink".",chr y/1/1/;
    }
    s/^/1/
}

This one outputs many files, the name of each one is one of the characters. I couldn't figure out how to append strings without using a forbidden character.

for, while, map, say, print, eval, s///e, and any variable name cannot be used (variables start with @ or $ in Perl) which made this difficult.

Hopefully file names are okay as an output format because I'm pretty sure every other way to output information uses one of the banned characters.

hmatt1

Posted 2014-07-29T04:19:35.460

Reputation: 3 356

I'm going to give you a +1 for creativity! Very clever use of code! – WallyWest – 2015-07-23T22:19:04.040

I know this is pretty old, but it's possible to print the output to screen and save a few bytes using the -p flag and *_=\(...): Try it online!

– Dom Hastings – 2018-06-07T05:37:32.937

@DomHastings cool! I think the -p flag would be banned though since the p has a hole. – hmatt1 – 2018-06-07T16:22:41.813

5

MATLAB, 36 bytes

SO CLOSE.... Only 1 byte more than the current winner (isaacg)! Which, on further inspection, already did what I set out to do too. Well, no harm in reinventing the wheel...

I know this is an old challenge, but I only realized that after I got interested in it.

['*+,-7;=?GHIKVWXYhiklnvwx'-7,57,'']

If only I could get MATLAB to understand that I want a string without a separate ''... suggestions, anyone?

Sanchises

Posted 2014-07-29T04:19:35.460

Reputation: 8 530

4

Brainfuck 303 275

++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>+++.--->----.+.+.++>.>----.++.++.+.->.+.+.-->----.++++>-.+.+.+.-->>+.+.-->----.+.++.+>-.+.+.

Brainfuck, the ultimate unholed esoteric language (apart from Whitespace) ;)

WallyWest

Posted 2014-07-29T04:19:35.460

Reputation: 6 949

1Please delete old fragments, don't strike-through. – isaacg – 2014-07-29T06:43:50.280

2I see you used the quote thingies (dont know real name) for your code snippets. Might be easier to select your code and press Ctrl+K :) – Teun Pronk – 2014-07-29T06:50:48.573

@isaacg Done. TeunPronk, done! – WallyWest – 2014-07-29T07:11:55.057

6Or just hit the spacebar 4 times if it's only a line or two. @TeunPronk This? ``` That's a backtick. (Also called a grave accent, although "quote thingies" is a new one for me :P) – Doorknob – 2014-07-29T07:41:12.263

1@Doorknob Then we both learned something today although what you learned is wrong anyhow :P – Teun Pronk – 2014-07-29T07:42:13.293

4

JS - 196 - try it

h=(c=!1+[])[1];i=c[2*2];j=(f=[]+{})[1];this[i+'v'+h+'l'](h+'l'+i+'rt('+h+'t'+j+f[2]+'("Iy\x51lJj\\x'+2*2+'1\\x3'+~-1+'Nj\\x'+2*3+'75\x51EFC\x52E\\x3'+3*3+'\x51UVJhYm\x52lZ2\\x3'+3*3+'wc\x51=="))')

bebe

Posted 2014-07-29T04:19:35.460

Reputation: 3 916

1Gosh, this is crazy. It seems Js is one of the most abusable language=) – flawr – 2014-07-29T22:21:01.060

Abusable yes, but this is a mere speck compared to my entry... Sorry @bebe but I've out-JS'd you this time... – WallyWest – 2014-07-29T23:02:36.560

1@WallyWest i declare war. – bebe – 2014-07-29T23:31:53.430

1217: h=1-1;j=3+3;k='\\x';m=!i+k;c=m[1];f=m[i=2+2];l=k+3;n=k+j;r=k+i;this[f+'v'+c+'l'](c+'l'+f+'rt("\\x23\\x2'+i+k+25+k+2+j+l+h+l+i+l+j+l+2*i+l+3*3+r+h+r+1+r+2+r+i+r+'f\\x5'+h+k+51+k+52+c+n+2+n+i+f+n+7+n+'f\\x7'+h+k+'71")') - inlined l, shortened m, declared i on first use, created a few extra vars for repeated patterns (you could possibly improve this by tweaking the order of chars outputed, but that's beyond my patience :P). – Alconja – 2014-07-30T01:03:21.070

2

GolfScript, 89 characters

71 22+,{33+}/]''+'!"\'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}'-

Simply builds an array of all ASCII characters and subtracts the non-"holed" characters from them.

71 22+,  # Builds array of 0..93
{33+}/]  # Converts to 33..126
''+      # Convert ASCII codes to string
'stuff'- # Subtracts "stuff" (the non-holed characters) from the string

Doorknob

Posted 2014-07-29T04:19:35.460

Reputation: 68 138

2

Befunge 98 - 69 bytes

"()+ijWI=*">:5j2 ,-5_"157:h">:5j2 ,-1_"=>?LMN^_lmn">:5j2 ,+3_"?"1+s <

Does it in 3 parts. One where unholed character values differ from holed character by 5. Then the ones that differ by 1, and finally a list of unholed characters that differ by 3 from holed ones. The terminate program instruction in Befunge is "@" (char value 64), so at the end I load "?" (char value 63) add 1 then put that in the code with the instruction 's'.

I could maybe golf it more by consolidating the three

>:5j2 ,(differ value)_

section, but probably not by much.

AndoDaan

Posted 2014-07-29T04:19:35.460

Reputation: 2 232

2

JavaScript 240 228

Initial submission:

z=(!1+"")[1];y=(!!1+"")[3];x={}+"";w=x[1];v=x[2];u=z+"t"+w+v;1[_="c\157nstruct\157r"][_](z+'l'+y+'rt('+u+'("Iy\x51lJj"+'+(t=u+'("\x51\x51==")')+'+'+u+'("M"+'+t+'+"==")+"Nj"+'+u+'("Zw==")+"5\x51EFC\x52E\71\x51UVJhYm\x52lZ2\71wc\x51=="))')()

Now, this is a great start, here's how it breaks down...

z=(!1+"")[1];        // assigns "a" to z, !1+"" === "false"
y=(!!1+"")[3];       // assigns "e" to y, !!1 === "true"
x={}+"";             // assigns "[object Object]" to x
w=x[1];v=x[2]        // assigns "o" to w, and "b" to v
u=z+"t"+w+v;         // creates the mystical "atob" command, yes, I'm gonna use it!
1[_="c\157nstruct\157r"][_] // sets up the primitive to a number object... this acts similar to the "window" primitive object so that I can play off functions...
z+'l'+y+'rt(         // starts creating an alert call
'+u+'("Iy\x51lJj"+'+(t=u+'("\x51\x51==")')+'+'+u+'("M"+'+t+'+"==")+"Nj"+'+u+'("Zw==")+"5\x51EFC\x52E\71\x51UVJhYm\x52lZ2\71wc\x51=="))')()
// Above line abuses atob command with a couple of nested instances of the command, also using hex and octal equivalents of characters

And then I thought... "There must be a simpler way..." and there is...

Revised submission: z=(!1+"")[1];y=(!!1+"")[3];x={}+"";w=x[1];v=x[2];u=z+"t"+w+v;this[y+"v"+z+"l"](z+'l'+y+'rt('+u+'("Iy\x51lJj"+'+(t=u+'("\x51\x51==")')+'+'+u+'("M"+'+t+'+"==")+"Nj"+'+u+'("Zw==")+"5\x51EFC\x52E\71\x51UVJhYm\x52lZ2\71wc\x51=="))')

Seeing I can use eval (by piecing it together, inspiration from @bebe; which is a lot quicker than using the constructor of a constructor of a number... ) I drilled it down to 228... I know it may not win this particular Golf Challenge, but this is just my way of showing how much you can abuse JavaScript, and still get the desired result...

WallyWest

Posted 2014-07-29T04:19:35.460

Reputation: 6 949

2

Main - Insomnia, 50

FFy~~jF~y<={*n<<ztf>={.f=(tHL~k<yf={*n>Lj(FunLn<j~

It outputs:

abdegopq04689@ABDOPQR#$%&

Bonus - Insomnia, 268

ogeeoddp@poe@ggep@oe@opge@gee@%d@p@gqeo@p@ge@e9de49ed9e4dppe@%e@geee@ge@p%ee@%e@dp@%ep@%ee@%d@%eeee@%e@%ee@%e@geee@%e@gee@ggopop@peo@ggep@p@ge@ggeep@ge@gee@%e@geee@ge@gee@ge@ppoep@%ee@%edep@gepe@ge@%ee@%e@geee@ge@%ee@%%eeoe@ge@pep@%gep@p@%e@%%eep@%e@gee@e%e@oe@%gep@p@

It outputs:

!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[\]^_`cfhijklmnrstuvwxyz{|}~

I think it should be possible to reduce the length of the program if the output is rearranged, but I need to modify my search program to do this.

Just to show case another language which is capable of operate with a restricted number of characters. By the way, it can write just about any output with only 3 unique characters in the source.

Currently, this is the only language that can do both the main challenge and the bonus among all the existing answers.

Insomnia Interpreter.

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Posted 2014-07-29T04:19:35.460

Reputation: 5 683

1

Japt, 33 bytes

7+2+"*+,-7;=?GHIKVWXYhiklnvwx"c-7

Try it online!

Same algorithm as isaacg's Pyth submission, just happens to be shorter in Japt.

How it works

7+2+"*+,-7;=?GHIKVWXYhiklnvwx"c-7

7+2           Obviously the number 9
    "..."c-7  Apply -7 on each char's charcode of this string
   +          String concatenation

Yes, it's JS, which is one of the most abusable languages, just shorter (and you don't need alert or console.log here).

Bubbler

Posted 2014-07-29T04:19:35.460

Reputation: 16 616

1

Befunge 98 - 46 bytes

Befunge-ified version of isaacg's Pyth entry:

"xwvnlkihYXWVKIHG?=;7-,+*">:5j2 ,-7_"?"1+:,s <

AndoDaan

Posted 2014-07-29T04:19:35.460

Reputation: 2 232