Quando se trata de comer doces, eu me mantenho em padrões mais elevados do que o típico leigo. Há um delicado equilíbrio entre "misturar tudo" e "guardar o melhor para o final".
Neste desafio, você receberá uma série de caracteres nos quais cada personagem representa um pedaço de doce. Caracteres diferentes (diferenciam maiúsculas de minúsculas) representam diferentes tipos de doces. Seu programa deve determinar a ordem correta do consumo de doces, com base no procedimento abaixo. Você pode gravar um programa completo (STDIN / STDOUT) ou uma função nomeada para realizar esta tarefa.
Digamos que meu estoque de doces é oroybgrbbyrorypoprr
. Primeiro, eu ordeno o doce em pilhas do mesmo tipo, com quantidades maiores no topo, usando valores mais baixos de caracteres ASCII como desempate.
rrrrrr
oooo
bbb
yyy
pp
g
Então, pego cada fileira de doces e espaço-as igualmente ao longo de um intervalo. Por exemplo, se houver 3 pedaços de doce, um será colocado 1/3 do caminho, 2/3 do caminho e no final.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
Então, desço cada coluna para criar meu pedido final de doces rorbyroprbyorrobypg
,.
Entrada
Uma corda que contém o estoque de doces. A entrada para o exemplo acima poderia ter sido:
oroybgrbbyrorypoprr
Saída
Uma sequência contendo o doce reorganizada na ordem correta de consumo.
rorbyroprbyorrobypg
Pontuação
Isso é código de golfe. A resposta mais curta em bytes vence. Aplicam-se as regras padrão de código de golfe.
Respostas:
CJam,
78 68 61 45 42 39 3130 bytesToma a string de entrada via STDIN
Inspirado pela abordagem recursiva, mas um pouco diferente. Não há necessidade de transpor ou retângulo!
Como funciona:
(Infelizmente, o CJam não pode mais concluir o Pyth devido à necessidade de tanto inchaço quanto sintaxe)
Experimente aqui
fonte
{_@_@{_@\%}h;/*}
por:
.Pyth , 25
Usa um algoritmo totalmente novo, inspirado nesta resposta .
Passo a passo:
Primeiro, classificamos os caracteres por sua comunhão, laços quebrados alfabeticamente. Isto é
o_/zZSz
.o
é o mesmo que o de Pythonsorted(<stuff>,key=<stuff>)
, com uma expressão lambda para a chave, exceto que a mantém como uma string.Em seguida, geramos uma lista dos prefixos dessa cadeia, do comprimento
len(z)
ao comprimento 1.>
é equivalente ao do python<stuff>[<int>:]
.Em seguida, reordenamos essa lista de sequências de prefixos pela localização fracionária, sendo 0 a aresta esquerda e 1 a direita, do primeiro caractere do prefixo no layout retangular visto na pergunta.
/NhN
conta quantas vezes o primeiro caractere no prefixo ocorre no prefixo, enquanto/zhN
fornece o número de ocorrências do primeiro caractere no prefixo na cadeia como um buraco. Isso atribui a cada prefixo liderado por cada caractere em um grupo uma fração diferente, da1/k
ocorrência mais à direita desse caractere àk/k
da esquerda. Reordenar a lista de prefixos por esse número fornece a posição apropriada no layout. Os laços são quebrados usando a ordem anterior, que era primeiro por contagem e depois alfabética, conforme desejado.Finalmente, precisamos extrair o primeiro caractere de cada sequência de prefixos, combiná-los em uma única sequência e imprimi-los. Extrair os primeiros caracteres é
hC
.C
realiza uma transposição de matriz na lista,zip(*x)
na verdade no Python 3.h
extrai a primeira linha da matriz resultante. Essa é realmente a única linha, porque a presença do prefixo de 1 caractere impede a formação de outras linhas completas.s
soma os caracteres nesta tupla em uma única sequência. A impressão está implícita.Teste:
Partes incrementais do programa em
oroybgrbbyrorypoprr
:Resposta antiga:
Pyth , 34
Este programa funciona calculando quantas vezes replicar uma certa sublist. A sub-lista é semelhante
['', '', '', '', ... , 'r']
. O comprimento total desta sub-lista é o produto do número de ocorrências de todos os outros doces, o que éu*G/zHS{-zd1
. A sub-lista completa é construída replicando a lista da cadeia vazia,]k
muitas vezes, removendo o elementot
e adicionando o nome do doce ao final+d
.Em seguida, essa sub-lista é replicada quantas vezes esse doce for encontrado na entrada
/zd
, garantindo que a lista de cada doce tenha o mesmo comprimento.Agora, com essa função mapeada sobre todos os doces únicos na ordem classificada adequada (
o_/zNS{z
), temos um retângulo semelhante ao da declaração da pergunta, mas com cadeias vazias em vez de pontos. Fazer uma matriz transpose (C
) seguida de dois somatórios (ss
) fornece a sequência final.Verificação:
fonte
Perl 5-62
Código 61 + 1 sinalizador.
Primeiro divida a entrada na matriz de caracteres -
/./g
.Adicione índice de ocorrência a cada letra, deixando as contagens nas variáveis
$a
..$z
commap++$$_.$_
. Agora a matriz é:Em seguida, converta-o em uma chave de classificação concatenando: razão
$_/$$1
, desempate de contagem~$_
e desempate de valor ASCII$_
. Isso resultará em (aqui com espaços adicionais para maior clareza).Isso pode ser classificado com ordem lexicográfica (padrão). No final, extraia o último caractere e imprima:
print map/(.$)/
fonte
Python 3.x - 124 bytes
fonte
Mathematica,
123119118 bytesDefine uma função nomeada
f
. Ungolfed:Usar tipos racionais embutidos parecia uma boa ideia para isso. Claro, isso não está nem perto de CJam. Basicamente, estou representando a grade mostrada no desafio como uma lista de pares. A primeira coisa no par é o código do caractere, a segunda é a posição como uma fração menor ou igual a 1 (a coluna final é 1). Tendo me assegurado de que os caracteres individuais já estejam na ordem correta, só preciso classificar isso de forma estável pela referida fração para obter o resultado desejado.
fonte
Pitão 45
47 48 51Isso também certamente poderia ser ainda mais jogado;)
Funciona criando uma lista de listas, onde cada lista interna é uma linha de cadeias vazias e o nome do doce. Essa lista é transposta e as listas internas são unidas, seguidas por essas listas.
Obrigado @isaacg por me lembrar da soma!
fonte
s
em uma lista de strings funciona comoj""
.APL: 38
Explicação:
Pode ser testado em tryapl.org
fonte
R - 166 caracteres
versão ungolfed
Explicação:
order
é estável na classificação, portanto, manterá a ordem de nomeação mais frequente / lexical quando um empate no índice, particularmente importante com os últimos doces)A natureza da matriz do problema me fez pensar que R poderia ter uma chance disso, mas a melhor interpretação literal do algoritmo que eu pude fazer foi de 211 caracteres:
ungolfed:
fonte
Pitão, 29 bytes
Esta é uma tradução direta do meu CJam answe r em Pyth
Experimente online aqui
Há uma história bastante longa por trás dessa solução e o @isaacg me ajudou muito na compreensão desse novo idioma.
Idealmente, esta é a tradução exata palavra a palavra do meu código CJam ( 17 bytes ):
que significa:
Mas, infelizmente, o Python não retorna nada em uma
+=
chamada, de modo que não era um código Python válido, portanto, um código Pyth inválido também como no Pyth, um lambda pode ser apenas uma declaração de retorno.Depois, examinei vários métodos e finalmente descobri que o Python
list.append
retorna umNone
valor que eu posso usar. Tornando o código ( 19 bytes ):que significa:
Mas, infelizmente, o suporte de
a
(append) foi removido do Pyth e a versão que possui o suporte, não tem suporteo
.Atualização: o
a
suporte foi adicionado novamente no Pyth agora, para que o código de 19 bytes acima funcione no compilador online. Mas como esse é um novo recurso que foi adicionado após o OP, não o coloco como minha pontuação e deixo o código de 29 bytes como minha solução.Portanto, eu tive que confiar no Python bruto, nesse caso, tornando o código
fonte