Introdução
Mais complexo que Um quadrado de texto, pois isso requer preenchimento e entrada tem tipo de dados desconhecido.
Todos os anos, a Dyalog Ltd. realiza uma competição estudantil. O desafio é escrever um bom código APL. Esta é uma edição de código-golfe independente de idioma do décimo problema deste ano.
Tenho permissão explícita para postar esse desafio aqui, do autor original da competição. Sinta-se livre para verificar, seguindo o link fornecido e entrando em contato com o autor.
Problema
Escreva um programa / função que remodelará uma determinada sequência de caracteres ou lista numérica no menor quadrado que conterá todos os elementos da entrada, preenchendo com elementos adicionais, se necessário. O elemento pad deve ser o elemento de preenchimento padrão para o tipo de dados fornecido ou qualquer elemento de sua escolha. Os elementos do quadrado devem estar na ordem em que o achatamento fornecerá a ordem original dos dados de entrada (com elementos de preenchimento à direita, se houver).
Casos de teste
[1,2,3,4]
→
[[1,2],
[3,4]]
[1,2,3,4,5]
→
[[1,2,3],
[4,5,0],
[0,0,0]]
"Dyalog APL"
→
[["Dyal"], [["D","y","a","l"],
["og A"], or ["o","g"," ","A"],
["PL "], ["P","L"," "," "],
[" "]] [" "," "," "," "]]
[100]
→
[[100]]
[]
→
o equivalente mais próximo do seu idioma a uma matriz vazia, por exemplo, []
ou[[]]
[1,2,3,4,'O']
, ou é garantido que isso não ocorrerá? 3. A ordem requerida após o achatamento está ignorando os elementos da almofada (por exemplo, poderia haver uma entrada de[1,2,3,4,5]
rendimento[[0,0,0],[0,1,2],[3,4,5]]
ou mesmo[[0,1,0],[2,0,3],[0,4,5]]
)?Respostas:
MATL ,
129 bytesEconomizou três bytes graças a Luis.
he
em vez deUGwewe
, mas adicionando umt
no começo.Experimente online!
Isso retorna os resultados, mas transpostos em comparação com o resultado na postagem dos OPs (o que é bom).
Explicação:
Isso funciona da mesma maneira para as entradas numéricas e de sequência, pois o MATL as trata da mesma maneira.
Suponha que a entrada seja
'Dyalog APL'
Isso não gera nada para entrada vazia, o que acontece como o MATL gera matrizes / strings vazias.
fonte
tnX^Xkt3$e
faz o trabalho tambémtnX^Xkthe
reshape
e não percebeu o óbvio:$: Specified inputs
. E eu não sabia que você poderia passar as dimensões como um vetor. Eu sabia que tinha que haver um caminho sem ter que passar por duas remodelações. Obrigado! :)JavaScript (ES7), 70 bytes
Retorna
[]
para uma matriz / string vazia. Usaundefined
como o valor de preenchimento. Para o ES6, substitua(...)**.5
porMath.sqrt(...)
(+5 bytes).fonte
Braquilog , 10 bytes
Experimente online!
Leva seqüências de caracteres como listas de caracteres (o solicitante confirmou que está tudo bem).
Isso é muito ineficiente em entradas mais longas, porque força bruta todas as possíveis remanejamentos da entrada, tentando progressivamente mais preenchimento, até encontrar uma que seja quadrada.
Explicação
Os elementos de preenchimento usados são o valor "qualquer valor" do Prolog
_
, que normalmente é renderizado como_G
mais alguns dígitos aleatórios na saída (para possibilitar que o mecanismo do Prolog expresse relacionamentos entre esses valores de uso geral).Aliás, houve uma correção de bug no SWI-Prolog apenas alguns dias atrás, que torna esse programa possível (embora ele ainda pareça funcionar em versões mais antigas e com erros); a restrição "é retangular" implícita
\
foi quebrada anteriormente, mas foi fixada a tempo para o desafio.fonte
Python 2 , 105 bytes
Experimente online!
fonte
PHP, 139 bytes
Cadeia de saída como matriz de caracteres 2D
trabalha com uma
[]
matriz vaziaExperimente online!
PHP, 143 bytes
precisa
[[]]
como matriz vaziaCadeia de saída como matriz de cadeia 1D
Experimente online!
fonte
Gelatina , 13 bytes
Um link monádico que pega uma lista simples e retorna uma lista de listas.
Conjunto de testes em Experimente online!
Quão?
Anexa quantos zeros (o elemento de preenchimento) houver elementos na entrada e, em seguida, redimensione para um quadrado, descartando qualquer excesso de zeros para os requisitos no processo.
fonte
R, 91 bytes
Por padrão, R apóia as matrizes reciclando elementos do vetor de entrada e codifica as matrizes na ordem principal da coluna. Retornará uma
0x0
matriz para uma entrada dedouble(0)
(uma matriz dupla vazia) ou''
.A primeira linha (a
if
declaração) divide uma string em um vetor de seus caracteres constituintes; se eu puder pegar esse vetor, essa linha poderá ser removida.Experimente online!
fonte
Bash ,
91776967 bytesExperimente online!
Formata texto, almofadas com espaços. Não produz nada para stdout na entrada vazia.
Atualização : roubou alguns truques das respostas aqui .
fonte
Haskell, 87 bytes
Experimente online!
O elemento de preenchimento é
error[]
o menor valor de qualquer tipo (undefined
é um pouco mais longo).Notas no link do TIO:
você não pode imprimir
error
, concatenar matrizes com elementos de preenchimento de volta a uma lista e imprimir seu comprimentoO TIO não possui
Data.Lists
, apenasData.List.Split
mostra mais 5 bytes.Como funciona: calcule o comprimento
c
da matriz c-por-c. Pegue os primeirosc
elementos da lista de pedaços de comprimentoc
da lista de entrada e, em seguida, uma lista de elementos de preenchimento com o mesmo tamanho da lista de entrada. Por exemplo :fonte
Dyalog APL,
2019 bytes-1 Byte graças a @ Adám!
Experimente online!
fonte
{(,⍨⍴⍵↑⍨×⍨)⌈.5*⍨≢⍵}