Identicons são representações visuais de valores de hash, geralmente feitos de arranjos simétricos de formas geométricas. Seu avatar padrão do Stack Exchange é um identicon. Esse desafio é sobre a criação de "wordenticons" , versões simples de identicons baseadas em texto que se aplicam a cadeias de letras minúsculas, ou seja, palavras.
Desafio
Escreva um programa ou função que use uma string S e produza seu wordenticon. É garantido que S não é vazio e contém apenas caracteres em minúsculas da letra em inglês az. Opcionalmente, você pode assumir que S tem uma nova linha à direita.
O wordenticon de S será uma grade quadrada de texto com comprimentos laterais 2*length(S)
compostos por espaços (
), barras verticais, ( |
) e barras horizontais ( ―
).
Para gerar o wordenticon de S, forme uma grade quadrada em que cada coluna corresponda a uma letra de S (na ordem normal de leitura da esquerda para a direita) e cada linha corresponda a uma letra de S (na ordem de leitura normal de cima para baixo) )
Por exemplo, se S é food
nossa grade inicial, parece
food
f....
o....
o....
d....
onde .
é apenas um espaço reservado.
Para cada ponto vazio (todos .
) na grade:
- Se a letra da coluna vier antes da letra da linha em ordem alfabética, substitua
.
por|
. - Se a letra da coluna vier após a letra da linha em ordem alfabética, substitua
.
por―
. - Se as letras da coluna e da linha forem iguais, substitua
.
por
Aqui está o food
exemplo após cada uma dessas etapas:
Adicionando
|
:food f...| o|..| o|..| d....
Adicionando
―
:food f.――| o|..| o|..| d―――.
Adicionando
food f ――| o| | o| | d―――
Para concluir o wordenticon, remova a linha e a coluna supérfluas que contêm as palavras
――|
| |
| |
―――
espelhar a coisa toda horizontalmente
――||――
| || |
| || |
――― ―――
e finalmente espelhe-o novamente na vertical
――||――
| || |
| || |
――― ―――
――― ―――
| || |
| || |
――||――
resultando na 2*length(S)
grade de texto de comprimento lateral que é o wordenticon final.
Exemplos
Aqui estão alguns exemplos adicionais do wordenticon. Observe que palavras diferentes podem ter wordenticons idênticos e alguns wordenticons podem ser completamente compostos por espaços (infelizmente a marcação não quer renderizá-los).
food
――||――
| || |
| || |
――― ―――
――― ―――
| || |
| || |
――||――
mood
――||――
| || |
| || |
――― ―――
――― ―――
| || |
| || |
――||――
foof
―― ――
| || |
| || |
―― ――
―― ――
| || |
| || |
―― ――
fool
――――――
| || |
| || |
|―― ――|
|―― ――|
| || |
| || |
――――――
a [2*2 grid of spaces]
to
||
― ―
― ―
||
it
――
| |
| |
――
tt [4*4 grid of spaces]
abc
――――
| ―― |
|| ||
|| ||
| ―― |
――――
and
――――
| || |
|― ―|
|― ―|
| || |
――――
but
――――
| || |
|― ―|
|― ―|
| || |
――――
you
||||
― ―― ―
―| |―
―| |―
― ―― ―
||||
bob
― ―
| || |
― ―
― ―
| || |
― ―
cat
|――|
― ―― ―
|| ||
|| ||
― ―― ―
|――|
cart
|――――|
― ―――― ―
|| ―― ||
||| |||
||| |||
|| ―― ||
― ―――― ―
|――――|
todo
||||||
― | | ―
―― ―― ――
― | | ―
― | | ―
―― ―― ――
― | | ―
||||||
mice
||||||
― |||| ―
―― ―― ――
――| |――
――| |――
―― ―― ――
― |||| ―
||||||
zyxw
||||||
― |||| ―
―― || ――
――― ―――
――― ―――
―― || ――
― |||| ―
||||||
banana
|―|―||―|―|
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
|| | || | ||
― ― ― ― ― ―
|―|―||―|―|
codegolf
――――――――――――――
| ||| |||| ||| |
|― ―――――――――― ―|
|―| ―――――――― |―|
|―|| ――||―― ||―|
| ||| |||| ||| |
|―|||― || ―|||―|
|―||――― ―――||―|
|―||――― ―――||―|
|―|||― || ―|||―|
| ||| |||| ||| |
|―|| ――||―― ||―|
|―| ―――――――― |―|
|― ―――――――――― ―|
| ||| |||| ||| |
――――――――――――――
programming
―||―||||||||||||―||―
| || |||||||||||| || |
―― |―||||||||||||―| ――
――― ―|―――― ――――|― ―――
| || |||||||||||| || |
――――― ―――――――――― ―――――
―――|―| |―||―| |―|―――
―――|―| |―||―| |―|―――
―――|―|―― ―||― ――|―|―――
―――|―|||| || ||||―|―――
――― ―|―――― ――――|― ―――
――― ―|―――― ――――|― ―――
―――|―|||| || ||||―|―――
―――|―|―― ―||― ――|―|―――
―――|―| |―||―| |―|―――
―――|―| |―||―| |―|―――
――――― ―――――――――― ―――――
| || |||||||||||| || |
――― ―|―――― ――――|― ―――
―― |―||||||||||||―| ――
| || |||||||||||| || |
―||―||||||||||||―||―
abcdefghijklm
――――――――――――――――――――――――
| ―――――――――――――――――――――― |
|| ―――――――――――――――――――― ||
||| ―――――――――――――――――― |||
|||| ―――――――――――――――― ||||
||||| ―――――――――――――― |||||
|||||| ―――――――――――― ||||||
||||||| ―――――――――― |||||||
|||||||| ―――――――― ||||||||
||||||||| ―――――― |||||||||
|||||||||| ―――― ||||||||||
||||||||||| ―― |||||||||||
|||||||||||| ||||||||||||
|||||||||||| ||||||||||||
||||||||||| ―― |||||||||||
|||||||||| ―――― ||||||||||
||||||||| ―――――― |||||||||
|||||||| ―――――――― ||||||||
||||||| ―――――――――― |||||||
|||||| ―――――――――――― ||||||
||||| ―――――――――――――― |||||
|||| ―――――――――――――――― ||||
||| ―――――――――――――――――― |||
|| ―――――――――――――――――――― ||
| ―――――――――――――――――――――― |
――――――――――――――――――――――――
Pontuação
Isso é código-golfe , o código mais curto em bytes vence. O desempatador vai para a resposta anterior.
Notas
- Qualquer instância de barra horizontal (
―
) no seu código pode ser contada como 1 byte, em vez dos 3 bytes UTF-8 que ele realmente ocupa. (Até dez instâncias.) - Se desejar, você pode usar traços regulares (
-
) no lugar de barras horizontais (―
). - Não é permitido remover ou adicionar espaços à direita nas linhas de um wordenticon (mesmo que a forma permaneça inalterada). Deve ser um
2*length(S)
quadrado de texto com o comprimento exato do lado. - O wordenticon de saída pode, opcionalmente, ter uma única nova linha à direita.
programming
,and
ecodegolf
mas você esqueceupuzzles
...Respostas:
MATL,
2015 bytesExperimente no MATL Online
Explicação
fonte
Java,
329305264259192 bytesGraças a:
StringBuilder
porString
.Golfe:
Ungolfed:
Definitivamente divertido. A primeira tentativa foi uma função que
O(n)
acabou sendo substituída por essa forma mais simples depois que fiquei muito frustrado.E, para testar:
fonte
\u2015
. Usar barra horizontal (ou simplesmente traço) no código bruto é bom.String
em vezStringBuilder
da resposta poderia ser muito mais curto ... (embora possa ocupar muito mais memória)int
s na mesma linha:int i,j,l=m.length();for(i=0;i<l;i++){...
Haskell, 93 bytes
Exemplo de uso:
Como funciona (nota:
(f <*> g) x
é definida comof x (g x)
):Versão alternativa: a função "encontrar substituição"
((("- |"!!).fromEnum).).compare
também pode ser escritaa#b|a<b='-'|a>b='|'|1<2=' '
e chamada via(#)
para a mesma contagem de bytes.fonte
Gelatina , 16 bytes
Experimente online!
Como funciona
fonte
JavaScript (ES6), 94 bytes
Usando um traço, porque geralmente executo o shell SpiderMonkey JS no Windows e o Unicode não funciona se eu fizer isso.
fonte
[...s,s].reverse()
+1Pyth,
3130Suíte de teste
Infelizmente, não consigo largar os
Q
s por causa dos vários bifurcados. Até agora, um algoritmo bastante básico, count trata a barra horizontal como 1 byte.fonte
Haskell, 66 bytes
fonte
JavaScript ES6,
138126123 bytesa maior parte do código é a reflexão / inversão
fonte
J,
2620 bytes6 bytes graças a @Zgarb .
Resposta anterior de 26 bytes
Usa o mesmo algoritmo da resposta de Dennis.
Uso:
(
>>
significando entrada (STDIN),<<
significando saída (STDOUT))fonte
' |-'{~3*@-/~@u:[,|.
Mathematica,
124110104102 bytesFunção anônima. O caractere Unicode é U + F3C7 para
\[Transpose]
.fonte
Javascript
146142132 132130124 bytesSuíte de teste:
Obrigado por @HelkaHomba, por ajudar a remover pelo menos 50 bytes, e por @Downgoat por 3 bytes!
fonte
Na verdade, 53 bytes
Mais uma vez, as más habilidades de processamento de cordas da Actually são sua criptonita. Ainda é mais curto que o Java, então tenho isso para mim, o que é legal.
Experimente online!
Explicação:
O código pode ser separado em três partes distintas: o código de conversão, o código de processamento e o código de espelhamento. Para facilitar a leitura, vou explicar cada seção separadamente.
Código de conversão (começa com a sequência de entrada,,
s
na pilha):Código de processamento (começa com uma lista de
n**2
caracteres, correspondente ao canto inferior direito):Código de espelhamento (começa com uma
n**2+n
cadeia de comprimento, com períodos atuando como novas linhas)fonte
> <> , 109 bytes
A entrada é via STDIN. Experimente online!
Explicação:
A entrada lida e espelhada na primeira linha. Para entrada
abcd
, isso deixadcbaabcd
na pilha. Cada metade é então espelhada para darabcddcba
(linha 2). Em seguida, cada elemento é duplicado e deixado em sua própria pilha por vez (linhas 3 e 4). Após esse processo, a pilha de pilhas fica mais ou menos assim:Para cada pilha por vez, o valor da linha (a parte inferior da pilha) é comparado ao valor da coluna (a parte superior da pilha). O caractere apropriado é selecionado
- |
e gravado em STDOUT. Os valores da coluna são rotacionados para que a próxima coluna esteja no topo da pilha (linha 6).Depois que todas as colunas forem consideradas, o valor da linha é descartado, uma nova linha impressa e os valores da coluna colocados na pilha anterior (linha 7), para que o processo de saída seja iniciado novamente.
O
]
comando, além de saltar da pilha de pilhas, esvazia a pilha atual, se esta for a única. A condição final do programa é se a pilha estiver vazia, pois todas as linhas foram processadas (linha 5).fonte
C #,
169150 bytesobrigado FryAmTheEggman
ungolfed:
mais conselhos sobre golfe apreciados
fonte
t+=c==k?" ":c>k?"|":"-";
Deveria trabalhar. Eu não joguei muito c #, mas é bem possível que o uso defor
loops regulares seja mais curto.Reverse()
eToArray()
fazem parte doSystem.Linq
modo é necessária uma declaração usando.C #
166143 bytes,Explicação:
Teste:
fonte
IEnumerable<char>
você pode economizar alguns bytes usando.Reverse()
diretamente na corda pular o.ToCharArray()
var a = new[] { '-', ' ', '|' };
paravar a = "- |";
porque você pode usar a indexação em cordasCJam, 20 bytes
Teste aqui.
Usa a abordagem óbvia de calcular um produto externo e usar diferença e sgn para calcular o caractere em cada célula.
fonte
Clojure, 171 bytes
ungolfed:
fonte
J,
7570 bytes5 bytes salvos graças ao Dennis.
Vou trabalhar para convertê-lo em um verbo tácito mais tarde.
fonte
Oitava, 39 bytes
Cria uma função anônima que pode ser executada usando
ans('string')
.Demo
Explicação
Esta solução combina a string de entrada (
x
) e é inversa (flip(x)
) usando[x, flip(x)]
. O inverso é designadoy
para encurtar a resposta[x, y = flip(x)]
,. Nós, então, criar um vetor da mesma coisa coluna combinandox
ey
e tendo a transposição:[x,y]'
. Então tomamos a diferença que será transmitida automaticamente para criar uma matriz 2D de diferenças entre quaisquer representações ASCII de letras nas strings. Nós usamossign
para fazer estes, quer-1
,0
ou1
e, em seguida, adicionar2
para obter valores de índice com base em 1 válido. Nós então os usamos para indexar na string inicial'| -'
.fonte
Julia, 70 bytes
Esta é a minha primeira tentativa de código de golfe e eu não usei Julia antes, então me diga o que você pensa:
Experimente online!
Ungolfed:
Eu acho que provavelmente poderia ser menor. Este código armazena os caracteres do wordicon em uma matriz:
Infelizmente, não consegui produzir a saída desejada usando a matriz.
fonte
Jolf, 42 bytes
Dificilmente jogado golfe. Provavelmente estou esquecendo uma matriz incorporada que Jolf possui.
Experimente aqui! Este código usa uma função de seta (
Ψ
) para o mapa da matriz.fonte
Javascript, 303 bytes
Ungolfed
Aqui não há fantasias de ecma 2015
fonte
var x = 1
, apenas façax = 1
. No código de golfe, ninguém se importa em aderir às melhores práticas. :)Python 2, 126 bytes
Esta é essencialmente uma porta da minha solução Actually .
Experimente online
Explicação:
fonte
Python 3.5,
250223175 bytes:Experimente Online! (Ideona) (Os dois últimos casos de teste não aparecerão na saída, pois são apenas linhas em branco. Meu programa está processando-os, o que confirma o fato de que há 10 casos de entrada, mas apenas 8 saídas aparecem.)
Ungolfed seguido de uma explicação:
p=[[' ―'[O(i)<O(g)],'|'][O(i)>O(g)]for i in o for g in o]
Crie uma lista,
p
onde a|
é adicionada se o Valor do Ponto Unicode da letra da coluna for menor que o valor da letra da linha, a–
será adicionado se o Valor do Ponto Unicode da letra da coluna for maior que o valor da letra da linha ou ase ambos valores são iguais.
u='\n'.join([''.join(p[i:G+i]+p[i:G+i][::-1])for i in range(0,len(p),G)])
Crie uma sequência unida de nova linha
u
, a partir da listap
, dividindo-a em segmentos de sequência unida, cada um consistindo no número de caracteres de comprimento de entrada para frente e para trás, resultando em cada um tendo o comprimento de 2 vezes o número de caracteres existentes na entrada. Esta é a metade superior do seu wordenticon. Portanto, no caso de sua entradafood
, isso retornaria:print(u+'\n'+u[::-1])
Finalmente, a saída foi
u
seguida por uma nova linha e, em seguida,u
revertida para espelhar verticalmente a primeira metade da segunda metade. Este é o seu wordenticon completo, que para o caso de testefood
seria finalmente:fonte
R , 101 bytes
101 bytes desde que estou usando
―
(o que acho melhor-
).Experimente online!
Fiquei surpreso por não haver uma resposta R antes, pois podemos explorar a simetria e as matrizes de R para obter uma resposta bastante competitiva, apesar de ser um
string
problema.Explicação Ungolfed:
fonte
C (gcc) , 202 bytes
Experimente online!
Funciona repetindo cada caractere e atualizando o caractere resultante (e seus reflexos).
fonte
05AB1E (herdado) ,
202221 bytes+2 bytes como correção de bugs para entradas de caractere único ..
-1 byte usando traços regulares em
-
vez de―
, pois podemos usá-… |-
los em vez de"… |―"
(já… |―
que agiriam incorretamente como uma string de dicionário)Usa a versão herdada do 05AB1E, uma vez que ela entra implicitamente em novas linhas ao espelhar, o que requer um explícito adicional
»
na nova versão.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte