Introduções
Uma matriz booleana 2 × n pode ser representada como uma sequência de quatro caracteres . ':
. A cadeia possui uma "linha superior" e uma "linha inferior", com pontos representando 1s e espaços vazios representando 0s. Por exemplo, a matriz 2 × 6
1 0 1 0 0 1
0 0 0 1 0 1
pode ser representado como ' '. :
. Sua tarefa é pegar uma matriz nessa "forma compactada" e girar suas entradas um passo no sentido horário, como uma correia transportadora.
Entrada
Sua entrada é uma única sequência sobre os caracteres . ':
. É garantido que seu comprimento seja pelo menos 2.
Resultado
Sua saída deve ser a sequência de entrada, mas com cada ponto girado um passo no sentido horário. Mais explicitamente, os pontos na linha superior mais um lugar à direita, exceto o mais à direita, que se move para baixo. Os pontos na linha inferior movem um passo para a esquerda, exceto o mais à esquerda, que se move para cima. Em particular, a cadeia de saída deve ter o mesmo comprimento que o original e o espaço em branco é significativo.
Exemplo
Considere a sequência de entrada :..:'.
, que corresponde à matriz 2 × 6
1 0 0 1 1 0
1 1 1 1 0 1
A versão rotacionada dessa matriz é
1 1 0 0 1 1
1 1 1 0 1 0
que corresponde à string ::. :'
.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas. Você pode decidir se a entrada e a saída estão entre aspas, e uma nova linha à direita também é aceitável em ambas.
Casos de teste
Esses casos de teste estão entre aspas duplas.
" " -> " "
" ." -> ". "
". " -> "' "
"' " -> " '"
" '" -> " ."
": " -> "''"
"''" -> " :"
":." -> ":'"
":.'" -> ":'."
"..." -> ":. "
": :" -> "':."
"':." -> ".:'"
".:'" -> ": :"
" " -> " "
"::::" -> "::::"
":..:'." -> "::. :'"
" : .:'" -> ". '.. :"
": ''. :" -> "'' :'.."
"........" -> ":...... "
":::: " -> ":::'' "
" ::::" -> " ..:::"
" : : : : " -> ". : : : '"
".'.'.'.'.'" -> "'.'.'.'.'."
".. :: '.' :." -> ": ..'' .' :.'"
".' '.:: :.'. . ::.' '. . .::' :.'." -> "' ' .:.''..'.'. ..:' ' .'. ...'''..'.'"
s=>s.replace(/./g,(c,i)=>" '.:"[(i?q>' '&q!=".":c>"'")+(q=c,s[++i]?s[i]>"'":c>' '&c!=".")*2])
(Flip 2 partes para que eu possa aumentar i, menos regexp e teste mais simples, save prev c em q)Perl,
706964636160 bytesInclui +2 para
-lp
Execute com a string de entrada no STDIN, por exemplo
rotatedots.pl
:Explicação
O espaço
não é convertido no código acima. Para os cálculos
/2
e*2
vai se comportar como e se tornar0
. Nas outras posições, ele fará parte do "ou", mas os 1 bits de espaço são um subconjunto dos bits um0
e terão o mesmo efeito que0
se fossem orados com qualquer um dos dígitos. Somente se o personagem com o qual ele é editado for um espaço, ele permanecerá um espaço em vez de se tornar um0
. Mas tudo bem, pois0
teria sido convertido de volta ao espaço de qualquer maneira.fonte
Retina , 66
Explicação
Começando com a entrada:
Os primeiros 4 estágios constroem a matriz, usando
1
/e
para true e0
/f
for false nas linhas superior / inferior, respectivamente. As linhas superior e inferior são entrelaçadas. Isso produziria uma string como:No entanto, esses quatro estágios também movem efetivamente a linha inferior 1 para a esquerda, simplesmente revertendo a ordem das letras e dígitos:
O
T
estágio de ransliteração inverte dígitos hexadecimais apenas para o primeiro e o último caracteres, ou seja, substitui0-9a-f
porf-a9-0
. Isso tem o efeito de mover o caractere inferior esquerdo para a linha superior e o caractere superior direito para baixo na linha inferior:O estágio seguinte troca todos os pares de dígitos de letras, movendo a linha superior 1 para a direita. Antes isso era
(\D)(\d)
, mas acontece que(.)(\d)
é suficiente porque as substituições sempre acontecem da esquerda para a direita e, portanto, os dois dígitos finais não serão erroneamente correspondidos por isso, porque o penúltimo caractere já terá sido substituído. A matriz agora foi totalmente rotacionada conforme necessário:As 4 etapas finais são convertidas novamente para o formato original:
Experimente online.
Todos os casos de teste, um por linha , foram
m
adicionados àT
linha para permitir o tratamento separado de cada linha de entrada.fonte
Geléia,
323029 bytesObserve o espaço à direita. Experimente online! ou verifique todos os casos de teste .
fundo
Começamos considerando a sequência de entrada (por exemplo,
:..:'.
) e seu reverso.Para cada caractere na linha superior, verificamos se ele pertence
':
e para cada caractere da linha inferior, se ele pertence.:
. Isso fornece à matriz 2D de booleanosqual é a matriz da pergunta, com a linha inferior invertida.
Removemos o último booleano de cada linha, invertemos a ordem das linhas, acrescentamos os booleanos na ordem original e, finalmente, invertemos a linha superior.
Isso gera a matriz rotacionada a partir da pergunta.
Por fim, consideramos cada coluna dos booleanos um número binário e um índice
'.:
para obter os caracteres apropriados.Como funciona
fonte
Pyth,
38.36.2 bytes graças a Jakube!
Experimente aqui ou execute o Test Suite .
Explicação:
fonte
L,hb_eb
é um byte mais curto e.DR2T
cria também o produto cartesiano e mais alguns pares, mas não o faz nem um dígito e ajuda a economizar espaço..D
truque é muito legal!Python 3,
145141130 bytesExplicação
A solução golfed usa a seguinte propriedade zip:
zip('ABCD', 'xy') --> Ax By
portanto,zip(a[:l],a[l:])
pode ser substituída porzip(a,a[l:])
e que permite remover a definição del
Resultados
fonte
Pitão, 66 bytes
Experimente aqui!
Explicação
Isso pode ser dividido em 3 partes:
Converter entrada
Isso é bastante trivial. Cada personagem é mapeado da seguinte maneira:
O primeiro é um espaço em branco.
Nós obtemos uma lista de duas tuplas que transpomos para obter as 2 linhas da matriz que são achatadas.
Código
Rodar
Temos a matriz como matriz plana
J
e a largura da matriz emK
. A rotação pode ser descrita como:Código
Converta de volta
fonte
Python 3,
166154153150146138137135132127 bytesEdit: Eu peguei emprestado o uso da resposta Python
zip
de Erwan no final da função.e a ideia deles de usarAcontece que as reversões não eram uma boa ideia para minha função. Eu mudei meu uso de[::-1]
inversões, embora eu tenha dado o meu toque.format
para mais golfe. Movidoa
eb
diretamentezip
para jogar golfe (o golfe continua inalterado porque a separação dea
eb
é útil para evitar a confusão na minha explicação)Edit: Borrowed
(some number)>>(n)&(2**something-1)
de esta resposta por xnor o desafio Música Interval Solver . A confusão que ézip(*[divmod(et cetera, 2) for i in input()])
provavelmente pode ser melhorada, embora eu goste da conveniência que concede ao usar duas tuplast
ev
.Ungolfed:
fonte
Ruby,
166163 bytesEca ...
transpose
é muito longo.Truques usados aqui:
sprintf('%02b',x)
Para converter"0"
,"1"
,"2"
,"3"
em"00"
,"01"
,"10"
, e"11"
, respectivamente. Surpreendentemente, o segundo argumento não precisa ser convertido em um número inteiro primeiro.A rotação é feita via
a[1].push a[0].pop;a[0].unshift a[1].shift;
, o que eu pensei que era pelo menos um pouco inteligente (se não excessivamente detalhado em Ruby). A simetria é esteticamente agradável, de qualquer maneira: Pfonte
->s{a=s.tr(f=" .':",'001').chars;b=s.tr(f,'0101').chars;b<<a.pop;([b.shift]+a).zip(b).map{|x|x.join.to_i 2}.join.tr'0-3',f}
.map{|x|x.join.to_i 2}.join.tr'0-3',f
→.map{|x|f[x.join.to_i 2]}*''
Javascript ES6 125 bytes
Mapeio cada caractere para um equivalente binário de dois dígitos
e eu estou pensando neles como sendo um em cima do outro
Eu guardo isso em n
Para cada caractere (0-3) de n, verifico seus vizinhos, adicionando o bit de ordem mais alta do vizinho esquerdo ao bit de ordem mais baixa do vizinho direito. se i == 0 (primeiro caractere) eu uso seu próprio bit de ordem inferior, em vez do bit de ordem superior do vizinho esquerdo.
se n [i + 1]> - 1 significa que obtivemos 0,1,2,3; portanto, quando isso é falso, atingimos o último elemento.
Quando isso acontece, eu uso o bit de ordem mais alta do personagem em vez do bit mais baixo do vizinho certo
mapear isso de volta à
.':
terra e juntar essa matriz novamentefonte
MATL ,
4039 bytesExperimente online! A versão vinculada foi
v
substituída por&v
, devido a alterações no idioma após a postagem desta resposta .fonte
JavaScript, 311 bytes
Provavelmente pode ser melhorado muito:
fonte
s[i-1]
? Isso pode economizar alguns bytes.s[i+1]
.<
vez de==
pode economizar alguns bytes. Você também pode querer<
vez de==
JavaScript (ES6),
237210204188182178 bytesCrédito para @Downgoat por salvar 16 bytes na revisão de 188 bytes
Atualização: Eu tive uma onda cerebral e reduzi a primeira operação
s
a uma únicamap
chamada em vez de duas chamadas separadasPretty Print & Explicação
fonte
s=>(r=" .':",a=[],s=[...s].map(c=>('00'+r.indexOf(c).toString(2)).slice(-2)).map(n=>(a.push(n[0]),n[1]),a.splice(0,0,s.shift()),s.push(a.pop()),a.map((v,i)=>r[parseInt(v+s[i],2)]).join``)
trabalho?Perl,
144142137131 bytesByte adicionado para o
-n
sinalizador.Praticamente o mesmo algoritmo da minha resposta Ruby , apenas mais curto, porque ... Perl.
Obnoxiously,
@a=(shift@b,@a)
é mais curto queunshift@a,shift@b
.Infelizmente, estes têm o mesmo comprimento:
Graças a Ton Hospel por 5 bytes e msh210 por um byte!
fonte
..@a
em vez de..$#a
? (Talvezoct
morre ou retorna 0 ou algo que eu não tentei..)//g
sprintf
é muuuuito longo.map$_%2,/./g
emap$_/2|0,//g
quase tem que ser mais curto (não testado)Python 3,
294287283 bytesWaaayyyyyy por muito tempo, mas vou tentar jogar golfe de alguns bytes:
fonte
Lua, 139 bytes
Uso:
fonte