Obrigado a @KritixiLithos por me ajudar com esse desafio!
V é uma linguagem de programação que eu escrevi para poder usar e estender o vim para desafios de código-golfe. O primeiro commit foi em 3 de março de 2016, o que significa que hoje V faz um ano! Woo-hoo
Durante o primeiro ano de existência de V, houve 176 confirmações de quatro colaboradores diferentes, 140 respostas de 12 usuários diferentes e muitos operadores duplicados quebrados para contar . Ele tem um intérprete on - line , generosamente hospedado pelo @Dennis, que foi executado quase 8.000 vezes desde dezembro .
Vamos ter um desafio para comemorar o aniversário de V! Como a maioria dos recursos do V é projetada com a manipulação de strings e a arte ascii em mente, parece natural que qualquer desafio que celebre o V seja sobre arte ascii. Portanto, seu desafio para hoje é pegar uma palavra como entrada e remodelá-la na forma de um V. Por exemplo, a entrada "Hello" deve fornecer o seguinte V:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Aqui estão alguns detalhes sobre a aparência do seu V. Se a sequência de entrada tiver n caracteres, o V deverá ter n*2
linhas altas. A primeira linha deve consistir em:
<input string><(n*2) - 1 spaces><input string reversed>
Em cada nova linha, um espaço é adicionado ao início e os dois lados da string se movem um em direção ao outro, removendo os caracteres sobrepostos. Até a última linha, que é apenas o primeiro caractere de entrada. O espaço em branco à direita em cada linha é aceitável e uma nova linha à direita também é permitida.
Você pode assumir que a entrada sempre será imprimível em ASCII sem nenhum espaço em branco e pode receber entradas e saídas de qualquer método razoável. Aqui estão mais algumas entradas de amostra:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Obviamente, como se trata de código-golfe , as brechas padrão são proibidas e seu objetivo é escrever o programa mais curto possível para concluir esta tarefa. Feliz golfe!
Quanto vale a pena, eu tenho uma queda por respostas do vim, portanto, pontos de bônus imaginários por usar o vim ou V, embora qualquer idioma seja aceitável. :)
Respostas:
MATL ,
2114 bytesMATL deseja a V um feliz aniversário!
Experimente online!
Explicação
Considere a entrada
de comprimento
n=5
. O código calcula a convolução 2D dessa sequência com a matriz de identidade de tamanho2*n
,O resultado da convolução, convertido em char e com char 0 mostrado como espaço, é
Em seguida, as colunas
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
são selecionadas nessa matriz de caracteres, produzindo o resultado desejado:Código comentado
fonte
V ,
24, 23, 20 bytesExperimente online!
Muito mais curto agora que V tem um operador 'reverso' .
Não é tão impressionante em comparação com as outras línguas de golfe que responderam, mas tinha que ser feito. Hexdump:
Explicação:
Nesse ponto, o buffer fica assim:
Não, vamos recursivamente construir o triângulo.
Aqui é onde eu mostro um dos meus recursos favoritos do V. Muitos comandos requerem um argumento. Por exemplo, o
>
comando recuará um número variável de linhas, dependendo do argumento:mas a maioria dos comandos será forçada a terminar com um argumento padrão (geralmente a linha atual) se estiver no final do programa e não especificado. Por exemplo, o que V realmente executa para nosso loop recursivo é:
O segundo
ò
é preenchido implicitamente. O interessante é que os comandos encerrados implicitamente aplicam várias camadas de profundidade, portanto, embora tenhamos escrito apenas>
, V implicitamente implicará_
em seu argumento e recuará a linha atual.fonte
Brainfuck , 152 bytes
Essa é uma ocasião tão importante que decidi quebrar o velho intérprete de BF e dar uma olhada nisso.
Com Comentários
Experimente online!
fonte
> <> , 221 bytes
Passei maneira muito tempo com isso. Feliz aniversário, V!
Você pode experimentá-lo on-line , mas é muito mais divertido obter esse intérprete e executá-lo usando a
--play
bandeirao que resulta na animação abaixo.
Exemplo
(demora um pouco menos de dois minutos)
Explicação
Como a parte interessante desta resposta é envolvê-la na
V
forma, aqui está uma explicação que está em conformidade com ela. Usamos a seguinte versão numerada de linha para referência.Às vezes, as setas (→ ↓ ←) são usadas para indicar a direção na qual um snippet é alcançado.
Inicialização
A primeira linha pressionará 2n para [0,1], deixará n na pilha e acrescentará um espaço. Em seguida, subimos e contornamos a segunda linha à direita, onde começaremos a ir para a esquerda. Existe um loop para anexar n + 1 espaços. Isso funciona da seguinte maneira.
Depois de concluído, ele salta para a linha 3. Lá, os dois principais elementos da pilha (0 e um espaço) são removidos (
~~
) e pulamos para oX
local [10,1] (a1.
), continuando para a direita. Nós batemos na/
, envolvemos a linha 7 e iniciamos o loop principal do programa.Laço principal ( 2n vezes)
Essa é a condição do loop. Inicialmente, a pilha é revertida para impressão. Em seguida, obtemos o contador de [1,0] (
01g
) e armazenamos uma versão diminuída (:1-01p
). Ao contornar e esbarrar à direita, encontramos o condicional para encerrar o programa. Se não terminarmos, saltaremos para o primeiro ciclo de impressão.Primeiro loop de impressão (metade esquerda)
Começamos com o comprimento no topo da pilha e executamos o código a seguir, desde que o elemento superior não seja 0.
Isso imprimirá a pilha sem descartá-la. Se o loop terminar, pularemos para a direita na linha 5, preparando o próximo loop de impressão.
Preparação da metade direita
Essa foi uma das partes mais difíceis de ajustar. Abaixo está uma versão sem todas as direções para indicar o que acontece.
Em seguida, aumentamos o comprimento do que deve ser impresso e iniciamos o segundo loop de impressão (com uma duplicata inicial que não faz parte do loop).
Segundo loop de impressão (metade direita)
O código que está sendo executado é completamente o mesmo do primeiro loop de impressão, com o código sendo
o}
colocado um pouco mais porque havia locais disponíveis. Ao terminar, ainda temos algumas coisas a fazer antes de podermos verificar o loop principal invariável novamente. Depois que a~
linha 9 é executada, contornamos verticalmente, terminando no seguinte trecho de código.Primeiro
ao
imprimirá uma nova linha. Depois, saltamos e chegamos exatamente ao mesmo local após a inicialização, ou seja, pulando para oX
.fonte
Flak cerebral , 486 + 1 = 489 bytes
Feliz aniversário V da Brain-Flak!
Também obrigado a 0 ', que forneceu parte do código usado nesta resposta
+1 devido ao
-c
sinalizador necessário para entrada e saída de ASCIIExperimente online!
Esta é sem dúvida a coisa mais difícil que já fiz no Brain-Flak.
Brain-Flak é notoriamente terrível ao duplicar e reverter seqüências de caracteres e esse desafio consiste em nada além de duplicar e reverter seqüências de caracteres.
Consegui obter esse trecho quase funcionando em menos de uma hora de trabalho duro, mas adicionar os últimos espaços acabou sendo uma das coisas mais difíceis que já fiz no Brain-Flak.
Explicação
A idéia básica é que primeiro criaremos a parte superior do V e cada iteração removerá dois caracteres do meio e incluirá um espaço no início.
Na prática, isso se torna bastante difícil.
Existem algoritmos existentes para copiar e reverter, então usei um deles para criar uma cópia invertida do código no offstack. Depois de fazer isso, coloco
2n-1
espaços no topo da pilha original e movo a pilha de volta para a pilha para criar um sanduíche.Agora nós temos nossa linha superior. Agora queremos remover dois caracteres desde o início e adicionar um espaço à frente. Isso acaba sendo a parte mais difícil. A razão para isso é que precisamos essencialmente armazenar dois valores, um para a profundidade do snippet atual e outro para a profundidade no centro do V onde a exclusão deve ocorrer.
Isto é difícil.
Por causa de toda a duplicação e reversão que estão ocorrendo nas duas pilhas, estão em uso total o tempo todo. Realmente não há nenhum lugar nessas pilhas para colocar qualquer coisa. Mesmo com toda a Third Stack Magic no mundo, você não pode obter o tipo de acesso necessário para resolver esse problema.
então como nós consertamos isso? Em suma, nós realmente não; por ignorarmos os espaços por enquanto e corrigi-los posteriormente, adicionaremos zeros ao código para marcar para onde os espaços devem ir, mas fora isso, não faremos realmente nada.
Portanto, em cada iteração, fazemos uma cópia da última iteração e a colocamos no empilhamento. Usamos a profundidade que armazenamos para dividir isso ao meio, para que tenhamos a metade esquerda do V na pilha direita e a metade direita do V na pilha esquerda. Removemos dois elementos e juntamos os dois novamente. Adicionamos uma nova linha para uma boa medida e iniciamos a próxima iteração. Cada vez que a profundidade do centro do V diminui em um e quando atinge zero, paramos o loop.
Agora temos a maior parte do V construído. No entanto, estamos com falta de espaços adequados e nosso V atualmente está um pouco (leia-se: completamente) de cabeça para baixo.
Então nós jogamos. Para colocá-lo na outra pilha, temos que mover cada elemento um por um. Enquanto movemos elementos, verificamos zeros. Se encontrarmos um, teremos que colocar os espaços de volta onde eles pertencem. Jogamos o zero e adicionamos vários espaços. Como sabemos quantos? Nós acompanhamos; inverter uma pilha ao contrário de duplicar ou inverter uma é uma tarefa muito intensiva; portanto, temos memória para armazenar e acessar um contador adicional para controlar quantos espaços adicionar. Cada vez que adicionamos alguns espaços, diminuímos o contador em um. O contador deve atingir zero na última nova linha (a parte superior do V) e, portanto, estamos prontos para imprimir.
Por fim, limpamos algumas coisas e encerramos o programa para saída implícita.
fonte
-r
sinalizador?-r
flag, precisaria realmente revertê-la outra vez. Está ficando tarde onde estou, mas acho que vou tentar tentar resolver isso substancialmente amanhã. Se eu puder resolver o problema de espaços, definitivamente utilizarei a-r
bandeira.Geléia ,
1512 bytesExperimente online!
Como funciona
fonte
Python 3 , 65 bytes
Experimente online!
Python 2 , 65 bytes
Experimente online!
fonte
JavaScript (ES6),
1081069894 bytesfonte
n*2
porn*4
(incluindo as novas linhas no fim de cada linha). Depois, calculo o caractere que deve aparecer em cada célula.f=
es=>
.f=
é apenas parte do snippet, não a resposta. Como tal, não está incluído na contagem de bytes.Retina ,
5147 bytesFeliz aniversário de uma linguagem de processamento de strings!
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
Isso acrescenta
n
espaços (onden
está o comprimento da string), correspondendo ao final da string, recuperando o comprimento da string$.`
e repetindo um espaço que muitas vezes$*
.Duplicamos a string inteira (separada por um avanço de linha), combinando o final da string novamente e inserindo a própria string
$`
.Isso inverte a segunda linha, correspondendo da direita para a esquerda (
r
) e, em seguida, correspondendo a um caractere de cada vez (.
), mas assegurando que todos estejam adjacentes (\G
). Dessa forma, as correspondências não podem passar do avanço de linha. Isso é usado em um estágio de classificação. Usando o modo classificar por ($
), mas substituindo cada correspondência por uma sequência vazia, nenhuma classificação real é feita. Porém, devido à^
opção, as correspondências são revertidas no final, revertendo toda a segunda linha.Esse estágio é para saída e também afeta o restante do programa.
{
agrupa os estágios restantes em um loop que é repetido até que esses estágios falhem na alteração da string (o que acontecerá porque o último estágio não corresponderá mais). A;
saída desativa no final do programa. o*
voltas nesta fase em um prazo seca, o que significa que o estágio é processado e o resultado é impresso, mas depois a cadeia anterior é restaurado.O palco em si simplesmente remove um avanço de linha e o caractere anterior. O que nos dá uma linha da saída desejada (começando com a primeira linha).
Finalmente, esse estágio transforma cada linha na próxima. Isso é feito inserindo um espaço na frente do primeiro caractere não espacial, removendo o último caractere na primeira linha e o primeiro caractere na segunda linha. Esse processo é interrompido quando houver apenas um caractere não-espaço deixado na primeira linha, que corresponde à última linha da saída.
fonte
s///
caracteres extras que se somam, à reversão de string mais longa e a outras operações que não possuem os detalhes da Retina. Boa leitura. 105AB1E , 12 bytes
Experimente online!
Explicação
Ou para a mesma contagem de bytes da outra direção.
Explicação
fonte
Japt,
22201614 + 2 bytesJapt deseja muitos mais anos de sucesso no golfe!
Requer a
-R
bandeira. Teste online!Explicação
Isso faz uso das funções
ç
eî
adicionei alguns dias atrás:A técnica de Dennis é um byte mais longo:
fonte
GNU sed ,
110100 + 1 (sinalizador r) = 101 bytesEdit: 9 bytes mais curto graças a Riley
Como outra linguagem de manipulação de strings, o sed deseja V o melhor!
Experimente online!
Explicação: supondo que a entrada seja o último caso de teste ('V!'). Mostrarei o espaço do padrão em cada etapa para maior clareza, substituindo espaços por 'S'.
fonte
Python, 110 bytes
Experimente online!
Tenho certeza de que isso não é o ideal, mas pelo menos é bastante pitônico:
fonte
Jolf, 31 bytes
Jolf relutantemente deseja a V um feliz aniversário!
Experimente aqui!
␅
deve ser 0x05.Explicação
fonte
Carvão , 29 bytes
Feliz aniversário V, da sua linguagem de arte ASCII decepcionantemente longa para este desafio!
Experimente online!
Explicação
Nossa estratégia: imprima a metade esquerda do V, começando de baixo e movendo-se para o canto superior esquerdo; depois reflita.
(Se apenas o carvão tivesse fatias de cordas ... infelizmente, parece que ainda não foi implementado.)
fonte
CycleChop
, que pode ser usado para extrair o cabeçalho da string, economizando 4 bytes. No entanto, existe uma abordagem melhor que salva 9 bytes. Acho que algumas poupanças também funcionaram na época: oReflect
padrão é refletido corretamente, economizando mais um byte e uma das variáveis é predefinida para a primeira entrada, economizando dois bytes.Pip ,
3225 bytesToma a cadeia de entrada como um argumento da linha de comandos. Experimente online!
Explicação
fonte
R com pacote stringi, 225 bytes
Se você executar R no código interativo, depois de colar minha resposta, insira qualquer coisa. Você precisará instalar o pacote stringi R (espero que não seja contra as regras).
Explicação:
A idéia básica é adicionar espaços ao lado esquerdo e cortá-lo no comprimento certo. Depois disso, cole-o com a versão invertida no lado direito. Aqui está uma versão mais longa, legível por humanos, da função:
fonte
Ruby,
928985 bytesMeu processo foi remover o primeiro caractere da metade direita de cada linha depois de reverter a primeira metade. Como isso:
Eu não estou acostumado a tentar jogar golfe, então deixe-me saber se há algo que eu possa fazer para diminuí-lo.
fonte
Lote,
186185 bytesAs linhas 1 e 6 têm um espaço à direita. Editar: salvou 1 byte graças a @ ConorO'Brien.
fonte
@set
e remover@echo off
, inserindo@
como necessário.set
s teria me economizado bytes suficientes para fazer valer a pena.Haskell , 76 bytes
v
é a função principal, levando umaString
discussão e dando umString
resultado.Experimente online!
Notas:
i
é o argumento / entrada inicial.s
é inicialmentei
comlength i
espaços anexados.v i
chamar s
e junta as linhas de resultado.r
retorna uma lista deString
linhas.t
és
com o último caractere cortado.r t
produz as linhas, exceto a primeira, menos o espaço inicial em cada linha.fonte
v
. : Dunlines.r.((++)<*>(' '<$))
.Gelatina , 13 bytes
Experimente online!
Quão?
fonte
Ruby,
8583 byteseditar: espaço em branco removido em excesso
Na verdade, achei bastante difícil jogar este em Ruby. Depois de adicionar espaço em branco, ele se expande para um trecho de código bastante legível:
fonte
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 bytesCódigo pela primeira vez Golf. Dicas são bem vindas!
Saída do Programa:
Editar:
Economizou 40 bytes graças a Luis Mendo.
fonte
's'
deinput
. Além disso, eu não vejo por que você está usandoevalc(disp(...))
, mas eu acho que você pode apenas usarcell2mat
esse caminhoflip
é mais curto do queend:-1:1
, veja aquiPHP,
959285807877 bytesNota: usa codificação IBM-850
Execute assim:
Explicação
Tweaks
str_pad
padrão é espaço, que é o que precisamos)substr
~"0"
caso (ASCII 207), pois todas as entradas podem ser consideradas como ascii imprimíveis (Thx @Titus)fonte
echo$s,strrev($s=" $s"^$s^$s),~§;
salva 5 bytes.~$s[$i++]
é suficiente (de entrada é ASCII imprimível, e assim é$s
)JavaScript (ES6),
169157 bytes(-10 bytes graças a Conor O'Brien)
Uma solução recursiva. Eu sou novo no JavaScript, portanto, seja gentil! Todas as dicas de golfe são muito apreciadas. :)
E, claro, um feliz aniversário para você
V
!Snippet de teste
Mostrar snippet de código
fonte
s.split("")
pode ser alterado para[...s]
ea.join("")
pode sera.join
seguido por um par de reticulares. Você pode salvar 3 bytes adicionais substituindo[r='repeat']
e[r]
com repetição simples e simples, o mesmo comslice
.CJam , 26 bytes
Feliz aniversário do seu velho amigo CJam!
Experimente online!
Explicação
fonte
PowerShell,
126 bytes124 bytesChame-o com um único parâmetro, como
.\V.ps1 Hello
.Edit: 2 bytes salvos com dica do AdmBorkBork
fonte
$l=($s="$args")|% Le*;
Pyke , 14 bytes
Experimente online!
fonte
JavaScript (ES6), 94 bytes
Casos de teste
Mostrar snippet de código
fonte
J, 44 bytes
fonte
|."0 1
para|."{
(salvo 2 bytes)