Hare Krishna Hare Krishna Krishna Krishna Hare Hare

65

Recentemente, eu vi pessoas Hare Krishna com seu mantra no emblema e descobri que pode ser bastante interessante codificar golfe.

O desafio

Escreva o mantra Hare Krishna , ou seja:

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

Critérios de vitória

Isso é , então o código mais curto em bytes vence!

Regras

  • O invólucro deve ser preservado.
  • O texto deve conter novas linhas.
  • As linhas podem ter espaços à direita.
  • Nova linha à direita é permitida.
  • Análise da Web ou de qualquer outro recurso externo não permitido.
Dariusz Woźniak
fonte
2
Do título, eu esperava que algo decodificasse cadeias binárias em caracteres ASCII. O título representa uma barra invertida.
User253751
5
Todo o mantra tem 97 bytes. Surpreendentemente, existem respostas com mais do que muitos bytes.
Masclins
Hmm, por que parece surpreendentemente um idiota de Rickroll?
Matthew Roh

Respostas:

58

Gelatina , 22 bytes

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

Experimente online!

Como funciona

“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.
Dennis
fonte
43
Convert 15973600 to base ["Hare", "Rama", "Krishna"]Graças a Deus você explicou isso ainda mais, porque isso não fazia sentido.
precisa saber é o seguinte
11
Eu preciso usar ["Hare", "Rama", "Krishna"] mais a base .
ATaco 11/05
63

05AB1E , 38 bytes

Pode ser reduzido em 2 bytes se as novas linhas à direita estiverem corretas.

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

Experimente online!

Explicação

“«Î‡Ä¦í¥Â“                              # 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
Emigna
fonte
58
drama share irish dna, realmente? De onde veio essa ideia? 1)
Stewie Griffin
14
Diga-me francamente, você construiu um gerador de código 05AB1E para golfe?
YSC
11
@YSC não é uma má ideia para a compactação de dicionário. Eu estou trabalhando nisso.
Magic Octopus Urn
11
32 bytes
Kevin Cruijssen 29/01
39

Oitava, 74 59 bytes

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

Verifique a saída aqui .

Explicação:

{'Hare ','Krishna ','Rama ',10}cria uma matriz de células com três cadeias, onde a quarta é 10(valor ASCII para nova linha).

{'ababdbbaadacacdccaa'-96}é um vetor que indexa a matriz de células acima. O vetor é [1 2 1 2 4 ...]porque subtraímos 96da string ababd....

Os colchetes circundantes são usados ​​para concatenar os resultados, em vez de obter ans = Hare; and = Krishna; ans = ...

Stewie Griffin
fonte
Eu não sabia que você pode indexar células como essa no Octave (ao contrário do MATLAB)!
Memming
19

Retina , 39 bytes


hkhk¶kkhh
h
Hare 
*`k
Krishna 
k
Rama 

Experimente online!

Na maioria das vezes substituições simples, o único "truque" é o modificador *que imprime o resultado da substituição e depois reverte a string de volta ao que era antes.

Leo
fonte
16

PHP, 61 bytes

<?=strtr("0101
1100
0202
2200",["Hare ","Krishna ","Rama "]);

basta substituir os dígitos como chave na matriz pelos valores strtr

Experimente online!

Jörg Hülsermann
fonte
12

JavaScript, 75 70 bytes

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

Experimente online!

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

powelles
fonte
2
Melhor usar caracteres literais de nova linha na sequência do modelo diretamente em vez do dígito 3. A sequência do modelo terá o mesmo comprimento, mas você não precisará substituí-las posteriormente. (Não vai causar problema índice da matriz, porque /./não corresponde caracteres de nova linha.)
manatwork
12

C

154 bytes, 124 bytes, 96 bytes

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

Experimente online!

28 bytes salvos, graças a Dennis

hucancode
fonte
11
Bem-vindo à programação de quebra-cabeças e código de golfe.
precisa saber é o seguinte
11
É um acrônimo bastante padrão para programação de quebra-cabeças e código de golfe, o nome dessa troca de pilhas. Desculpe, eu deveria ter deixado isso claro. Bem-vindo ao nosso site, bom primeiro post.
Rohan Jhunjhunwala
11
Isso não funcionará com todos os compiladores, mas o gcc não requer a instrução include. Além disso, se você restringir seu envio a C, poderá soltar inte declarar iglobalmente para que o padrão seja zero. tio.run/nexus/…
Dennis
2
@ Ant Isso está correto, mas as competições de golfe com código não exigem código "adequado". Aqui no PPCG, definimos idiomas por sua implementação. Desde que haja um compilador que produza um executável funcional, a resposta é válida.
Dennis
11
main(){for(char*t="BG@ESCB;:N8F6DIBA10Hare \0Krishna \0Rama \0\n";*t^72;printf(t+*t++-48));}Salva 4 bytes.
Johan du Toit
11

V , 40 , 36 bytes

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

Experimente online!

Hexdump:

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

Explicação:

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

O <C-n>comando é extremamente útil para desafios como este. :)

DJMcMayhem
fonte
10

C #, 109 bytes

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 ");}

Bastante simples, Console.Writeformata implicitamente a sequência e, ao Writeinvés de WriteLinesalvar não apenas 4 bytes, evita uma nova linha à direita. Usa novas linhas no estilo Unix, portanto, pode não funcionar tão bem no Windows, 6 bytes extras para o Windows mudando \npara\r\n

Este método produzirá diretamente no console, se você preferir um método que retorne uma string:

C #, 118 bytes

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 ");}

Como alternativa, se você precisar de um programa totalmente independente e compilável:

C #, 135 bytes

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 ");}}

Isso deve funcionar como um programa compilado, desde que você defina Acomo a classe de entrada.

Skidsdev
fonte
Parece um pouco estranho, sem espaços entre as palavras.
manatwork
@manatwork bom ponto, felizmente especificação diz espaços à direita são ok, então custam apenas 3 bytes
Skidsdev
Pode iniciar uma guerra de chamas, mas você pode usar var em vez de string para reduzir ainda mais o segundo exemplo.
precisa
@JohnBaughman valor de retorno de um método não pode ser var, tanto quanto eu sei, e var.Format()não é definitivamente uma coisa
Skidsdev
Duh ... Não pensei nisso. Você está correto, eu entrei no mundo do lamba e interpretei mal o que estava lendo.
precisa
8

C, 85 bytes

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

Eu preferiria um mantra secular, mas espero que essa seja uma dessas religiões pacíficas.

Veja como funciona aqui .

Isso compacta uma implementação ingênua por 23 bytes.

2501
fonte
8

Python 2, 92 88 74 bytes

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

Experimente online!

Não , não é inteligente, não, não é o mais curto, mas, ei, sou novo nisso e funciona.

Outra solução ( 84 80 bytes):

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
totalmente humano
fonte
Troque os zeros e uns, junto com 'Hare' e 'Krishna' na lista. Isso remove o zero inicial. Em seguida, converta o novo número (1010300113121232211) em hexadecimal (0xe054e999f20c553), envolva-o com reticências e, finalmente, perceba que a resposta do xnor ainda está à frente em 12 bytes! ###K6gsycjPM
vroomfondel
6

Perl, 67 bytes

Inspirado por esta entrada JavaScript .

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

Perl, 67 bytes

@_=<Hare Krishna Rama>;print"@_[split//]\n"for<0101 1100 0202 2200>
Sinan Ünür
fonte
2
(Hare,Krishna,Rama)salva dois bytes no seu primeiro código.
Dada
5

Matlab 139 136 105 bytes (graças a @ 2501 )

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

Experimente Online no Octave!

user13267
fonte
ou 126 bytes se a nova linha à direita for permitida
user13267 28/04
@ 2501: haha, isso é ótimo. Na verdade eu acho que é 105 bytes pode ser que você deve publicá-la como uma resposta
user13267
5
Tenho certeza que mais melhorias são possíveis.
2501
11
Para sua informação, o TIO suporta o Octave :) tio.run/nexus/…
Beta Decay
11
x={'Hare ','Krishna ','Rama ',10};[x{'ababdbbaadacacdccaa'-96}]é de 64 bytes. : P (traduzindo envio de oitava do @Stewie Griffin)
Memming
5

MySQL, 115 100 bytes

(Obrigado @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
jlmt
fonte
Você pode remover tudo AS .
manatwork
Bom truque, definitivamente vou usar esse método para alguns desafios.
BradC
5

R, 75 85 83 bytes

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

Ele cria um vetor com Hare, Krishnae a nova linha, pega os necessários e depois o repete substituindo Krishnapor Rama.

Precisava incluir o espaço em cada palavra e sep=""porque, caso contrário cat(), colocaria um espaço no início de cada linha.

Masclins
fonte
Não consigo fazer isso funcionar no TIO
Giuseppe
Provavelmente precisa de uma impressão () ou algo assim.
BLT
@ Giuseppe Estou usando aqui que R imprime automaticamente. Mas, dependendo de como você chama, print()ou cat()seria necessário. Isso exigiria muito mais bytes. Vou postar uma alternativa com eles neste fim de semana :)
Masclins
11
@AlbertMasclans não, eu estou recebendo um erro dizendo object 'h' not found tio.run/nexus/…
Giuseppe
2
Acho que você precisa para substituir o h=com h<-dentro das chamadas parap
Giuseppe
5

PowerShell, 73 53 52 bytes

absolutamente demolido por Jeff Freeman - usando uma nova linha real em vez de \nsalvar outro byte e também salvou mais um no formato de matriz. (de (1,2)até ,1,2)

-1 graças a TesselatingHeckler, sem vírgula na notação de matriz.

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

Minha antiga resposta - Tentei alguns outros métodos de substituição, mas todos acabaram sendo um pouco mais longos de alguma forma.

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

existem novas linhas na string.

bastante simples, usa o fato de que o powershell expandirá variáveis ​​em aspas duplas e um método mais curto de atribuir variáveis ​​para economizar alguns bytes.

colsw
fonte
Boa solução, mas eu desafio você a reduzi-lo mais observando um padrão na saída e no pipelining. Eu tenho 55 bytes. Não sei como estragar um comentário, então responda aqui se você quiser vê-lo (ou se quiser algumas dicas!).
21817 Jeff Freeman
2
Em vez de uma tag de spoiler, descobri como compartilhar por meio de um link. Experimente online!
22817 Jeff Freeman
O @JeffFreeman, bom, eliminou mais dois na nova linha e no array - até 52, superando quase todos os idiomas que não são de golfe.
Colsw
4

Sed, 72

A pontuação inclui +1 para a -rbandeira.

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

Experimente online .

Trauma Digital
fonte
Certamente existe uma maneira de remover alguns bytes usando hange c, append ou insert em vez de ubstitute s. Edit: não tenho mais certeza; Editar: sim não que não funciona porque eles não funcionam no espaço de padrões, mas em vez diretamente de saída
Aaron
4

Ruby , 62 61 bytes

Enquanto eu trabalhava nisso, ele acabou se tornando quase idêntico à resposta Python do @ xnor, exceto que Ruby não tem espaços entre argumentos em sua printfunção, forçando-me a usar junções e resultando em uma resposta mais longa ...

-1 bytes de @manatwork

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

Experimente online!

Value Ink
fonte
Faça :Hareum símbolo.
manatwork
4

Bash, 93 90 bytes

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}"
Katharine Osborne
fonte
11
Boa primeira tentativa. Posso sugerir algumas pequenas melhorias? pastebin.com/0bYQF26n
manatwork
@ manatwork, você deve adicioná-lo como sua resposta.
21417
11
Sem a variável, s=ela cai para 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

Pitão - 45 41 bytes

Ms(GHGHbHHGG)K"Hare "gK"Krishna "gK"Rama 

Tente

Maria
fonte
3

AHK , 107 92 bytes

Isso parece ridículo, mas não consigo encontrar um meio mais curto no AHK para fazer isso:

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

Aqui está o que eu tentei primeiro com 107 bytes e tentei ser chique. Como o Digital Trauma apontou , porém, teria sido mais curto enviar apenas o texto bruto.

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

StringSplit cria um pseudo-array com 1 como o primeiro índice. Portanto, o primeiro termo é referenciado com s1, o segundo com s2, etc. Caso contrário, não há nada sofisticado aqui.

Engenheiro Toast
fonte
13
A saída inteira é de apenas 92 bytes. Seria melhor simplesmente Send Hare Krishna ...?
Digital Trauma
@DigitalTrauma HA! Sim, provavelmente então. Eu presumi que a fantasia era melhor e nem checava. AHK não é uma boa linguagem para isso.
Engineer Toast
3

Lote, 75 bytes

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

C 96 bytes

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

Você só precisa de dois bits de informação para descobrir qual palavra da oração é necessária a seguir. Portanto, em vez de usar um monte de memória e codificá-la como uma string, basta codificá-la como um número inteiro de 40 bits (ou seja, dentro de um int longo )

Imran Khan
fonte
3

ksh / bash / sh, 66 bytes

h=Hare;for j in Krishna Rama;do echo $h $j $h $j"
"$j $j $h $h;done
ULick
fonte
@nimi Obrigado. Alterou para um <CR>, diminuindo ainda mais. Não posso testá-lo, mas isso deve funcionar. Pelo menos ele funciona no bash e mesmo (busybox) sh.
precisa saber é o seguinte
Parece que eu adicionei um espaço em branco na edição, mas fez subtrair um, devido à mudança de '\ n' para <CR>
Ulick
3

APL (Dyalog) , 47 bytes

Requer ⎕IO←0qual é o padrão em muitos sistemas.

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

Experimente online!

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

(4⍴3)⊤ converter para base de 4 dígitos 3; matriz [[1,0,1,0], [0,0,1,1], [1,2,1,2], [2,2,1,1]]

... [... ] índice

 dividido em lista de listas

∊¨ alistar-se (achatar cada)

 misture em matriz (preenchimento com espaços)

Adão
fonte
2

Java 7, 104 103 bytes

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

Explicação:

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

Experimente aqui.

Kevin Cruijssen
fonte
2

Lote, 117 111 103 bytes

@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%

Até 103 agora que novas linhas à direita são permitidas.

^\n\né usado para inserir uma nova linha no final das três primeiras linhas e há um espaço depois Rama.

SomethingDark
fonte
2

Perl, 76 74 bytes

$_=121202211;$_.=0 .y/2/3/r;print$_?(0,Hare,Krishna,Rama)[$_].$":$/for/./g
efémero
fonte
11
2 bytes mais curto: Experimente online! (Eu tenho certeza que a saída é a correta) #
Dada