var QUESTION_ID=85255,OVERRIDE_USER=56179;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Respostas:
Pitão, 1 byte
Experimente aqui
Outra transposição incorporada
fonte
Python,
3629 byteszip(*s)
retorna uma lista de tuplas de cada caractere, transpostas.Experimente online
fonte
"cdmy", "aoaa", "rgny"
, que é uma lista["cdmy", "aoaa", "rgny"]
ou uma tupla("cdmy", "aoaa", "rgny")
map(''.join,zip(*s))
também trabalha para a conversão string (Python apenas 2), e para Python 3,[*map(''.join,zip(*s))]
afaik funcionamap(''.join,zip(*s))
é válido para Python 3 - por padrão, permitimos iteradores / geradores no lugar de listas.Geléia , 1 byte
Experimente online!
fonte
MATL , 1 byte
Experimente online!
Pega entrada implicitamente, transpõe, exibe saída implicitamente.
fonte
PowerShell v2 +,
6654 bytesEi ... não
map
, nãozip
, nãotranspose
, etc., então começamos a rolar. Grandes adereços para @DarthTwon para o golfe de 12 bytes.Recebe entrada
$n
, configura umfor
loop. A inicialização é definida$x
como0
, o teste é se ainda temos letras em nossa palavra$n[0][$x]
e incrementamos$x++
cada iteração.Dentro do loop, pegamos nossa matriz de strings e o canalizamos para um loop interno que cospe o caractere apropriado de cada palavra. Isso é encapsulado em a
-join
para formar uma sequência e essa sequência é deixada no pipeline. No final da execução, as seqüências de caracteres no pipeline são implicitamente impressas.fonte
,
vez de pensar na respostaparam($n)$x=0;while($n[0][$x]){-join($n|%{$_[$x]});$x++}
. E não há erros aqui: Dfor
loop para outros dois. ;-)while
ciclo. Bom trabalho, senhor!Vim,
3736 pressionamentos de teclaTodas as outras respostas são monótonas e usam componentes monótonos de um byte. Aqui está uma resposta hacky que faz a coisa toda manualmente, em algo que nem sequer é uma linguagem de programação:
Explicação:
Agora, está tudo bem, mas o buffer tem algum texto extra sobrando. Então devemos:
fonte
CJam,
65 bytesGuardado 1 byte graças a Luis Mendo.
Experimente online!
fonte
Pyke, 1 byte
Experimente aqui!
Transpor.
fonte
Retina ,
4543 bytesA contagem de bytes assume a codificação ISO 8859-1.
O avanço de linha principal é significativo. Entrada e saída são listas terminadas com avanço de linha de seqüências de caracteres ASCII imprimíveis (observe que ambos têm um único avanço de linha final).
Experimente online!
Eu sabia por um tempo que a transposição de blocos retangulares seria uma dor na Retina (enquanto a transposição de quadrados não é tão ruim), mas nunca realmente tentei. A primeira solução foi de fato de 110 bytes, mas após várias mudanças substanciais na abordagem, os 45 bytes resultantes não são tão ruins quanto eu suspeitava (mas ainda assim ...). A explicação seguirá amanhã.
Explicação
Etapa 1: Classificar
Isso faz o trabalho principal de reordenar os caracteres na entrada, mas acaba atrapalhando a separação em linhas. Curiosamente, se removermos o
|¶
, obteremos o código necessário para transpor uma entrada quadrada.Os estágios de classificação (indicados por
O
) funcionam assim: eles encontram todas as correspondências da regex especificada (a coisa após a`
) e, em seguida, classificam essas correspondências e as reinserem nos locais onde as correspondências foram encontradas. Por acaso, esse regex corresponde a todos os caracteres: feeds sem linha via.(?<=(.*))
alternativa e feeds de linha via¶
. Portanto, ele classifica todos os caracteres na entrada. A parte mais interessante é o que são classificados por .A
$
opção ativa um modo "ordenar por", em que cada partida é substituída pelo padrão de substituição na segunda linha, que é usada para comparar as partidas. Além disso, o#
informa ao Retina para converter o resultado da substituição em um número inteiro e comparar esses números inteiros (em vez de tratá-los como seqüências de caracteres).Então, finalmente, precisamos olhar para o regex e a substituição. Se a primeira alternativa corresponder (ou seja, correspondermos a qualquer caractere dentro de uma das linhas), o grupo
(?<=(.*))
capturará tudo até esse caractere nessa linha no grupo1
. O$.1
padrão de substituição substitui isso pelo comprimento do grupo1
. Portanto, o primeiro caractere em cada string se torna1
, o segundo se torna2
, o terceiro se torna3
e assim por diante. Agora deve ficar claro como isso transpõe uma entrada quadrada: todos os primeiros caracteres das linhas vêm primeiro e todos acabam na linha superior, depois todos os segundos caracteres terminam na segunda linha e assim por diante. Mas para essas entradas retangulares, também estamos combinando os feeds de linha. Desde grupo1
não é usado nesse caso, a substituição está vazia, mas para os fins da#
opção, isso é considerado0
. Isso significa que todos os feeds de linha são classificados para a frente.Portanto, agora temos os caracteres na primeira ordem (primeiro caractere de cada string, segundo caractere de cada string, etc.) e todos os feeds de linha no início.
Etapa 2: partida
Agora precisamos dividir os caracteres em linhas do tamanho correto. Esse comprimento corresponde ao número de linhas na entrada original, que corresponde ao número de feeds de linha que temos no início da string.
A divisão é feita aqui com a ajuda de um estágio de correspondência, que simplesmente encontra todas as correspondências do regex especificado e usa a
!
opção para imprimir essas correspondências (o padrão seria contá-las). Portanto, o objetivo da regex é corresponder uma linha por vez.Começamos "contando" o número com o lookback atrás
(?<=(¶)*.*)
. Ele gera uma captura em grupo1
para cada avanço de linha na frente.Então, para cada uma dessas capturas, combinamos um único caractere com
(?<-1>.)+
.fonte
código de máquina x86, 19 bytes
Em hexadecimal:
Entrada::
ECX
# de strings (n)EDX
,: comprimento individual de strings (m)ESI
,: array de strings de entrada,:EDI
buffer de saída que recebe o array de strings. Presume-se que a matriz seja definida comochar src[n][m+1]
para entrada echar dst[m][n+1]
saída, e todas as seqüências são terminadas em NULL.fonte
Braquilog , 5 bytes
Espera uma lista de strings como entrada, por exemplo
run_from_atom('z:ca.',["money":"taken":"trust"],Output).
Explicação
fonte
05AB1E, 3 bytes
Explicado
Experimente online
fonte
CJam , 3 bytes
Este é um bloco de código (equivalente a uma função; permitido por padrão ) que espera a entrada na pilha e deixa a saída na pilha.
Experimente online!
fonte
JavaScript ES6,
4846 bytesSinto-me deixado de fora, não temos nenhuma função zip integrada. Obrigado nicael por apontar meu erro de tipo.
Uso
retorna
fonte
[...a[0]].map
, já quea[0]
não é uma matriz..join
os para resolver esse problema.join``
em vez dejoin('')
salvar 2 bytes. Downvote retraídoUtilitários Bash + BSD, 27
E / S via cadeias separadas por nova linha STDIN / STDOUT.
Pode ser necessário instalar
rs
comsudo apt install rs
ou similar. Funciona imediatamente no OS X.A
-T
opção ders
fazer o trabalho pesado da transposição. O resto é apenas formatação:sed
comando simplesmente insere:
após cada caractere-c:
especifica que as colunas de entrada são:
separadas-g0
especifica que as colunas de saída têm separação de largura zeroSe minha leitura da página de
rs
manual estiver correta, o seguinte deverá funcionar com uma pontuação de 12, mas infelizmente não funciona - veja a nota abaixo:Exemplo de saída:
Se se espera que a entrada seja toda ASCII imprimível, ela
:
pode ser substituída por algum caractere não imprimível, por exemplo, 0x7BEL
.Nota
Queria entender por que não consegui
-E
trabalhar com a opção e me livrar dosed
pré - processamento. Encontrei ors
código fonte aqui . Como você pode ver, dar essa opção define oONEPERCHAR
sinalizador. No entanto, não há nada no código que realmente verifique o estado desse sinalizador. Então, acho que podemos dizer que, apesar do fato de essa opção estar documentada, ela não é implementada.De fato, esta opção está documentada na página de
rs
manual do Linux :mas não a versão do OS X.
fonte
PHP, 82 bytes
pega e retorna uma matriz de strings
demolir
exemplos
fonte
APL, 3 bytes
↑
pega as seqüências de entrada e as transforma em uma matriz de caracteres.⍉
transpõe a matriz.↓
divide novamente as linhas da matriz resultante em seqüências de caracteres.fonte
K, 1 byte
Experimente aqui!
Transpor
fonte
Mathematica, 26 bytes
Função anônima. Pega uma lista de cadeias como entrada e retorna uma lista de cadeias como saída. O caractere Unicode é U + F3C7, representando
\[Transpose]
. Trabalha convertendo para uma matriz de caracteres, transpondo e convertendo de volta para uma lista de cadeias. Se o formato de entrada / saída for esticado, uma simples transposição de 5 bytes funcionará:fonte
\[Transpose]
.ᵀ
?⍉
.MATLAB / oitava, 4 bytes
Isso define uma função anônima. O formato de entrada é
['car'; 'dog'; 'man'; 'yay']
.Experimente aqui .
fonte
f = @(x)x'
,f([{'abcd'},{'abcd'},{'abcd'}])
saídas ans = 'abcd' 'abcd' 'ABCD'f(['abcd';'abcd';'abcd'])
. Eu editei a resposta para especificar o formato de entradaHaskell, 41 bytes
Ou com um pouco mais de ar:
A segunda lista é a lista de palavras repetidas "o comprimento de uma palavra". Em cada lista de palavras, selecionamos a n-ésima letra de cada palavra, fornecendo o resultado.
fonte
words
eunwords
. Além disso,map(\_->l)(l!!0)
él<*l!!0
, então tudo se resume a\l->zipWith($)[map(!!n)|n<-[0..]]$l<$l!!0
.l<$l!!0
(primeira vez errada, segunda vez certa), mas você acertou mesmo assim.Lisp comum, 62 bytes
A
map
função usa um tipo de resultado (aquilist
), uma função f para aplicar e uma ou mais seqüências s1 , ..., sn . Todas as sequências são iteradas em paralelo. Para cada tupla de elementos (e1, ..., en) extraídos dessas seqüências, chamamos (f e1 ... en) e o resultado é acumulado em uma sequência do tipo desejado.Pegamos uma lista de strings, digamos
("car" "dog" "man" "yay")
, e usamosapply
para ligarmap
. Temos que fazer isso para que a lista de entrada seja usada como mais argumentos paramap
. Mais precisamente, isso:... é equivalente a:
E como strings são seqüências, iteramos em paralelo sobre todos os primeiros caracteres, depois todos os segundos caracteres, etc ... Por exemplo, a primeira iteração chama f da seguinte maneira:
O lambda anônimo pega a lista de argumentos dados e a força a voltar a uma string.
fonte
Perl, 91 bytes
Tão demorado ..
Experimente aqui!
fonte
Ruby, 46 bytes
Provavelmente, a primeira vez que "strings de Ruby não são enumeráveis" está realmente me mordendo muito, pois tive que mapear as strings em matrizes antes do processamento. (Normalmente, a necessidade de usar
String#chars
não é suficiente para a perda de bytes, mas como eu preciso mapeá-los, isso dói muito mais)fonte
Clojure, 68 bytes
Mapeia uma função que é apenas
reduce
(vai nos elementos da lista um por um e une o enésimo caractere da sequência) no intervalo de 0 a comprimento da primeira sequência.Veja on-line: https://ideone.com/pwhZ8e
fonte
C #, 53 bytes
C # lambda (
Func
) onde a saída éIList<string>
e a saída éIEnumerable<string>
. Não sei como funcionazip
em outro idioma, mas não consigo encontrar uma maneira de usar o c # aqui.Aggregate
atender bem a necessidade. Não há transposição em C #, existe uma no Excel, mas eu não a utilizarei.Experimente online!
fonte