Na linguagem de programação esotérica Curly, os programas consistem apenas de chaves {}
e ponto e vírgula ;
. Apesar desse humilde conjunto de ferramentas, o Curly possui literais que podem representar qualquer número inteiro não negativo. No entanto, o formato é um pouco difícil para os não iniciados, então vamos escrever um código para fazer a conversão para nós.
Formato dos números
Os números encaracolados são estruturados de acordo com as seguintes regras:
- Adicionar um ponto e vírgula adiciona um ao número.
- Um número entre chaves é multiplicado por quatro.
- Os grupos de chaves podem ser aninhados, mas não concatenados. O aparelho deve corresponder corretamente.
- Ponto e vírgula fora de um conjunto de chaves deve vir depois, não antes.
- Para evitar ambiguidade na análise, um número deve sempre começar com uma chave.
Alguns exemplos:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(Observe que a regra 5 significa que os números de 0 a 3 devem começar com um par vazio de chaves.)
E alguns exemplos inválidos:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
Aqui está uma gramática BNF para números encaracolados:
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
Números como {;;;;}
(mais de três pontos e vírgulas seguidas) ou {{};}
(grupos de chaves vazias desnecessários) são chamados de números Curly incorretos . Eles obedecem à gramática acima e podem ser avaliados da maneira usual, mas também são capazes de representações mais curtas (para os exemplos acima {{;}}
e {;}
respectivamente).
O desafio
Escreva um programa ou função que insira / receba uma string. Se a string for um número inteiro decimal não negativo, produza / retorne a representação Curly apropriada (ou seja, a mais curta possível) para esse número inteiro. Se a sequência for um número Curly, produza / retorne sua representação decimal.
A entrada pode ser recebida via STDIN, argumento de linha de comando ou parâmetro de função. Ele deve ser uma string; ou seja, você não pode escrever uma função que aceite seqüências de caracteres para números encaracolados, mas números inteiros para números decimais.
A saída pode ser impressa em STDOUT ou retornada da função. Uma função pode retornar um número inteiro quando apropriado ou retornar seqüências de caracteres em todas as situações.
Seu programa não tem que lidar com má entrada (números Curly que quebram as regras de formatação, números de ponto flutuante, inteiros negativos, texto aleatório), e é não necessário para lidar com números Curly impróprias (mas veja abaixo). A entrada consistirá apenas em caracteres ASCII imprimíveis.
Pontuação
O código mais curto em bytes vence. Se o seu programa pode fazer ambos do seguinte:
- lidar corretamente com números Curly incorretos e
- quando receber um número encaracolado, ignore os caracteres extras que não sejam
{};
subtraia 10% da sua pontuação. (A entrada inteira nunca terá caracteres estranhos, mesmo para o bônus.)
Casos de teste
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
Para o bônus:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
Nota: O Curly ainda não está implementado. Mas se essa pergunta for bem, posso desenvolvê-la ainda mais.
fonte
Respostas:
Pitão,
3532 bytes - 10% = 28,8Experimente on-line: Demonstration or Test Suite
editar: como se viu, acidentalmente também posso lidar com números encaracolados impróprios. Não foi planejado. ;-)
Explicação:
Existem duas expressões no código. O primeiro converte um número em um número encaracolado e o segundo converte um número encaracolado em um número regular.
.x
identificadores, cuja expressão é impressa. Ele tentará imprimir a primeira expressão. Se houver algum dígito na entrada, a primeira expressão falhará (via Exceção)..x
captura a exceção e imprime a segunda.fonte
.[Z2
necessário.CJam,
51474441 bytesExperimente online: exemplo de execução | suíte de teste
Como funciona
fonte
Python 2, 167 bytes - 10% = 150,3
Nesta implementação,
c
é a função que satisfaz os requisitos. Ele retorna uma string se receber um número inteiro não negativo como entrada ou um número inteiro se receber um número não especificado como entrada.fonte
Python 266 bytes - 10% =
1268,1326,7239,4 bytesBoy não sou um golfista código ainda = /, mas que 10% ajudou -me um monte quando a minha pontuação ainda mais de 1000 era!
Eu tenho uma versão totalmente detalhada (e detalhada) desse código aqui. Ele reconhecerá a validade dos números curvos e fornecerá uma interface em loop para inserir números para teste.
(Comentários apenas para esclarecimentos)
Veja este código em ação
Agradecimentos a Erik Konstantopoulos por uma grande redução de bytes! Você poderia dizer ... ele realmente tirou um ... byte ... do meu código ... * eu mesmo *
fonte
print
instruções não necessárias e um comentário, seus nomes de variáveis são muito longos e alguns espaços em branco podem ser eliminados. Também recomendo a leitura de dicas para jogar golfe em Pyrhon .value
parav
etc), 3) faça coisas inteligentes no golfe : esse é o ponto em que você precisa ver o link de Dennis. Estou curioso para ver o quanto você pode reduzir isso!CJam,
87 bytes80,1 pontos (89 bytes - bônus de 10%)Atualize a versão que se qualifica para o bônus enquanto aumenta 2 bytes:
Experimente online
Primeira vez que usei recursão no CJam! A coisa toda pode parecer meio demorada, mas as duas conversões completamente separadas se somam.
Usei um caso completamente separado para converter números menores que 4 em Curly. Provavelmente é possível evitar isso, mas dobrar o tratamento especial de caso na função recursiva não seria totalmente trivial. E adicionar o extra
{}
como uma etapa de pós-processamento não parecia realmente melhor, embora eu devesse tentar novamente se for um pouco mais curto.fonte
C #, 173 - 10% = 155,7
171,0, 177,3Isso faz nenhuma validação e só procura
;
e}
personagens. Ele assume que todos os{
caracteres vêm antes de qualquer;
caractere. A coisa mais difícil que encontrei foi não inserir um{}
no meio de um número Curly.Quebras de linha e recuos para maior clareza:
fonte
Java 326 bytes - 10% = 294 bytes
É um programa completo escrito em java,
Tenho certeza que pode ser muito mais curto, mas agora não posso ter muito tempo para otimizá-lo
fonte
public
classe antespublic static void main(String[]c){
porstatic{
GNU sed,
330326 - 10% = 293,4(Eu adicionei um para o uso de
-r
antes de reivindicar o bônus de 10%; espero que esteja correto)A versão completa mostra que a maioria dos itens acima é conversão entre decimal e unário:
fonte
Perl,
183177Esta pode não ser a resposta Perl mais curta, mas acho interessante o suficiente postar (entrada
$_
, saída como valor de retorno):sub f{if(/}/){s/[{}]/00/g;oct'0b'.s/00(;+)/sprintf'%02b',length$1/ger}else{$_=sprintf'%064b',$_;s/../oct"0b$&"/ge;s/^0+(?!$)//;$_='{'x length.$_;s/\d/'}'.';'x$&/ge;s/\Q{{}/{/r}}
Observamos que Curly é simplesmente uma notação quaternária (base-4). Estamos um pouco prejudicados pela falta de suporte nativo de Perl ao quaternário, mas, felizmente, cada quaternit tem dois bits em binário, e podemos ler e escrever em binário. Portanto, temos o seguinte:
Versão expandida
fonte
JavaScript (ES6), 95 (105-10%)
Teste a execução do snippet abaixo
fonte
Rubi,
126,9129,6 (144 - 10%)Usa recursão para converter decimal em forma ondulada. A remoção da verificação por ignorar caracteres fora de
/[;{}]/
aumenta a pontuação0.4
no momento.fonte
Perl 5, 154 (
185170 Bytes - 10% + 1 penalidade)Regex e eval resolvem os curlies.
A geração dos curlies é feita de maneira diferente.
Teste
O arquivo de teste contém também os casos de bônus
fonte
Retina ,
6964 bytesExperimente o Conjunto de Testes
Explicação
Decomponha as chaves mais internas para apenas
;
s. Faça um loop até não ter mais aparelhos.Converter entre decimal e unário
;
Encontre a execução mais longa de
;
um múltiplo de 4 e aninhe-a entre chaves, faça um loop até que não exista mais execuções de 4+.Se o número encaracolado resultante começar com
;
ou for uma string vazia, adicione{}
na frente.fonte
Python 2 , 157 bytes -10% = 141,3
Experimente online!
Uma resposta Python 2 mais eficiente que lida com os casos de bônus. Não queria necro posts mortos com isso como um comentário, então aqui está.
Funciona de dentro para dentro em números ondulados, adicionando 4 ^ (o número de colchetes finais deixados na cadeia) à soma de cada ponto e vírgula encontrado. Se a sequência for um número, ela cria recursivamente o número encaracolado da mesma maneira que a gramática fornecida.
fonte