# Hare Krishna Hare Krishna Krishna Krishna Hare Hare

Recently, I've seen Hare Krishna people with their mantra on the emblem and I've found it may be quite interesting to code golf.

# The challenge

Write the Hare Krishna mantra, i.e.:

Hare Krishna Hare Krishna
Krishna Krishna Hare Hare
Hare Rama Hare Rama
Rama Rama Hare Hare


# Winning criteria

This is , so shortest code in bytes wins!

# Rules

• Casing must be preserved.
• Text should contain new lines.
• Lines may have trailing space(s).
• Trailing newline is allowed.
• Parsing from web or any other external resource disallowed.
• From the title I was expecting something to decode binary strings into ASCII characters. The title represents a backslash. May 1, 2017 at 23:12
• All the mantra has 97 bytes. Surpisingly enough, there are answers with more than that many bytes. May 2, 2017 at 8:03

# Perl, 76 74 bytes

$_=121202211;$_.=0 .y/2/3/r;print$_?(0,Hare,Krishna,Rama)[$_].$":$/for/./g

• 2 bytes shorter: Try it online! (I'm pretty sure the output is the right one)
Apr 28, 2017 at 19:35

# Brainfuck Substitutor, 277 bytes

{--y{-z[<]w++v->u>+<t-[x[-]Hxtuyy-]>-.ax+[ty<]>>-]<-.rx>+[-vwz>-]>.ext>w<y{]>-. x>tt-<]>u]>-.Kxtuyy-]>w.ix+[v-z>{]>.sx+[vv-z>{]>.hx+[v-z>{]>-.nxt>{<yy-]>.!xwwwww.Rxtuy]>y.mx+[v-z>+>{]>.
Hare Krishna Hare Krishna!Krishna Krishna Hare Hare!Hare Rama Hare Rama!Rama Rama Hare Hare


Brainfuck Substitutor (or BFS for short) can redefine characters to be replaced with other characters.

This program redefines the characters of the Hare Krishna mantra with brainfuck 'mini' programs that prints the appropiate characters.

As this is run in succinct mode (which doesn't need any command line arguments and is on my default), we can't redefine newlines (at least, in the current version) so I use the character ! instead - but it still outputs a newline.

This first bit of the program: {--y{-z[<]w++v->u>+<t-[x[-] is short replacements for patterns that come up often in the future.

The interpreter breaks them down like this:

{ equals --
y equals {- equals ---
z equals [<]
w equals ++
v equals ->
u equals >+<
t equals -[
x equals [-]


Similar thing goes for every other character. I used the shortest brainfuck constants on the esolangs wiki page to get my algorithms, and replaced common patterns. There may be other patterns I can replace (my original attempt was 320 bytes), but this is what I have for now.

• Could you replace Hare, Krishna, and Rama with their own macros? Apr 28, 2017 at 21:19
• @ETHproductions Maybe I could, but that wouldn't be too interesting ;)
– Okx
Apr 28, 2017 at 21:26

# Perl, 98 72 bytes

@a=("Hare ","Krishna ","Rama ","\n");foreach(split//,'ababdbbaadacacdccaad'){print $a[ord($_)-97]}

98 now reduced to 72, following @hobbs reworking, nice.

print+("Hare ","Krishna ","Rama ",$/)[$_]for'01013110030202322003'=~/./g

• Good start! Here are some tips: gist.github.com/arodland/c061dd7b0207a9b77a768391c3ff3e64 Apr 29, 2017 at 4:21
• Apr 29, 2017 at 4:22
• Retaining the ideas from yours but just golfing it harder puts it within a few bytes of the best perl solutions Apr 29, 2017 at 4:31
• Nice work, have revised the answer accordingly. Apr 29, 2017 at 8:26

# Emacs Lisp, 109 bytes

(lambda()(apply'concat(mapcar(lambda(x)(nth(- x ?a)'("Hare ""Krishna ""Rama ""\n")))"ababdbbaadacacdccaad")))


Can theoretically be reduced to 103 bytes by using ^@,^A,^B and ^C instead of a, b, c and d and x instead of (nth(- x ?a)), but then it could not be pasted due to NULL characters.

• How long would it be to output the original raw string directly?
– Cœur
May 1, 2017 at 16:12
• @Cœur 91 as the length of the string itself, +2 for quotes, +10 if you wrap it in a lambda, resulting in 103 total. Emacs Lisp is not a good language for golfing. May 11, 2017 at 15:11

# Wolfram Mathematica, 71 75 bytes

{"Krishna ","Hare ","Rama ","\n"}[[IntegerDigits[73825885093,4]+1]]<>""


Every part of result was encoded as an index in a list, and every index was encoded as digit of 4-ary integer.

• Welcome to Programming Puzzles and Code Golf! :) May 1, 2017 at 11:44

my $a="Hare ";"$a$_$a$_\n$_ $_$a$a".say for <Krishna Rama>  # Hack 68 bytes <?hh echo strtr("0101 1100 0202 2200",["Hare ","Krishna ","Rama "]);  Straight port of the PHP Answer, just wanted to finally get an excuse to use hack in PPCG :D # C++ 158 Bytes #include <iostream> #define H "Hare " #define K "Krishna " #define R "Rama " #define N "\n" void m(){std::cout<<(H K H K N K K H H N H R H R N R R H H);}  # Haskell 103 95 Bytes main=putStr$concat$concat$[[h,x,h,x,n,x,x,h,h,n]|x<-["Krishna ","Rama "]]where h="Hare ";n="\n"


Old 103 Bytes:

main=putStr$concat[h,k,h,k,n,k,k,h,h,n,h,r,h,r,n,r,r,h,h] where h="Hare ";k="Krishna ";r="Rama ";n="\n"  # C# 103 99 Bytes ()=>{string a="Hare ",b="Krishna ",c="Rama ",d="\n";return a+b+a+b+d+b+b+a+a+d+a+c+a+c+d+c+c+a+a;};  Ungolfed full program: class A { static void Main() { System.Func<string> f = () => { string a = "Hare ", b = "Krishna ", c = "Rama ", d = "\n"; return a + b + a + b + d + b + b + a + a + d + a + c + a + c + d + c + c + a + a; }; System.Console.Write(f()); } }  • You could golf it by 1 byte by using a port of my Java 7 answer: ()=>{return"xyxy\nyyxx\nxRama xRama\nRama Rama xx".Replace("x","Hare ").Replace("y","Krishna ");}; Try it here. May 2, 2017 at 13:14 # Clojure(Script), 70 bytes (69 bytes?) (def a"Hare")(run! #(println a % a %(str"\n"%)% a a)["Krishna""Rama"])  This version with 69 bytes will only work at the repl, because map is lazy and I don't use the return value for anything. Dunno how the rules work in this case... (def a"Hare")(map #(println a % a %(str"\n"%)% a a)["Krishna""Rama"])  # ///, 46 bytes /4/Hare //k/Krishna //X/4k4k kk44/X /k/Rama /X  Try it online! There was already one answer in ///, but this one adds a bit of complexity to remove some bytes. In pseudocode this could translate to: 4="Hare " k="Krishna " X=4+k+4+k+'\n'+k+k+4+4 print(X+'\n') replace k with "Rama " print(X)  (I wanted to use h as the letter to substitute with "Hare ", but "Krishna" also contains an h, so that messed up the substitutions and I had to switch it with 4) # Wren, 91 bytes Fn.new{ var n="Hare" return["Krishna","Rama"].map{|i|[n,i,n,i," "+i,i,n,n].join(" ")+" "} }  Try it online! ## Explanation Fn.new{ // New anonymous function var n="Hare" // Define a template constant return["Krishna","Rama"].map{|i|[n,i,n,i, /* Map using the rule*/" "+i,i,n,n].join(" ")+ /* [n,i,n,i,"\n",i,i,n,n]*/" "} }  # Batch, 117111103 89 bytes @set a=Hare @for %%A in ("Krishna " "Rama ") do @echo %a%%%~A%a%%%~A^ %%~A%%~A%a%%a%  Down to 103 now that trailing newlines are allowed. Down to 89 after adapting the Powershell answer. ^\n\n is used to insert a newline at the end of the first line and there's a space after Hare. # CSS: 132 Bytes No use of HTML. Not the best, not the worst but the Brainfuck (No. of bytes) and Matlab solutions (Direct output) made me post this. Can some CSS wizards help save some bytes? body:after{content:"Hare Krishna Hare Krishna\AKrishna Krishna Hare Hare\AHare Rama Hare Rama\ARama Rama Hare Hare";white-space:pre} CSS with superpowers could not beat it until someone can prove me wrong. # SASS: 163 Bytes $a:Hare;$b:Krishna;$c:Rama;body:after{content:"#{$a} #{$b} #{$a} #{$b}\A#{$b} #{$b} #{$a} #{$a}\A#{$a} #{$c} #{$a} #{$c}\A#{$c} #{$c} #{$a} #{$a}";white-space:pre}


Run it on:

# Fourier, 94 bytes

|72a97a114a101a32a|H|75a114a-9a115a104a+6a97a32a|K|82a97a109a97a32a|RHKHK10aKKHH10aHRHR10aRRHH


Try it on FourIDE!

Makes good use of functions: H for Hare, K for Krishna and R for Rama.

Now I can't get the song My Sweet Lord out of my head :P

# SmileBASIC 3, 76 bytes

Straightforward answer with string multiplication. ? is print.

?"Hare Krishna "*2?"Krishna "*2+"Hare "*2?"Hare Rama "*2?"Rama "*2+"Hare "*2


# Groovy, 82 bytes

a=["Hare ","Krishna ","Rama ","\n"]
"0101311003020232200".each{print a[it as int]}


An improvement of my previous answer (1 byte longer)

h="Hare "
k="Krishna "
r="Rama "
n="\n"
print h+k+h+k+n+k+k+h+h+n+h+r+h+r+n+r+r+h+h


# cat 97 bytes

Hare Krishna Hare Krishna<CR>
Krishna Krishna Hare Hare<CR>
Hare Rama Hare Rama<CR>
Rama Rama Hare Hare<^D>


I consider <^D> as two characters, whence 97

• I would really like to know what's wrong with the answer. It's working, and it's shorter than many "clever" answers by people around. So what?!
– yo'
May 3, 2017 at 11:44
• Is is not very clever of semi boring
– user63187
May 5, 2017 at 15:00
• There are many puzzles where the "trivial" output is, in fact, the shortest. Even if it isn't, I always start with the trivial solution so I have something to compare against. This answer is straight-forward, but perfectly fine. Jun 27, 2017 at 19:37
• mothereff.in/byte-counter this site would beg to differ with your byte count Sep 12, 2017 at 13:49
• @BrianH. Right, it should be even lower; I'm not sure how I counted, I probably considered <CR> as 2 charaters rather than 1.
– yo'
Sep 12, 2017 at 13:59

# 05AB1E, 54 bytes

•4Ñ••}ò´••9Ä•)©\•2}¾S•3BRv®yè8ÝJ"ahrekisnm"‡})4ôvyðý™,


Try it online!

•4Ñ•                          # Hare
•}ò´•                     # Krishnu
•2}¾S•3BR     # Sequencing data.
v®yè8ÝJ"ahrekisnm"‡}          # For each sequence part, push the right word.
)4ôvyðý™, # Format it correctly.


05AB1E changed its base-214 encryption to base-255; this is the reason this submission no longer works; however, it was valid at the time.

• @DLosc 05AB1E changed it's base-214 encryption to base-255; this is the reason this submission no longer works. Jun 27, 2017 at 18:49
• @DLosc I think this would be like ~34 bytes now. Jun 27, 2017 at 18:50
• Does 05AB1E also change Krishna to Krishna?
– m4n0
May 16, 2020 at 12:23

# ///, 49 bytes

/#/Hare //k/Krishna //j/Rama /#k#k
kk##
#j#j
jj##


Try it online!

Although /// is an esoteric language, this one is shorter than most of the other (non-golfing, and a bad implementation of this problem in Retina) languages here. Mostly because /// has too few functionalities, that they can be represented in few bytes.

## Javascript 85 bytes

I know there's a better answer already, but i wanted to give it a try anyway, the method is pretty different as you'll see:

a=["Krishna ","Rama "];q="Hare ";b=(z)=>q+a[z]+q+a[z]+
+a[z]+a[z]+q+q+
;b(0)+b(1)


a=["Krishna ","Rama "];q="Hare ";b=(z)=>q+a[z]+q+a[z]+
+a[z]+a[z]+q+q+
;console.log(b(0)+b(1));

Please note that i had to put the console.log() in a weird spot, if you just paste the code block into the console it'll print the mantra.

## dumbded down better golfed version 76 bytes:

a="Krishna ";b="Rama ";c="Hare ";d=
;c+a+c+a+d+a+a+c+c+d+c+b+c+b+d+b+b+c+c


a="Krishna ";b="Rama ";c="Hare ";d=
;console.log(c+a+c+a+d+a+a+c+c+d+c+b+c+b+d+b+b+c+c)

# Recursiva, 57 53 bytes

r2r1r0"0101/n1100/n0202/n2200"'Hare ''Krishna ''Rama


Try it online!

# Jq 1.5, 595754 52 bytes

def h:"Hare "+.;"Krishna ","Rama "|h*2,.*2+"Hare "*2


Try it online!

# J, 49 41 bytes

;"1{&(<;.2'Hare Krishna Rama ')(,-)#:5 12


### How it works

                                   #:5 12 to binary [(0 1 0 1), (1 1 0 0)]
( -)       negate    [(0-1 0-1),(-1-1 0 0)]
(, )       append    [(0 1 0 1),(1 1 0 0),(0-1 0-1),(-1-1 0 0)]
(<;. 'Hare Krishna Rama ')           split by
2                                the last character, keep it in
{&                                     negative argument selects from the end
;"1                                       get rid of the ASCII boxes


Try it online!

# SmileBASIC, 58 bytes

We can use the fact that the second half is the same as the first, with "Krishna" replaced by "Rama"

P"Krishna
P"Rama
DEF P K?("Hare "+K)*2?K*2;"Hare "*2
END


(Note trailing spaces)

Storing "Hare " in a variable is the same length.

# Vyxal, 73 bytes

Hλ½ K≥τ⇧¨ Hλ½ K≥τ⇧¨
K≥τ⇧¨ K≥τ⇧¨ Hλ½ Hλ½
Hλ½ R□• Hλ½ R□•
R□• R□• Hλ½ Hλ½


Try it Online!

# K (ngn/k), 65 bytes

{0:,/("Hare ";"Krishna ";"Rama ";"\n")@"ababdbbaadacacdccaa"-97}


Try it online!

This has to be the longest K program I have ever written. Takes "aba..."-97 from the Octave answer.

# Tcl, 87 bytes

puts "[set h Hare] [set k Krishna] $h$k
$k$k $h$h
$h [set r Rama]$h $r$r $r$h $h"  Try it online! • [set h Hare]? [set r Rama]? Sep 26, 2017 at 0:45 • @Scrooble: What are you trying to ask? set puts the value in a var that can later be consulted if prefixed by $ Sep 26, 2017 at 0:50
• Your code does not output quite what the challenge specifies. I was giving corrections; sorry for my lack of clarity. Sep 26, 2017 at 0:54
• @Scrooble: Thanks. Now fixed. Sorry for misunderstanding you Sep 26, 2017 at 0:56

# Go, 167 bytes

func f(){w,i,k:=[]string{"Hare","Krishna","Rama"},[]int{0,1,0,1,1,1,0,0,2,0,2,0,2,2,0,0},0
for _,e:=range i{if k>3{print(
)
k=0}
if k>0{print(" ")}
print(w[e])
k++}}
`

Attempt This Online!

Prints to STDERR.