Os codificadores estão sempre tentando achatar matrizes em entediantes entidades unidimensionais e isso me deixa triste.
Sua tarefa é desfazer uma seqüência arbitrária de caracteres, produzindo uma linda paisagem da cidade.
Considere a string: aaabbbbbccqrrssstttttttPPw
Parece muito melhor assim:
tt
tt
bb tt
bb tt
aabb sstt
aabbcc rrssttPP
aabbccqqrrssttPPww
(Ok, sim, as letras são duplicadas para parecer mais com o horizonte da cidade).
Pegue uma string de entrada, duplique cada subseção de caracteres correspondentes (não necessariamente letras alfabéticas) e construa-me uma cidade!
Os bytes de código mais curto ganham.
Na verdade, eu pensei que tinha os requisitos acertados, mas para responder a algumas perguntas:
- deve estar no chão
- você pode ter céu extra, se quiser (linhas em branco à esquerda, espaço em branco ao redor) - mas não entre os prédios
- as letras podem ser reutilizadas dentro da string (mesma arquitetura, local diferente)
- presume-se que as letras sejam ASCII, mas será dado um toque maior àqueles que suportam codificações adicionais (UTF8, etc.)
aaabbbbaa
?Respostas:
05AB1E , 6 bytes
Experimente online!
Em uma versão mais recente que o desafio,
ζ
foi adicionada como uma substituição para.Bø
05AB1E , 8 bytes
Explicação:
Experimente online!
fonte
z⁶
para.Bø
... mas tambémŒgx'2
paraγ€D
> _>γ.BD)ø˜øR»
era o que eu tinha sem olhar,€D
é muito melhor; No entanto, sinto que estamos perdendo a solução de 1 byte para duplicação em linha.CJam , 23 bytes
Experimente online!
Explicação:
fonte
Geléia , 9 bytes
Experimente online!
Explicação:
fonte
'
, que era repetir as listas em si e não os itens dentro delas, mas no geral é bom. :)Python 3 ,
155136134132 bytes-19 bytes graças a @LeakyNun
-2 bytes graças a @officialaimm
-1 byte graças a @Wondercricket
Experimente online!
fonte
Python 2 , 117 bytes
Experimente online!
fonte
Java 8,
412400330324312319 bytes-6 bytes graças ao VisualMelon
-12 bytes graças a Kevin Cruijssen
mas +19 bytes porque esqueci de incluir as importações na contagem de bytes.
Experimente online!
fonte
i=0
, ou melhori=l
, e fazer a contagem regressivafor(;i-->0;h=d>h?d:h)
(e colocar a parte deh=
dentro). A mesma contagem regressiva também funcionará para o loop interno. O interiorif
também não precisa dos aparelhos{}
. E esteja sempre cansado<=
ou>=
, você pode mudar o ternário>
e salvar um byte.import java.util.*;
paraMap
eHashMap
, as importações fazem parte da contagem de bytes; e -1 removendo o ponto e vírgula à direita, o que não é parte da contagem de bytes).import java.util.*;x->{Map m=new HashMap(),n;int l=x.length(),i=l,v,y,h=0,d=1;char c,k;for(;i-->0;m.put(c,d=m.get(c)!=null?d+1:1),h=d>h?d:h)c=x.charAt(i);for(y=h;y>0;y--){n=new HashMap(m);for(i=0;i<l;i++)if(n.get(k=x.charAt(i))!=null){v=(int)m.get(k);System.out.print((y>v?" ":k+""+k)+(i==l-1?"\n":""));n.remove(k);}}}
HashMap<>
→HashMap
;Map n=
→,n
en=
;m.put(c,d=m.get(c)!=null?d+1:1);
dentro do loop for para se livrar dos suportes;k=x.charAt(i)
dentro doif(n.get(k)!=null)
para se livrar dos suportes de ponto e vírgula e de loop for. Mais uma vez, bem-vinda e ótima resposta! +1 de mim. Além disso, caso você ainda não tenha visto: Dicas para jogar golfe em Java e Dicas para jogar em <qualquer idioma> podem ser interessantes para ler.Japt ,
1918151312 bytesInclui espaços à direita em cada linha.
Teste-o
Explicação
fonte
Mathematica, 150 bytes
fonte
R , 135 bytes
Experimente online!
lê de stdin, grava em stdout (com uma nova linha à direita).
Explicação:
rle
encontra os comprimentos das faixas de caracteres, as alturas de cada torre.sub
expressão substitui cada caractere por seu duplo (então eu não precisei mexer com a definição de índices adjacentes)sapply
retorna uma matriz (neste caso, uma matriz):sum(e$l|1)
é o número de caracteres distintos; vamos de cima para baixoifelse( ... )
é um vetorizadoif...else
que nos permite construir uma matriz de torres e espaços duploswrite
grava no console, com algumas opções para formatar.fonte
Pitão , 13 bytes
Experimente online!
fonte
PHP , 138 bytes
Experimente online!
fonte
MATL , 15 bytes
Experimente online!
Explicação
fonte
Carvão , 40 bytes:
Experimente online! Link é a versão detalhada do código. Inicialmente, tentei um loop simples sobre a string de entrada para imprimir um oblongo toda vez que a letra era alterada, mas mudei para esse método de criação de lista, pois economizava 5 bytes. Explicação: A variável
l
contém uma lista aninhada das letras de entrada. Os caracteres que correspondem aos últimos elementos da lista atual são empurrados para a última lista, caso contrário, uma nova sublist é criada para esse personagem. Resta então juntar as letras em cada sub-lista para que elas possam ser impressas verticalmente duas vezes.fonte
C,
259231 bytesCódigo de golfe
Código detalhado
Compilado com o GCC, sem sinalizadores especiais
Editar
Economizou 28 bytes graças a adelphus. Sua mudança me permitiu criar uma definição. E eu fiz os loops while em loops para economizar 2 bytes cada, reorganizando o loop. Também corrigi um problema em que o código seria interrompido quando o último caractere na entrada não fosse singleton. O código falhará se houver apenas uma letra exclusiva, mas deve funcionar em todos os outros casos.
fonte
while (i < strlen(argv[1]))
pode ser reduzido parawhile (argv[1][i])
- loop até o caractere nuloPip , 22 bytes
21 bytes de código, +1 para
-l
sinalizador.Experimente online!
Explicação
fonte
QuadS , 15 + 1 = 16 bytes
+1 byte para o
1
sinalizador.Experimente online!
⊖⍵
pós-processo virando de cabeça para baixo(.)\1*
execuções de caracteres idênticos2/⍪⍵M
duplicar o M atch colunaO
1
sinalizador faz com que os resultados sejam mesclados.fonte
Haskell, 144 bytes
Estou bastante confiante de que posso fazer melhor do que isso, mas é o melhor que posso encontrar por enquanto.
fonte
Data.List
quais não está no escopo por padrão. Você deve adicionar aimport Data.List
contagem de bytes ou especificar um ambiente Haskell que o inclua por padrão (por exemplo, alterar o idioma deHaskell
paraHaskell (lambdabot)
. - Algumas dicas: a) usar guardas de padrão para vincular variáveis em vez delet
e / ou declarar funções auxiliares diretamente:l=length;f s|x<-groupBy(==)s,m<-... =concatMap
. b)map l x
él<$>x
, c)concatMap("++\n"
éunlines
. d)groupBy(==)
é justogroup
. e)concat
éid=<<
. Você pode usarm
apenas uma vez, de modo inline()
passearl y
,replicate ... ' '
emap ... x
. Todos em todos:import Data.List;l=length;f s|x<-group s=unlines$reverse$transpose$id=<<[[z,z]|z<-map(\y->y++replicate(maximum(l<$>x)-l y)' ')x]
.groupBy(==)
=group
, embora eu não tenha certeza se um está no Prelude e o outro não.concatMap
pode ser escrito>>=
, emap
pode ser infixado como<$>
, econcat[[z,z]|z<-…]
pode ser(replicate 2)=<<…
ou(\z->[z,z])=<<…
(\z->[z,z])
é(:)<*>pure
, ou seja,...transpose$(:)<*>pure=<<map(\y...)x
Empilhados , 42 bytes
Experimente online!
fonte
Ruby , 116 bytes
Experimente online!
fonte
puts a.map{...}
pode ser substituído porp(a.map{})
p
vai aspas saída, por isso é não cabe aquiAPL (Dyalog) , 37 bytes
Experimente online!
fonte
q / kdb +, 53 bytes
Solução:
Exemplo:
Explicação:
fonte
Perl 5 , 92 + 1 (-p) = 93 bytes
Experimente online!
fonte