Este é o Calvin . Apenas tentando obter 20 representantes para que esse usuário possa conversar na sala de chat do PPCG Minecraft Server .
Escreva um programa ou função que receba um número inteiro positivo.
Se o número inteiro for par (2, 4, 6, ...), imprima ou retorne esta sequência de arte ASCII exata:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
Se o número inteiro for ímpar (1, 3, 5, ...), imprima ou retorne esta sequência de arte ASCII exata:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
Você pode assumir que a entrada é sempre um número inteiro positivo.
Nos dois casos de saída, opcionalmente, pode haver qualquer número de espaços à direita até a borda direita do "T" em cada linha e / ou uma única nova linha à direita. Observe como existem duas colunas de espaços entre cada letra.
O código mais curto em bytes vence.
code-golf
ascii-art
kolmogorov-complexity
Retransmissão de bate-papo antigo
fonte
fonte
Respostas:
JavaScript (ES6),
343336289267265260 bytesApenas por diversão ... :) (Obrigado ao Xufox por cortar 46 bytes e me incentivar a cortar outros 37 por conta própria.)
Chamado como
a(4)
ou similar. Experimente aqui:Mostrar snippet de código
Eu condensado a espaços em branco em cadeias de dígitos a partir
2
de8
(por exemplo887
= 23 espaços). Cada dígito é então substituído pelo número correspondente de espaços.0
representa| |
e1
representa__
. Em suma, este programa é 170 bytes mais curto que as duas seqüências combinadas (203 + 227 = 430), então estou feliz. :)Edit: De alguma forma, é exatamente o mesmo comprimento que a única outra entrada neste momento .... o_o
Edit 2: Salvo algum espaço, alterando
n%2<1?
an%2?
e trocar as cordas. Também aproveitou o fato de que o início das duas seqüências é o mesmo para reduzir outros 5 bytes.Edição 3:
|2|
parecia mostrar muito, simplificando cada ocorrência parax
, economizando 7 bytes. As sugestões do Xufox cortam outros 40 bytes.Edit 4: A sugestão do Xufox de substituir
\n
por quebras de linha reais valeu a pena, removendo 6 bytes do total. Mudarx
para0
e__
para1
(inserir risada maligna aqui) e, em seguida, combinar todas as (inserir plural de Regex aqui), como ele fez em sua entrada, salvou 16 bytes extras.Edit 5: Desde que escolhi usar os padrões ES6, usei a interpolação de string de modelo personalizado para economizar 2 bytes finais.
fonte
.replace(/\d/g,d=>' '.repeat(d))
?\n
, economizando um byte por quebra de linha?Matlab,
343341O número de entrada é fornecido pelo stdin.
Exemplo de execução:
fonte
CJam,
158149145138 138 bytesO exemplo acima usa notação de intercalação, pois o código contém caracteres não imprimíveis.
Experimente online no intérprete CJam .
Se o link permanente não funcionar no seu navegador, você pode copiar o código desta pasta .
Exemplo de execução
Idéia
Em vez de codificar a string MINECRAFT (preenchida para obter um comprimento de linha constante) diretamente, codificaremos uma versão "zipada" dela, na qual as linhas e colunas foram transpostas.
Após fechar e remover os feeds de linha, essa sequência (vamos chamá-la de R ) deve ser codificada:
Existem muitas execuções de espaços, portanto, substituiremos cada ocorrência de um trigêmeo de espaço por um avanço de linha.
Isso nos deixa com sete caracteres diferentes (
\n -/\_|
), então atribuímos a cada um um número de 0 a 6 e consideramos os dígitos da matriz resultantes de um número base 7, que depois codificamos como uma sequência de bytes.A decodificação funciona revertendo as etapas acima.
A sequência espelhada pode ser construída a partir da sequência original.
Se invertermos a ordem das quatro linhas e trocarmos os soliduses, obteremos o seguinte:
De alguma forma semelhante, mas teremos que girar claramente as linhas para trazer a linha inferior para o topo:
Isso seria se não fosse por aqueles sublinhados traquinas.
Se lermos a string original de cima para baixo e ignorar os feeds de linha (obtendo R ) e substituir cada sublinhado seguido por espaço por um espaço seguido por um sublinhado antes de mudar as linhas, este é o resultado:
Muito melhor! Tudo o que resta a fazer é apagar o primeiro espaço da primeira linha (mudando todos os sublinhados na primeira linha esquerdo personagem), movendo-se os sublinhados extraviado em E e C uma linha para cima e descartando o sublinhado ao longo T .
Código
fonte
Pitão - 182 bytes
Usa a abordagem de codificação básica. Como a indexação é modular no Pyth, nem preciso fazer nada pelo ímpar, basta colocá-lo na ordem correta e usá-lo
@Q
. Como bônus, isso também funciona com números negativos.Eu tinha apenas tentativas de codificar a primeira, depois sacudindo e trocando as barras, mas a primeira e a última linha eram muito difíceis.
Eu poderia economizar 6 bytes colocando bytes nulos reais no código, mas isso é demais.
Experimente online aqui .
Parece muito ruim online, porque a caixa de saída é muito pequena e envolve. Eu recomendo brincar com o dev-console e mudar
col-md-5
para acol-md-7
.fonte
JavaScript (ES6),
312,285,281,272,270,263,262260Para edições anteriores, consulte o histórico de edições .
Edit 5: Na conversão, troquei o número associado a
-
(agora 0) e espaço em branco (agora 1). No bloco resultante, os números 1, 2 e 3 não eram mais usados. Isso me permitiu usar uma matriz com os números ausentes.Editar 6: Melhorou o literal da matriz. Eu tentei isso anteriormente, mas usei
777
e77
como strings em vez de números e notei apenas agora que eu tinha perdido isso.Edit 7: O "código Golfed" é uma função, conforme especificado pela pergunta e não há necessidade de
f=
atender a esta especificação. Assim, removendo-o, economizando dois bytes.Executável no Firefox 39:
Baseia-se no sistema de números base 6 e cada caractere ASCII representa um número:
Em seguida, combinei a representação numérica de cada sequência ASCII. Por exemplo: quando a primeira string ASCII contém a
/
em uma posição e a outra contém a\
na mesma posição , essa posição se torna32
, que é a base 6 (20
em decimal). Se você converter isso para a base 36 (para obter um número da base 36 para cada dois números da base 6), você obtémk
.Tudo isso foi feito de antemão e a função basicamente desfaz esse processo.
Agora, as duas respostas JavaScript têm uma outra resposta, com a mesma contagem de bytes…PS: Como uma observação para mim mesmo e uma referência para os outros, este é o código que eu usei:
fonte
~NaN == -1
?![…][x]+77
,77
não precisa ser uma string mais), mas o adicional de reverter no código golfed não valeu a pena…isNaN
por1+
e~~(i/6)
comi/6|0
.f=
o começo, mas eu tenho. Também li que é aceito removê-lo, portanto, eu mesmo o farei, e agora tenho 260 bytes. ;)CJam, 136 bytes
O exemplo acima usa notação de intercalação, pois o código contém caracteres não imprimíveis.
O avanço de linha é apenas para "legibilidade". Experimente online no intérprete CJam .
Se o link permanente não funcionar no seu navegador, você pode copiar o código desta pasta .
Exemplo de execução
Idéia
Essa abordagem tem algumas semelhanças com a da minha outra resposta , mas é muito mais simples e (um pouco decepcionante) um pouco mais curta.
Procuramos uma maneira de codificar a seguinte string:
Depois de preencher cada linha (para obter um comprimento de linha constante), fechar (transpor linhas e colunas) e remover os feeds de linha, essa sequência deve ser codificada:
Vamos substituir cada subsequência
" |||"
com um 0 , cada subsequência" "
com um 1 e os caracteres de"/-_\| "
com 2 para 7 , formando uma matriz de base de 8 dígitos, que podem ser codificados como uma sequência de bytes.A decodificação funciona revertendo as etapas acima.
Código
fonte
Raquete,
443434386 bytesApenas por diversão.
Nota: você pode precisar da
#lang racket
linha para executar no DrRacket.fonte
05AB1E ,
179177176 bytesExperimente online.
Explicação:
é o número compactado :
Experimente online.
7в
converte-o em Base-7 como lista, para obter a lista de dígitos:Experimente online.
è
indexa cada dígito na sequência"\n-/\_|"
eJ
junta a lista inteira, o que nos fornece o seguinte:Experimente online.
2ä
divide a corda em duas partes.Iè
pegue a entrada e a indexe (com quebra automática de linha) para obter uma das duas partes, que será produzida implicitamente.Muito obrigado ao compressor ASCII do @MagicOctopusUrn , que foi usado para gerar o número compactado e o transliteral Base-7. Experimente online. (Após o qual o transliterado foi jogado no golfe, invertendo a sequência e o número na pilha, use em
в
vez deB
fazer uma lista de dígitos e indexe a sequência comè
.fonte
C, 251 bytes
Esta é uma função
k
que recebe um parâmetro e imprime a mensagem emstdout
.Uma versão mais legível:
Primeiro, ele prepara uma mensagem vazia (cheia de espaços). Para cada personagem (por exemplo,
|
ou-
), há uma lista de posições para colocar esse personagem.Para cada posição, se a versão invertida deve ser impressa, a posição é invertida. Ou seja, sua coordenada vertical
y
é substituída por4-y
ou3-y
(dependendo se o caractere é um sublinhado). Além disso, as direções das barras são invertidas - isso é realizadoXOR
com a115
.Essa estrutura de controle também é usada para colocar os caracteres de nova linha - parece mais eficiente adicionar mais 4 coordenadas à lista do que gravar um loop explícito.
Existem algumas pequenas falhas neste sistema. Primeiro de tudo, a letra final T parece um pouco diferente na versão invertida:
Para produzir corretamente, o código deve colocar os
|
caracteres após os_
caracteres.Além disso, para garantir que a sequência de controle contenha apenas caracteres ASCII, eu a codifiquei:
37
adicionados a eles, para alterá-los para o intervalo ASCII 32 ... 127. Eu poderia adicionar um número menor, mas37
evita caracteres como"
e\
, que precisam ser escapados dentro de literais de string.-
caractere aparece na posição 137. Para explicar isso, adicionei um-
caractere artificial em outra posição (79), que depois será sobrescrita - o caractere|
também aparece na posição 79.Outra coisa engraçada é que eu não poderia usar
puts
a saída da string - isso produziria uma nova linha extra à direita. Então eu useiprintf
.Além disso, o número
57
aparece 4 vezes no código golfed - a expressão aparentemente longa(w%2?4-i/6-p/57:p/57)*57+p%57
torna possível eliminar a variávely
, tornando o código mais curto.fonte
Perl,
292259246 bytesEle tira proveito do fato de que as duas seqüências de caracteres são muito semelhantes (por exemplo, o IE e C inteiro) e transforma a sequência de caracteres que são exibidos de maneira diferente, dependendo de qual versão está sendo exibida. por exemplo, m significa "uma barra para a corda do caminho certo, uma barra para trás na da cabeça para baixo". Ele substitui a transliteração para exibir o caractere correto. Os espaços também são codificados no comprimento da execução usando substituições de cadeia.
multi-linha:
Idéia:
Como existem apenas 22 colunas exclusivas na saída, deve ser possível armazená-lo como 22 * 4 = 88 caracteres com um intervalo de 0 a 17 (todos os possíveis caracteres de "significado duplo"), juntamente com uma pesquisa de 56 caracteres tabela com uma entrada no intervalo de 0 a 21 por coluna. Em teoria, isso pode ser codificado com <100 bytes, no entanto, é difícil fazer disso uma vitória líquida por causa do código mais complicado para decodificá-lo.
fonte
CJAM, 206
As duas imagens ascii são codificadas em base 216, um byte = 3 caracteres.
Teste aqui
fonte
PowerShell,
275253248 bytesScript de teste:
Resultado:
Ideias principais
O método de compressão é o método estendido do CJam por Dennis ♦:
O script para compactação:
A cadeia de compactação anterior é:
fonte
SAS, 442 bytes
Não-golfe:
Testes:
É possível economizar um pouco de código colocando-os em blocos de entrada, mas isso adiciona a restrição de que a macro pode ser apenas uma vez por etapa de dados, o que eu viola o espírito de escrevê-la como uma macro. (E eu suspeito que adicionar um prompt para obter entrada na etapa de dados adicione mais caracteres).
fonte
bash, 247 bytes
Strings são concatenadas e compactadas com gzip.
fonte
PHP, 225 bytes
Solução feia de força bruta.
Compactei e, em seguida, base64 codificou as seqüências concatenadas a serem exibidas. O código decodifica, descompacta e divide em pedaços de 224 caracteres. A primeira sequência é de 224 caracteres sem uma nova linha à direita, a segunda é de 201 caracteres (também nenhuma nova após). A paridade do argumento da linha de comando (
$argv[1]%2
) é usada como índice na matriz gerada porstr_split()
.fonte
Haskell, 138 bytes
Isso é meio que um hack. Estou forçando brutalmente o hash SHA256 da concatinação dos dois textos do minecraft e depois os separando e escolhendo o texto apropriado com base no parâmetro x. Isso é muito impraticável e não pode ser calculado em tempo real, e pode até haver colisões ao longo do caminho, pelo que sei.
Como Haskell não pode ter a representação ASCII desse hash em uma string, estou lendo-a de um arquivo chamado "a" e, portanto, adicionei 32 bytes à minha pontuação.
Explicação:
Cria uma lista de todas as combinações das letras "/ \ | _-" em 425 letras (o comprimento dos dois textos do minecraft combinados)
Escolha o primeiro que corresponde ao hash
O primeiro texto tem 225 letras, o outro tem exatamente 200.
fonte
Javascript (ES6),
403296 bytes(Removido da minha resposta anterior ) Tentando um novo método:
Observe que há alguns caracteres não imprimíveis; estes foram substituídos por ex
\x83
.A codificação em si é cerca de 40 bytes mais curta que a outra, mas o processo de decodificação é mais elaborado. Eu usei o sistema base-216 que outros usaram para codificar o texto. Para referência, aqui está o código que eu usei:
Isso basicamente pega o texto ASCII (pré-convertido para a base 6) e triplica-o, alterando-o para a base 216. 53 é então adicionado para remover a maioria dos caracteres não imprimíveis.
Sugestões são bem-vindas!
Aqui está o código original de 403 bytes:
Usando um
for
loop, umwhile
loop, quatro variáveis que foram usadas apenas uma vez e uma tonelada de algoritmos longos para coisas simples. Rapaz, eu melhorei ...fonte
y=[' ','/','|','\\','_','-'],
e em vez dey[x]
gravar' /|\\_-'[x]
. =)Python, 312 bytes
A função imprime a saída dada uma int
fonte
C, 321 bytes
Codificou a repetição e o índice de caracteres em uma sequência.
fonte
Python 3, 486
533612fonte
PHP , 263 bytes
Experimente online!
fonte
Ruby, 290 bytes
Provavelmente uma entrada fraca e improvável. Basicamente, uma compactação muito simples (artesanal), onde letras minúsculas significam que muitos espaços (na verdade, ord (ch) - espaços 'A') e letras maiúsculas são apenas alguns termos comuns que salvaram alguns bytes.
fonte
SOGL V0.12 ,
7271 bytesExperimente aqui!
O espelhamento vertical de SOGLs funcionou perfeitamente para isso.
fonte
Tela , 70 bytes
Experimente aqui!
fonte