Pyth é talvez a linguagem de golfe de uso geral mais bem-sucedida. Embora esteja em declínio como resultado de idiomas mais recentes, de 2014 a 2016, a sintaxe concisa do Pyth, atualizações constantes, sobrecarga e (para a época) muitos componentes internos o tornaram o favorito para a maioria das perguntas.
O código Pyth geralmente é difícil de ler. Até a saída do modo de depuração (Python transpilado) geralmente consiste em uma linha longa, às vezes com parênteses aninhados com dez profundidade. No entanto, Pyth corretamente formatado é muito legível.
Aqui está um pedaço do código Pyth, escrito por @isaacg em Play the Word Chain .
.MlZfqhMtTeMPT+Lzs.pMyQ
É muito mais legível assim.
.M Filter by gives-maximal-value of
l Z lambda Z:length(Z) over
f filter by (lambda T:
q equal
hM t T head-map tail T
eM P T end-map Pop T)
+L Append z to each element in
z
s .pM y Q flattened permutations of each subset of Q
Para esse desafio, eliminamos o aspecto da complexidade kolmogorov da categorização de caracteres Pyth e focamos na formatação. Em vez de ser um código Pyth, a entrada será composta por caracteres 0123456789M
. O dígito n
representa uma função da aridade n
e M
representa um operador. Por exemplo, o código acima é representado como 210221M101M102M011M10
. Aqui estão as etapas para desinstalar:
Separe a sequência em tokens.
Um token corresponde [0-9]M*
. 0M
não ocorrerá na entrada.
Adicione 0s à direita.
Quando não há argumentos suficientes, Pyth anexa ao código tantas variáveis implícitas (variáveis lambda ou Q
s) necessárias para preencher os argumentos do programa; estes devem ser representados por 0
s.
Agrupe tokens em linhas.
A aridade de um token é o valor do seu dígito.
Um token arity-0 (ou seja, um 0) termina uma linha.
Para um token arity-1, o próximo token deve seguir a mesma linha, separado por um espaço.
Para um token de arity> = 2, seus argumentos seguem em linhas separadas, na ordem em que aparecem no código, cada um seguido por seus próprios subargumentos e assim por diante. Os argumentos para um token são recuados até o final desse token mais um espaço.
Entrada
Uma cadeia não vazia (ou matriz de caracteres, matriz de cadeias de comprimento 1, etc. conforme permitido pelos Métodos de E / S padrão) consistindo em 0123456789M
, que não conterá a substring 0M
.
Resultado
A sequência formatada de acordo com as regras acima.
Casos de teste
210221M101M102M011M10
2
1 0
2
2
1M 1 0
1M 1 0
2M
0
1 1M 1 0
123M4M
1 2
3M
4M
0
0
0
0
0
0
0
2MM
2MM
0
0
11011100
1 1 0
1 1 1 0
0
9000000
9
0
0
0
0
0
0
0
0
0
210221M101M102M011M10
seria[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
s pudessem ter um tipo de dados diferente dos números inteiros.M
?Respostas:
JavaScript (ES8),
160159 bytesExperimente online!
Comentado
fonte
Haskell ,
192190187 bytesExperimente online!
Tem que haver uma maneira melhor de lidar com o caso arity-1, que atualmente ocupa 45 bytes.
Editar% s:
pred
vez den-1
.Experimente online!
fonte
Carvão , 75 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Passe os caracteres de entrada e os transforme em uma lista de dígitos com
M
sufixos opcionais .Inverta esta lista para que possamos
Pop
consumi-la.Essa variável é uma pilha de tokens cuja aridade ainda não foi cumprida.
Essa variável é uma pilha da aridade restante dos tokens não preenchidos.
Repita até consumirmos todos os tokens e esvaziarmos a pilha.
Obtenha o próximo token ou
0
se não houver.Imprima o token e, em seguida, mova o cursor horizontalmente se ele começar na
1
diagonal.Adicione o token e sua aridade às variáveis apropriadas.
Repita enquanto a pilha de arity não estiver vazia, mas a arity superior for zero.
Descarte a aridade zero.
Remova o token e mova o número de caracteres restantes.
Se houver alguma aridade restante, diminua a aridade superior.
fonte