EDIT Modifiquei a redação das regras para tornar algumas coisas implícitas mais explícitas. Também acrescentei alguma ênfase para esclarecer alguns pontos de aparente confusão e defini explicitamente a opção de criar um programa independente em vez de uma função.
O objetivo aqui é criar uma função que pega um arquivo de texto (ou string) e o transpõe para que as linhas se tornem colunas e vice-versa.
Exemplo:
Eu sou um texto Transponha-me. Consegues fazê-lo?
Resulta em:
ITC ra aan mn sy apo ou ts eed xo tm .ei .t ?
As regras:
- Você está autorizado a assumir que os únicos caracteres em branco utilizados são
" "
e"\n"
e que não há nenhum espaço em branco à direita em qualquer linha. - Você pode assumir que o arquivo é ASCII. O marcador da linha final que você deseja usar depende de você (CRLF ou LF). Ele deve funcionar corretamente no exemplo, mas também deve funcionar em qualquer entrada que satisfaça as suposições acima.
- Pode ser necessário inserir espaços (como no exemplo) onde não havia nenhum para manter as colunas alinhadas.
- Seu resultado não deve ter espaços em branco à direita em nenhuma linha .
- O caractere de nova linha final (para a última linha) é opcional.
- Deve ser uma função ou um programa completo. Se sua função aceitar uma string, ela deverá retornar os resultados como uma string. Se ele aceitar um nome de arquivo, você retornará o nome do arquivo em que salvou o resultado. Além disso, você pode escrever um programa completo que aceite a entrada STDIN e produz o resultado correto para STDOUT; se você fizer isso, você deve não saída qualquer coisa para STDERR.
- O procedimento mais curto vence, mas vou votar de qualquer resposta que eu quiser.
Com base nas regras, a saída no exemplo tem 53 ou 52 bytes de comprimento (para novas linhas LF), dependendo se a nova linha final está incluída ou não.
Nota: Não é um requisito específico, mas se sua função, quando executada duas vezes sucessivas, não for idêntica à original (a nova linha final pode ser diferente e todas as linhas vazias no final do arquivo serão excluídas), você será excluído. provavelmente quebrando uma das regras.
Respostas:
Japonês , 6 bytes
Experimente
Executar duas vezes - retorna a string original
Explicação
Transponha a entrada
Mapa sobre cada linha
Aparar à direita
fonte
J (
3140)Esta é uma função que pega uma string e retorna uma string (ou seja, um vetor de caractere com alimentações de linha inseridas nos lugares certos, e não uma matriz).
Editar: nenhum espaço em branco à direita em nenhuma linha.
Teste:
fonte
?\n
.cut
oudlb
por padrão e escrevê-los eu mesmo usa vários caracteres, mesmo no APL.Ruby 111
Golfe:
Ungolfed:
O Ruby possui uma função de transposição de matriz, portanto, isso simplesmente preenche as linhas, as transforma em uma matriz de caracteres, usa a função de transposição # Array do Ruby e transforma a matriz de caracteres novamente em linhas.
Para jogar golfe, bastava usar identificadores de um caractere, remover espaços, usar um temporário para text.lines e colocar o cálculo para max_length inline (não há pontos de eficiência).
fonte
"\n"
por?\n
..to_a
é supérfluo. Você pode ganhar mais 5 caracteres lá.R, 171
Exemplo de uso:
O espaço em branco à direita é removido.
fonte
Python 2.7 (
97799490)EDIT: Perdeu o requisito de função;
Tenho certeza de que isso será melhorado, já que sou um iniciante aqui, mas para começar;
O código usa um simples
split
para dividir a string em um vetor de linhas. Em seguida, ele usamap
com um valor de função comoNone
(a função de unidade) e o operador splat para transpor e preencher o vetor (funcionalidade semelhante àzip_longest
do Python3)O restante do código apenas mapeia
None
para o espaço, apara e remonta a matriz em uma única sequência novamente.fonte
map
. Eu continuo procurando um lugar para usar isso ... e você acabou de me derrotar. ;)Bash + coreutils + sed, 83
fold
epaste
faça o trabalho importante. O resto é apenas formatação.Aceita entrada de stdin e saídas para stdout:
fonte
C (278 bytes)
Editar: Isso realmente quebra as regras, pois leva um nome de arquivo como argumento, mas grava no stdout. Vou editá-lo mais tarde para gravar em um arquivo e depois imprimir o nome do arquivo em stdout.
Este é o meu primeiro código de golfe, então tenha piedade. Algum C. simples e antigo Coloque a entrada
test.txt
e deixe-a funcionar!clang transpose.c -o transpose && ./transpose test.txt
Ao usar nomes curtos de variáveis, remover a formatação gratuita e permitir que os identificadores de arquivo vazem e desativar todos os avisos, isso é reduzido para 278 bytes. (Como isso usa importações implícitas, pode não ser vinculado corretamente em todos os sistemas. Funciona na minha máquina!)
fonte
int
para encurtar algumas de suas declarações, ou isso é ilegal agora?A,B,D,I,J,*F
como variáveis globais, para evitar aint
palavra-chave. Da mesma forma, você pode removerint
damain
declaração e doC
argumento. EmC
,int
é opcional em muitos lugares.AutoHotkey 210
Teste
fonte
Ruby: 88 caracteres
(Publicado porque é mais curto que as outras soluções Ruby. Não foi verificado se meu código introduz algo novo em comparação com os outros. Se você já publicou uma solução Ruby e acha que essa é principalmente uma cópia sua, por favor, comente e retirarei minha resposta. )
Exemplo de execução:
fonte
Bash, 124 bytes
Ele lê a entrada padrão e grava a saída padrão. Tente:
Como funciona:
split
entrada em linhas únicas (arquivos no diretório temporário$D
)grep
(arquivos * +)paste
(colunas separadas por TAB)sed
Editar:
;rm -r $D
(obrigado Tim)+
vez de_
como sufixo e reduza${F}_
para$F+
L
dos arquivos de resultados divididosfonte
rm
contagem de caracteres.Ruby - 144 caracteres
Aqui está minha primeira tentativa, jogando golfe:
Para saída, execute
puts f text
ondetext
houver qualquer sequência de várias linhas aderindo às regras acima. A versão ungolfed está abaixo:Para uma solução semelhante, mas finalmente melhor, em Ruby, confira o código de Wayne Conrad acima.
fonte
transpose
sua resposta antes de escrever a minha. Não me parece muito kosher reescrever sua resposta, apenas um pouco melhor. :transpose
, é possível que uma solução Ruby melhor não tivesse surgido. Uma das coisas que mais amo na programação é a disposição de colaborar e polinizar idéias. Até nos encontrarmos novamente, gentil senhor. Felicidades!PHP 194
Não-golfe:
Esta é a minha primeira tentativa de golfe, por favor, seja gentil! Além disso, dicas / sugestões serão muito apreciadas!
fonte
"
s ao redor"trim"
. O php dará um aviso, mas funciona muito bem.@
para suprimir avisos.MATHEMATICA 117 chars
fonte
f
! .. tks #Perl (92 + 1)
lê stdin e escreve para stdout. adicionando 1 à pontuação de
say
fonte
CJam,
3225 bytesO CJam é mais recente que esse desafio, portanto, essa resposta não é elegível para ser aceita.
Consideravelmente reduzido pelo user23013.
Teste aqui.
fonte
Javascript, 103
Menos golfe
Teste
fonte
Retina , 40 bytes
Experimente online!
Baseado neste programa que eu criei para transpor qualquer tamanho de retângulo, que usa a sugestão de Leo para transpor um retângulo de tamanho conhecido.
Editar: Jogou mais golfe e não tem mais espaços nas linhas.
fonte
Perl 5 , 25 bytes
Observe que isso usa seqüências de escape ANSI e, como tal, não funciona no TIO, você pode vê-lo em ação aqui .
Explicação
Esse código primeiro altera o valor do separador de lista (
$"
) para uma guia vertical, seguido pela sequência de escape ANSI para 'voltar 1 coluna' (\x1b[1D
), depois definimos a variável impressa implicitamente$_
como uma sequência que começa com a sequência de escape ANSI para 'iniciar a impressão na coluna da linha 1$.
(onde$.
está a linha de texto atual)' (\x1b1;$.H
) e interpola a lista@F
(que é uma lista de todos os caracteres nessa linha, preenchida por divisão automática (-a
) com um padrão de divisão vazio (-F
)) que coloca o conteúdo$"
entre cada item, movendo o cursor verticalmente para baixo em vez de continuar a saída após o caractere anterior.Experimente online!
fonte
C ++ (243 caracteres)
Aqui está uma função que pega e retorna uma string.
Eu poderia ter barbeado uma dúzia de caracteres, mas decidi mantê-lo como um código não estúpido (corre rápido, lê bem). Talvez eu só tenha decidido fazer isso porque este é o meu primeiro código de golfe ... Ainda não sou suficientemente hardcore :)
Com formatação:
fonte
using namespace std;
.using namespace std;
deveria ser adicionado à contagem de caracteres.Python 2.7 - 115 caracteres :
oneliner:
e em uma impressão mais limpa:
em 115 caracteres:
fonte
\n
é considerado porlen
ser um único caractere, mas é duas :)\n
é um. Então eu digo que está tudo bem.len("\n")
mostrará 1, embora certamente haja 2 caracteres separados no código fonte. Salvando a fonte para um arquivo faráls
exibição 116. Basta dizer quelen
não é a melhor maneira de medir o tamanho do código devido a escapar caracteres que está sendo processado antes de medir :)GolfScript, 51 caracteres
Esta é uma primeira tentativa; Eu suspeito que pode ser melhorado. A maior parte do código é para atender aos requisitos de remoção de preenchimento e espaço à direita - sem eles,
n%zip n*
seria suficiente.Ps. A seguinte versão de 46 caracteres fará o trabalho para a entrada de amostra fornecida, mas falhará se qualquer coluna de entrada consistir inteiramente em espaços:
Presumo que isso seja suficiente para desqualificá-lo, mesmo que o desafio não o diga explicitamente.
fonte
Esquema / raquete 113
O texto:
Sem novas linhas e espaços em branco extras:
A versão amigável
fonte
Haskell
Era tão curto, eu precisava adicionar espaço em branco ...
fonte
I am a text..?
Transpose met
Can you do i
.Python
89103 caracteresEu me sinto sujo.
90104 caracteres para a versão de força industrial. : ^)fonte
Mathematica, 95 caracteres
fonte
K, 56
Isso deve atender às especificações agora.
Aceita uma string, retorna uma string.
.
fonte
{`/:x@'/:!max@#:'x:`\:x}
para 26.Groovy, 98 caracteres
conectados
ungolfed:
fonte
Pitão , 11 bytes
Experimente online!
Recebe a entrada como uma string, gera uma lista de listas
Pitão , 25 bytes
Pega a entrada como uma sequência, gera uma sequência.
Experimente online!
fonte
J,
2826 bytesEconomizou 2 bytes graças a frownyfrog
Pega uma string, retorna uma string. Não tenho certeza se existe uma versão mais curta do verbo da
função'cutopen' que eu poderia usar.Há também o menor
Mas não tenho certeza se ele se enquadra nas diretrizes do OP, pois retorna uma matriz de caracteres.
Como funciona:
A outra versão funciona da mesma maneira, mas não converte a matriz transposta em uma sequência formatada corretamente.
Exemplos:
fonte
cutLF
.0|:>@cutLF
Lua ,
203189 bytesExperimente online!
Eu vi outra solução Lua aqui, mas não acho que haja um problema ao postar 2 soluções no mesmo idioma. Se houver, me diga :)
fonte