野兔克里希纳野兔克里希纳克里希纳克里希纳野兔野兔


65

最近,我看到Hare Krishna人的口号上印有咒语,我发现编写高尔夫球代码可能很有趣。

挑战

写下野兔奎师那的口头禅,即:

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

获奖标准

这是,因此以字节为单位的最短代码胜出!

规则

  • 外壳必须保留。
  • 文字应包含新行。
  • 线可能有尾随空格。
  • 尾随换行符是允许的。
  • 禁止从Web或任何其他外部资源进行解析。

2
从标题开始,我期望将二进制字符串解码为ASCII字符。标题代表反斜杠。
immibis

5
所有的咒语都有97个字节。令人惊讶的是,答案远远超过了字节数。
Masclins'5

嗯,为什么它看起来像Rickroll骗子?
马修·卢

Answers:


58

果冻,22字节

“t,ȧṫÞċḅ»Ḳ“¡¥Ɓc’ṃs4K€Y

在线尝试!

这个怎么运作

“t,ȧṫÞċḅ»Ḳ“¡¥Ɓc’ṃs4K€Y  Main link. No arguments.

“t,ȧṫÞċḅ»               Use Jelly's dictionary to yield the string
                        "Hare Rama Krishna". Fortunately, the words Rama, Krishna,
                        and hare (lowercase H) are in the dictionary.
         Ḳ              Split at spaces, yielding ["Hare", "Rama", "Krishna"].
          “¡¥Ɓc’        Base-250 literal; yielding 15973600.
                ṃ       Convert 15973600 to base ["Hare", "Rama", "Krishna"]
                        (ternary), where "Krishna" = 0, "Hare" = 1, and "Rama" = 2.
                 s4     Split the resulting string array into chunks of length 4.
                   K€   Join each of the four chunks by spaces.
                     Y  Join the resulting strings by linefeeds.

43
Convert 15973600 to base ["Hare", "Rama", "Krishna"]谢天谢地,您进一步解释了这一点,因为这没有任何意义。
Nic Hartley'17

11
我需要["Hare", "Rama", "Krishna"] 更多使用基数。
ATaco

63

05AB1E,38个字节

如果尾随换行符可以缩短2个字节。

“«Î‡Ä¦í¥Â“#€¦`«'kì)™ð«•2ÍZì•3BSè#4ô¨»?

在线尝试!

说明

“«Î‡Ä¦í¥Â“                              # push the string "drama share irish dna"
          #                             # split on spaces
           €¦                           # remove the first character of each word
             `                          # split to stack as separate words 
              «'kì                      # concatenate the last 2 and prepend "k"
                  )™                    # wrap in list and title-case
                    ð«                  # append a space to each
                      •2ÍZì•            # push 27073120
                            3B          # convert to base-3: 1212221110100011
                              Sè        # index into the list with each
                                #       # split on spaces
                                 4ô     # split into pieces of 4
                                   ¨    # remove the last
                                    »   # join on spaces and newlines
                                     ?  # print without newline

58
drama share irish dna,真的吗?这个想法从何而来?+1 :)
Stewie Griffin's

14
坦白地说,您是否构建了05AB1E golfed代码生成器?
YSC

1
@YSC对于字典压缩来说不是一个坏主意。我在上面
Magic Octopus Urn



39

八度,74 59字节

[{'Hare ','Krishna ','Rama ',10}{'ababdbbaadacacdccaa'-96}]

在此处验证输出

说明:

{'Hare ','Krishna ','Rama ',10}创建一个包含三个字符串的单元格数组,其中第四个为10(换行符的ASCII值)。

{'ababdbbaadacacdccaa'-96}是对上面的单元格数组进行索引的向量。向量是[1 2 1 2 4 ...]因为我们96从字符串中减去ababd...

周围的方括号用于连接结果,而不是 ans = Hare; and = Krishna; ans = ...


我不知道您可以在Octave中索引像这样的单元格(不同于MATLAB)!
2017年

19

视网膜,39字节


hkhk¶kkhh
h
Hare 
*`k
Krishna 
k
Rama 

在线尝试!

通常是普通替换,唯一的“窍门”是修饰符*,该修饰符打印替换的结果,然后将字符串恢复为以前的样子。



12

JavaScript,75 70字节

`0101
1100
0202
2200`.replace(/./g,n=>['Hare ','Krishna ','Rama '][n])

在线尝试!

console.log(`0101
1100
0202
2200`.replace(/./g,n=>['Hare ','Krishna ','Rama '][n]))


2
最好直接在模板字符串中使用文字换行符,而不要使用digit 3。模板字符串将具有相同的长度,但是您以后不必替换它们。(不会引起数组索引问题,因为/./不匹配换行符。)
manatwork'Apr 27'17

12

C

154字节,124字节, 96字节

i;main(){char*c="agagvggaavapapvppaaHare \0Krishna \0Rama \0\n";while(i<19)printf(c+c[i++]-78);}

在线尝试!

丹尼斯(Dennis)节省了28个字节


1
欢迎使用编程难题和Code Golf。
Rohan Jhunjhunwala

1
这是编程拼图和代码高尔夫球的非常标准的首字母缩写,即堆栈交换的名称。抱歉,我应该说清楚。欢迎来到我们的网站,良好的第一篇文章。
Rohan Jhunjhunwala

1
这不适用于所有编译器,但gcc不需要include语句。另外,如果将提交限制为C,则可以删除int并进行i全局声明,使其默认为零。tio.run/nexus/…–
丹尼斯

2
@AnT是的,但是高尔夫比赛的代码不需要“适当”的代码。在PPCG上,我们通过语言的实现来定义语言。只要有编译器生成可运行的可执行文件,答案就是有效的。
丹尼斯,

1
main(){for(char*t="BG@ESCB;:N8F6DIBA10Hare \0Krishna \0Rama \0\n";*t^72;printf(t+*t++-48));}节省4个字节。
约翰·杜托伊特

11

V40,36个字节

iHare Krishna 
 Rama ç^/ä$Ùdww.$2p

在线尝试!

十六进制转储:

00000000: 6948 6172 6520 4b72 6973 686e 6120 0a0e  iHare Krishna ..
00000010: 2052 616d 6120 1be7 5e2f e424 d964 7777   Rama ..^/.$.dww
00000020: 2e24 3270                                .$2p

说明:

iHare Krishna   " Enter 'Hare Krishna' on line 1
<C-n> Rama      " Enter 'Hare Rama' on line 2. This works because <C-n>
                " autocompletes alphabetically, and 'Hare' comes before 'Krishna'
<esc>           " Return to normal mode
ç^/             " On every line:
   ä$           "   Duplicate the text on the line horizontally
     Ù          "   Make a new copy of the line
      dw        "   Delete a word
        w       "   Move forward a word
         .      "   Delete a word again
          $     "   Move to the end of the line
           2p   "   And paste what we've deleted twice

<C-n>命令对于此类挑战非常有用。:)


10

C#,109个字节

void a(){Console.Write("{0}{1}{0}{1}\n{1}{1}{0}{0}\n{0}{2}{0}{2}\n{2}{2}{0}{0}","Hare ","Krishna ","Rama ");}

相当直接,Console.Write隐式地格式化字符串,并且使用WriteWriteLine不是不仅节省了4个字节,而且避免了尾随换行符。使用Unix风格的换行符所以通过改变窗口可能无法正常工作这么好,适用于Windows额外的6个字节\n\r\n

如果您更喜欢返回字符串的方法,则此方法将直接输出到控制台:

C#,118个字节

string a(){return string.Format("{0}{1}{0}{1}\n{1}{1}{0}{0}\n{0}{2}{0}{2}\n{2}{2}{0}{0}","Hare ","Krishna ","Rama ");}

或者,如果您需要一个完全独立且可编译的程序:

C#,135个字节

class A{static void main(){System.Console.Write("{0}{1}{0}{1}\n{1}{1}{0}{0}\n{0}{2}{0}{2}\n{2}{2}{0}{0}","Hare ","Krishna ","Rama ");}}

如果您将其设置A为入口类,那么它应该可以作为已编译程序工作。


字词之间没有空格,看上去有点怪异。
manatwork

@manatwork好点,值得庆幸的是规范说尾随行是可以的,所以只花了3个字节
Skidsdev '17

可以引发一场火焰大战,但是您可以使用var而不是string来进一步减少第二个示例。
约翰·鲍曼

@JohnBaughman方法的返回值不能var据我所知,而且var.Format()绝对不是一件事
Skidsdev

h ...没想到。你是对的,我只是进入了兰巴世界,而误解了我所读的内容。
约翰·鲍曼

8

C,85个字节

i;f(){for(i=0;printf("$0$0900$$9$*$*9**$$)"[i++]-36+"Hare \0Rama \0Krishna \0\n"););}

我更喜欢世俗的口头禅,但我希望这是那些和平的宗教之一。

看到它在这里工作

这将天真的实现压缩了23个字节。


8

Python 2,92 88 74字节

for i in'0101311003020232200':print['Hare','Krishna','Rama','\n'][int(i)],

在线尝试!

,它不聪明,不,它不是最短的,但是,嘿,我是新来的,它可以工作。

另一个解决方案(84 80字节):

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

交换零和一,以及列表中的“野兔”和“克里希纳”。这将删除前导零。然后将新数字(1010300113121232211)转换为十六进制(0xe054e999f20c553),将其用反引号引起来,最后意识到xnor的答案仍然领先12个字节!tio.run/##K6gsycjPM/r/Py2/…–
vroomfondel

6

Perl,67个字节

受此JavaScript条目的启发。

$_='0101
1100
0202
2200
';s/./qw'Hare Krishna Rama'[$&].$"/ge;print

Perl,67个字节

@_=<Hare Krishna Rama>;print"@_[split//]\n"for<0101 1100 0202 2200>

2
(Hare,Krishna,Rama)在您的第一个代码中保存两个字节。
Dada's

5

Matlab 139136105字节(感谢@ 2501

fprintf('Hare Krishna Hare Krishna\nKrishna Krishna Hare Hare\nHare Rama Hare Rama\nRama Rama Hare Hare')

在Octave中在线尝试!


或126个字节(如果允许结尾的换行符)
user13267 '17

@ 2501:哈哈,太好了。实际上,我认为它可能是105个字节,您应该将其发布为答案
user13267 '17

5
我很确定可以进一步改善。
2501年

1
仅供参考,TIO支持倍频:) tio.run/nexus/...
β衰变

1
x={'Hare ','Krishna ','Rama ',10};[x{'ababdbbaadacacdccaa'-96}]是64个字节。:P(翻译@Stewie Griffin的八度提交)
2017年

5

MySQL,115100字节

(感谢@manatwork!)

SELECT CONCAT(a,b,a,b,d,b,b,a,a,d,a,c,a,c,d,c,c,a,a)FROM(SELECT'Hare 'a,'Krishna 'b,'Rama 'c,'\n'd)t

您可以删除所有AS
manatwork

好招,我一定会使用这种方法来应对一些挑战。
BradC

5

R,75 85 83字节

cat(x<-c("Hare ","Krishna ","\n")[c(1,2,1:3,2,2,1,1,3)],sub(x[2],"Rama ",x),sep="")

它使用HareKrishna和换行创建一个向量,并使用所需的换行,然后重复将其替换KrishnaRama

需要在每个单词上都包含空格,sep=""否则cat()会在每行的开头放置一个空格。


我无法在TIO中使用它
Giuseppe

可能需要print()或其他东西。
BLT

@Giuseppe我在这里使用R自动打印。但是取决于您如何称呼它,print()还是cat()需要它。那将需要更多的字节。我将在本周末向他们发布替代方案:)
Masclins

1
@AlbertMasclans不,我在说object 'h' not found tio.run/nexus/…时
Giuseppe

2
我认为你需要更换h=h<-调用内部p
朱塞佩

5

PowerShell,73 53 52字节

完全由Jeff Freeman删除 -使用实际的换行符而不是\n保存另一个字节,还以数组格式保存了一个字节。(从(1,2),1,2

-1感谢TesselatingHeckler,数组符号中没有逗号。

$a="Hare ";"Krishna ","Rama "|%{"$a$_$a$_
$_$_$a$a"}

我的旧答案-尝试了其他几种替换方法,但最终都以某种方式变长了。

$a,$b,$c="Hare ","Krishna ","Rama ";"$a$b$a$b
$b$b$a$a
$a$c$a$c
$c$c$a$a"

字符串中有换行符。

非常简单明了,它使用了一个事实,那就是powershell会在双引号内扩展变量,并使用一种分配变量以节省一些字节的较短方法。


一个好的解决方案,但是我要挑战您通过注意输出和流水线中的模式来进一步降低它。我已经将其减少到55个字节。我不知道如何破坏评论,因此,如果您希望看到它(或想要一些提示!),只需在这里回复即可。
杰夫·弗里曼

2
我想出了如何通过链接共享的方法,而不是破坏代码。 在线尝试!
杰夫·弗里曼

@JeffFreeman不错,在换行符和数组上又减少了两个-降至52,几乎击败了所有非高尔夫语言。
colsw

4

塞德,72岁

分数包括+1 -r

s/^/Hari Krishna/
s/.*/& &/
s/(\S+)(.*)\b(.+)/&\n\3\2\1/p
s/K\S+/Rama/g

在线尝试


可以肯定的是,有一种方法可以使用hange cappend或nsert i而不是substitute 删除一些字节。编辑:不再确定了;编辑编辑:是的,不行,因为它们在模式空间上不起作用,而是直接输出
Aaron

4

红宝石62 61字节

当我处理这个问题时,它最终变得几乎与@xnor的Python答案相同,只是Ruby在其print函数中的参数之间没有空格,这迫使我改用joins并导致更长的答案...

来自@manatwork的-1个字节

%w"Krishna Rama".map{|i|puts [h=:Hare,i]*2*' ',[i,i,h,h]*' '}

在线尝试!


:Hare一个符号。
manatwork

4

Bash,93个 90字节

h="Hare " k="Krishna " r="Rama " s="$h$k$h$k\n$k$k$h$h\n$h$r$h$r\n$r$r$h$h"
echo -e "${s}"

1
不错的第一次尝试。我可以建议一些小的改进吗?pastebin.com/0bYQF26n
manatwork '17

@manatwork,您应该将其添加为答案。
潘迪

1
如果没有该变量,s=则降至79h="Hare " k="Krishna " r="Rama ";echo -e "$h$k$h$k\n$k$k$h$h\n$h$r$h$r\n$r$r$h$h"
ULick


3

AHK107 92字节

这听起来很荒谬,但是我无法在AHK中找到更短的方法来做到这一点:

h=Hare
k=Krishna
Send %h% %k% %h% %k%`n%k% %k% %h% %h%`n%h% Rama %h% Rama`nRama Rama %h% %h%

这是我首先尝试的字节数为107的示例,并尝试了它。但是,正如Digital Trauma指出的那样,仅发送原始文本会更短。

n=1212422114131343311
a=Hare |Krishna |Rama |`n
StringSplit,s,a,|
Loop,Parse,n
r:=r s%A_LoopField%
Send %r%

StringSplit创建一个以1作为第一个索引的伪数组。因此,第一个术语用引用s1,第二个术语用s2等等,否则,这里没有任何花哨的地方。


13
整个输出只有92个字节。这样做会更好Send Hare Krishna ...吗?
Digital Trauma

@DigitalTrauma HA!是的,也许吧。我以为花哨更好,甚至没有检查。AHK对此不是好语言。
Engineer Toast

3

批处理,75字节

@for %%h in (Krishna Rama)do @echo Hare %%h Hare %%h&echo %%h %%h Hare Hare

3

C 96字节

*v[]={"Hare ","Krishna ","Rama ","\n"};
main(){for(long a=0x30ae2305d10;a/=4;printf(v[a&3]));}

您只需要两位信息就可以确定接下来需要从祈祷中选出哪个单词,因此,无需使用大量内存并将其编码为字符串,只需将其编码为40位整数即可(即,在长整数内部) )。


3

ksh / bash / sh,66个字节

h=Hare;for j in Krishna Rama;do echo $h $j $h $j"
"$j $j $h $h;done

@nimi谢谢。将其更改为<CR>,使其更短。我自己无法测试,但这应该可行。至少它可以在bash甚至(busybox)sh中使用。
ULick

似乎我在编辑中添加了一个空格,但由于从'\ n'更改为<CR>,所以确实减去了一个空格
ULick

3

APL(Dyalog),47字节

要求⎕IO←0在许多系统上是默认设置。

↑∊¨↓'Krishna ' 'Hare ' 'Rama '[(43)⊤8×4 1 5 2]

在线尝试!

8×4 1 5 2 乘; [32,8,40,16]

(4⍴3)⊤ 转换为4位数的基数3;矩阵[[1,0,1,0],[0,0,1,1],[1,2,1,2],[2,2,1,1]]

... [... ] 指数

 分成列表清单

∊¨ 征募(每人展平)

 混合成矩阵(用空格填充)



2

Java 7中,104个 103字节

String c(){return"xyxy\nyyxx\nxRama xRama\nRama Rama xx".replace("x","Hare ").replace("y","Krishna ");}

说明:

String c(){                                      // Method without parameters and String return-type
  return"xyxy\nyyxx\nxRama xRama\nRama Rama xx"  //  Return this String
    .replace("x","Hare ")                        //  after we've replaced all "x" with "Hare "
    .replace("y","Krishna ");                    //  and all "y" with "Krishna "
}                                                // End of method

在这里尝试。


2

分批,117个 111 103字节

@set a=Hare &set b=Krishna &set c=Rama 
@echo %a%%b%%a%%b%^

%b%%b%%a%%a%^

%a%%c%%a%%c%^

%c%%c%%a%%a%

现在允许尾随换行符降至103。

^\n\n用于在前三行的末尾插入换行符,并且在后面有一个空格Rama


2

Perl,76 74字节

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

1
短2个字节:在线尝试!(我很确定输出是正确的)
Dada
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.