Dado um número k e um bloco de texto ou uma matriz 2D que as matrizes internas possam ter comprimentos desiguais (que se assemelham a um bloco de texto), gire cada caractere ou elemento da k- ésima coluna para cima ou para baixo até a próxima posição isso existe.
Exemplo
Gire a 20ª coluna do seguinte texto (com base em 1):
A line with more than k characters.
A longer line with more than k character.
A short line.
Rotate here: ------v--
This is long enough.
This is not enough.
Wrapping around to the first line.
Saída:
A line with more thtn k characters.
A longer line with aore than k character.
A short line.
Rotate here: ------m--
This is long enoughv
This is not enough.
Wrapping around to .he first line.
Girar a k- ésima coluna da mesma entrada em que 35 < k <42 produziria o texto de entrada inalterado.
Regras
- Você pode usar texto bruto, uma matriz de linhas, uma matriz 2D de caracteres ou qualquer formato razoável para representar os dados. Você também pode usar outros tipos de dados que não caracteres.
- O número de valores possíveis do tipo de dados dos elementos deve ser pelo menos 20 se o tamanho do código depender dele, caso contrário, pelo menos 2. Esse pode ser um subconjunto dos caracteres ou outros valores suportados no tipo nativo.
- Espaços e qualquer tipo de valor nulo são apenas valores normais, se você os permitir na entrada. Você também pode simplesmente excluí-los no tipo de elemento.
- Alteração de regra: você tem permissão para preencher as matrizes mais curtas com um valor padrão genérico (como espaços), se preferir usar matrizes com comprimentos iguais para armazenar os dados.
- k pode ser baseado em 0 ou baseado em 1. É garantido que ele esteja dentro da linha mais longa da entrada (o que implica que a entrada tenha pelo menos uma linha não vazia).
- Você pode escolher se gira para cima ou para baixo.
- Apenas gire uma posição ou gire n posições onde n é um número inteiro positivo dado na entrada.
- O menor código vence.
fonte
n~¨⍨↓⍉⎕⌽@(≢¨)@⎕⍉↑⎕,¨⍨n←⊂⊂⍬
. Talvez você possa adicionar modded↑
↓
em sua extensão para ajudar ainda mais no golfe (mas não sei exatamente quão úteis eles são).C
eI
estiverem localizadas para que não poluam:{~∘I¨⍨↓⍉⎕⌽@(~⊢∊I←⎕INSTANCES⊢∘C)@⎕⍉↑⎕,¨⍨⎕NEW⎕FIX I←C←':Class C' ':EndClass'}
Python 2 ,
11111010999989694 bytesExperimente online!
Recebe entrada como uma lista de linhas e coluna de índice 0 e retorna uma lista de cadeias.
A coluna é girada para cima 1.
-11 bytes, graças a Jo King
fonte
Java 8,
107106135107 bytes+29 bytes para uma correção de bug ..
Indexado a 0; gira para baixo como no exemplo.
Entrada como uma matriz de caracteres; modifica a matriz de caracteres em vez de retornar uma nova para salvar bytes.
Experimente online.
Explicação:
fonte
char p=m[0][k]
- se não tiver, isso não causará uma exceção? Bom trabalho btw. Você está batendo minha tentativa de c # por uma grande margem :)n
k
n
int p=0,t;
p
m[i%s][k]=(char)(p<1?t:p)
Zsh ,
94 87 78 7469 bytes-7 bytes alterando para um ternário aritmético, -9 bytes alterando o caractere no local (TIL), -4 bytes inserindo o índice em stdin e as strings como argumentos, -5 bytes usando uma string em vez de uma matriz para armazenar os caracteres rotativos.
Velho Velho Velho VelhoExperimente online!Aqui estão as chaves para fazer essa resposta funcionar:
$array[0]
ou$string[0]
está sempre vazio$array[n]
ou$string[n]
está vazio se n for maior que o comprimento da matriz / sequênciaarray[i]=c
oustring[i]=c
substituirá o elemento / caractere.$[$#s<i?0:++j]
, nãoj
é incrementado se .$#s<i
Na resposta original de 94 bytes, houve um problema interessante que me deparei com o uso
<<<
para imprimir. Eu tive que usarecho
para contornar isso:A razão para isso pode ser vista aqui:
As strings here são executadas em subshells porque são fornecidas como stdin para outro programa. Se não houver um programa, ele é implicitamente atribuído
cat
. Você pode ver isso com<<< $_
.<<< $ZSH_SUBSHELL
é semelhante aecho $ZSH_SUBSHELL | cat
. Como precisamos incrementarj
, não podemos estar em um subshell.fonte
R , 62 bytes
Experimente online!
Recebe a entrada como uma matriz de caracteres preenchida com espaço. Gira para cima. Tudo graças a Kirill L. !
R , 74 bytes
Experimente online!
Este envio antecede a permissão de linhas acolchoadas.
O aliasing
substr
aqui não funcionará porque estamos ligandosubstr
esubstr<-
na primeira linha.E / S como uma lista de linhas não preenchidas; gira para cima.
fonte
L
no ambiente pai. Felizmente, vou atualizar para o preenchimento de espaço!C # (compilador interativo do Visual C #) , 82 bytes
Experimente online!
Agradecemos a @ASCIIOnly por sugerir o
foreach
que resultou em uma economia de 12 bytes!-8 bytes graças a alguém!
-1 byte graças a @EmbodimentofIgnorance!
fonte
foreach
vez que é a ordem oposta :(dynamic
para mesclar declarações e salvar 2 bytes (nunca vi isso antes!) Experimente on-line!Ruby , 57 bytes
Experimente online!
Recebe a entrada como uma matriz de linhas
a
. Gira o texto para baixo na posição baseada em 0k
. Retorna modificando a entradaa
.fonte
05AB1E , 21 bytes
Definitivamente pode ser jogado um pouco mais ..
Indexado a 0; entrada e saída como uma lista de strings.
Ele gira para baixo como no exemplo, mas
<
pode ser substituído por>
para girar para cima.Experimente on-line (o rodapé se junta à lista por novas linhas, remova-o para ver a saída real da lista).
Explicação:
fonte
K4 , 41 bytes
Solução:
Explicação:
Não tenho certeza se estou faltando alguma coisa ... 0 índice, gira para cima (altere
1
para-1
para girar para baixo)fonte
Japt v2.0a0, 18 bytes
Baseado em 0 com entrada e saída como uma sequência de linhas múltiplas. Gira para cima 1.
Tem que haver um método mais curto!
Tente
fonte
6
, sua resposta ignoraria o espaço naline with
primeira e naRotate here
quarta linha, enquanto a maioria das outras respostas também giraria esse espaço.Gelatina , 16 bytes
Um link diádico que aceita uma lista de linhas (listas de caracteres que não contêm caracteres de nova linha) à esquerda e um número inteiro à direita que retorna uma lista de linhas.
Experimente online! (o rodapé divide-se em novas linhas, chama o link e junta-se por novas linhas novamente)
Quão?
fonte
perl 5 (
-p
), 75 bytesk é indexado em 0, gire para baixo
TIO
fonte
Perl 6 ,
3833 bytesModifica a matriz no local (as regras não proíbem)
Experimente online!
fonte
JavaScript (Node.js) , 52 bytes
Experimente online!
-7 bytes graças a Shaggy!
Ainda não encontrou uma resposta em JavaScript! Porta da minha resposta c #.
fonte
Carvão ,
342821 bytesExperimente online! Link é a versão detalhada do código. Toma uma matriz de seqüências de caracteres como entrada. Indexado a 0. Edit: Agora que
PeekDirection
foi corrigido, eu posso manipulá-lo diretamente. Explicação:Imprima as seqüências de entrada.
Salte para o topo da coluna a ser girada.
Extraia as células que foram impressas.
Substitua cada célula impressa pelo valor da célula anterior (ciclicamente). Convenientemente, os valores das células são lidos no momento da
PeekDirection
chamada, portanto, o fato de aMapCommand
chamada gravar novos valores nas células não importa.fonte
Pip
-rn
, 32 bytesIndexado em 0, gira para baixo. Experimente online!
Filtra para encontrar os índices de todas as linhas que são longas o suficiente para participar da rotação. Em seguida, circula essas linhas, trocando o caractere apropriado em cada linha por uma variável temp
s
. Visitar a primeira linha novamente no final troca novamente o valor fictício.fonte
Geléia , 19 bytes
Experimente online!
1 indexado. Gira para baixo. Um link monádico que leva uma lista preenchida à direita de seqüências de caracteres Jelly (uma lista de listas de caracteres) como o primeiro argumento ek como o segundo. Os espaços são proibidos na entrada, exceto como preenchimento à direita, mas todos os outros caracteres são permitidos.
Conforme implementado no TIO, o rodapé divide uma entrada de string única em uma lista de strings e a coloca com o botão direito, mas isso é por conveniência; Pelo que entendi, o resultado dessa etapa é permitido para a entrada do link principal de acordo com as regras.
fonte
GFortran , 199 bytes
-20 ou mais lendo stdin em vez de um arquivo
-14 usando números inteiros implícitos para
i, k, n
-4 removendo espaços e
::
Requer que o usuário insira
k
en
na primeira linha, ondek
está a coluna a girar en
é o número de linhas de texto. As entradas subsequentes são as linhas de texto a serem giradas. Foi uma pena escrever! Fortran é tão pedante!fonte
T-SQL, 195 bytes
Experimente a versão online não destruída
fonte