O Cubically é muito tedioso para escrever manualmente qualquer código. Seu desafio é traduzir o texto ASCII no código-fonte do Cubically.
Cubicamente
Este é apenas um rápido resumo do Cubically; o repositório tem um guia e detalhes mais completos.
Cubicamente é um esolang que escrevi há algum tempo, projetado para ser doloroso de usar. Ele contém dois pedaços de memória, um cubo de Rubik 3x3x3 e um registro chamado "bloco de notas".
Memória
O Cubo de Rubik interno é inicializado assim:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
Depois de executar uma rotação de 90 ° no sentido horário na face direita, o cubo de memória ficaria assim:
002
002
002
111225333044
111225333044
111225333044
554
554
554
Comandos
Um caractere não inteiro define o comando padrão. Para cada número inteiro antes que o comando padrão seja definido novamente, o comando é executado com esse número inteiro. Por exemplo, x524y312
executaria o comando x
com 5, depois com 2, depois com 4, depois executaria o comando y
com 3, depois com 1 e depois com 2.
Os números inteiros que os comandos usam representam índices de face. Então, x0
teria desempenho x
na face UP (indexada 0). x1
executaria x
na face ESQUERDA (indexada 1) e assim por diante.
Executar qualquer comando com 6
executará esse comando no valor do bloco de notas. Executar qualquer comando com um número inteiro acima de 6 resultará em um erro.
Aqui estão alguns comandos de exemplo:
R1
- gire a face DIREITA no sentido horário 90 ° para que o cubo interno pareça com o segundo exemplo acimaR11
- gire a face DIREITA no sentido horário 90 ° duas vezes, idêntico aoR2
+0
- adicione todos os valores da face UP ao bloco de notas+000
- adicione todos os valores da face UP ao bloco de notas três vezes@6
- imprime o rosto inexistente do sexto índice (memória) como um caractere%4
- imprime a soma de todos os valores na face BACK como um número inteiro
Uma lista completa de comandos e sintaxe está disponível no repositório .
Desafio
Você pegará o texto ASCII como entrada e imprimirá um programa Cubically como saída.
Exemplos (roubados daqui e aqui ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
Regras
- Seu programa não pode conter um dicionário contendo as traduções para as 100 caixas de teste.
- Seu programa deve terminar em menos de 180 segundos (nenhum programa de força bruta que leva semanas).
- Seu programa deve gerar um código Cubically válido que termine em menos de 180 segundos.
- Seu programa receberá entrada por entrada padrão, a menos que você queira mexer com o driver de teste.
- Seu programa deve gerar um código cubicamente que não produza nada além da entrada do seu programa quando executado. ಠ_ಠ
Pontuação
Você testará seu programa com 100 seqüências pseudo-aleatórias de comprimento pseudo-aleatório. (É fornecido um script bash que fará isso por você.) Veja como você pontuará:
- Deixe o comprimento do programa de saída ser o .
- Seja o comprimento da string de entrada l .
- Seja uma variável r o resultado de o / l .
- Encontre a média de todos os r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Teste com este script. Você precisará modificá-lo conforme as instruções. Observe que o programa não verifica se a saída é um código cubicamente válido. Se você não conseguir que o script funcione, eu posso ajudar. Ping me na sala de bate-papo cubicamente .
fonte
@6
- imprimiria a soma da face inexistente do sexto índice (bloco de notas) como caractere" seria mais precisa?%4
Também é uma soma? Os+
comandos sum face são adicionados a todos os valores ou ...?@6
/%6
apenas imprime diretamente o valor do bloco de notas como um caractere / número inteiro.@x
/%x
(onde x é qualquer face existente) adiciona todos os valores nax
face indexada e imprime a soma como um caractere / número inteiro.+
adiciona todos os valores na face especificada ao registro.Respostas:
C ++ 11, Pontuação : 6.37
Experimente online! (gerar código Cubicamente a partir de ASCII) e (executar código Cubicamente)
Explicação:
{0,9,18,27,36,45}
a{6, 15, 27, 26, 19, 42}
. O que torna útil esse conjunto de soma de faces é que o MDC é 1; portanto, pela identidade de Bézout, existe uma maneira de construir qualquer número ad
partir de uma soma (ou diferença) desses números.ch
e o valor atual do bloco de notas én
, entãod = ch - n
, podemos executar comandos Cubicamente no formato+{digits from 0 to 5}-{digits from 0 to 5}
tal que o valor do bloco de notas se tornech
. Em seguida, basta executar%6
para imprimir o valor do bloco de notas.d
como uma soma / diferença de números no conjunto de soma de faces, eu uso o algoritmo Knapsack para todos os números de 0 a 128. Por exemplo, parad=1
, o programa recebe27 - 26 = 1
, então imprime+2-3
, o que é27 - 26 = 1
. O que pode ser visto ao executar o programa com entradaabc
, saída do programafonte
@
implicitamente -@6
pode ser reduzido para@
todos os casos.Lua, Pontuação :
85,9113,5013,2012,709,419,329,839,669,129,068,03 (Médio)Experimente online!
Ok, acho que não posso mais otimizar isso.
Esta versão interage com cada caractere, adicionando c% 9 (onde c é o valor decimal do caractere)
:5+2/1
, e adiciona as partes divisíveis por 9 adicionando o valor dessa face. Por exemplo::2/1+551@
para imprimir "e", onde:2/1
adiciona 2,+551
adiciona 99 (9 * (5 + 5 + 1) ou 9 * 11) e@
imprime a saída. A entrada é lida comio.read()
.As otimizações incluem adicionar / subtrair diretamente após a impressão, se a diferença entre os caracteres for um múltiplo de 9, dividir o valor atual, se possível, em vez de definir c% 9 do zero, e repetir os caracteres imprimindo o valor atual novamente, em vez de recalculá-lo. Além disso, implementei o método de Kamil de imprimir instantaneamente qualquer rosto que já contenha o valor-alvo e a sugestão do MD XF de não usar
:
no início, mas apenas começar com a+
.fonte
local inp = io.read()
paralocal inp = io.read("*all")
. Isso resolve o problema.:5+124
, basta escrever+5124
, o que provavelmente diminuirá um pouco a pontuação se você o ajustar corretamente.Cubicamente , pontuação : 86.98
Experimente online!
Acontece que tudo que você precisa é de loops condicionais, uma face igual a 1 e um comportamento consistente de final de entrada.
A adição / subtração da face ESQUERDA é fazer com que o loop termine quando o EOF for lido.
fonte
@
implicitamente -@6
pode ser reduzido para@
todos os casos.C # (.NET Core) , Pontuação:
129,9811,7310,829,6210,3310,3210,20-1,2 ponto da sugestão do MD XF para usar em
@6666...
vez de@6@6@6@6...
para repetir caracteres e sequência de inicialização superiorExperimente online!
Minha versão mais recente realmente faz alguma manipulação do cubo! Yay!
Na primeira
Console.Write
, há uma manipulação fixa MD XF elaborada que cria este cubo:O significado desse cubo é que um de seus lados tem uma soma de 1, permitindo manipulações do bloco de notas em uma escala menor que os múltiplos de nove e, em particular, simplifica o movimento relativo, em vez de precisar começar do zero cada caractere; Nesse algoritmo, adição e subtração são usadas para seguir o caminho mais curto entre os caracteres.
A versão da inicialização do MD XF faz com que o lado 2 tenha uma soma de 14, o que economiza muitos bytes de saída para distâncias ASCII entre 14 e 20.
Agora pode lidar com entradas com novas linhas internas, Console.Read () obtém caracteres individuais até o final do arquivo; veja o link do TIO que deve ter a entrada
Raspou algumas frações de um ponto, emitindo imediatamente um caractere, se o valor ASCII já existir de um lado.
Script de teste cortesia do MDXF
Submissão anterior aqui e explicação:
Isso é meio chato, mas até onde eu sei, funciona. É certo que só tentei,
Hello, World!
mas executei a saída no intérprete TIO Cubically e ela produziu "Olá, mundo!" então eu assumi que funciona.Em vez de realmente manipular o cubo, o bloco de notas é simplesmente incrementado pela soma da 1 face (9) repetidamente até obter o valor correto para cada caractere e depois imprimi-lo.
fonte