Dada a entrada de um programa escrito em oOo CODE , imprima o código BF que ele representa.
Aqui está uma breve descrição de como oOO CODE funciona:
Primeiro, todos os caracteres não alfabéticos são removidos (tudo que não estiver no intervalo
A-Za-z
).Por exemplo, considere o programa
PROgRam reVERsES giVeN iNPut sEqUENcE
(um exemplo dado na página wiki do esolangs que faz exatamente o que você esperaria). Após este primeiro passo, temos agoraPROgRamreVERsESgiVeNiNPutsEqUENcE
.Em seguida, divida todos os caracteres restantes em grupos de 3. Agora temos
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. Se houver um grupo à direita de 1 ou 2 caracteres, descarte-o.Converta cada grupo de 3 letras em um comando BF com base na tabela a seguir:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
Ou seja, se a primeira letra de um grupo é minúsculas, o segundo é maiúscula, eo terceiro é minúscula, que se traduziria ao comando
[
.Com o nosso exemplo, isso finalmente se torna o programa BF
,[>,]<[.<]+
, que de fato inverte sua entrada.
Como esse é o código-golfe , o código mais curto em bytes será vencedor.
Casos de teste:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
fonte
Respostas:
oOo,
15691515 bytesTinha que ser feito. Experimente aqui .
Golfe:
Traduzido para Brainfuck (com quebras de linha para maior clareza):
Ungolfed com explicação:
Obrigado pelo desafio interessante!
fonte
CJam,
3635 bytesTeste aqui.
Explicação
fonte
JavaScript (ES6),
949391858483 bytesGuardado 1 byte graças a @ dev-null
Eu tentei muitas variantes disso, mas isso parece ser o mais curto. Também funciona com entrada vazia!
Como funciona
Primeiro, com
x.replace(/[a-z]/gi,c=>
, encontramos cada letrac
na entrada. Montamosa
eb
para""
na outra extremidade da chamada de função, já que a função ignora os parâmetros passados a segunda.a
armazenará uma string binária para determinar qual caractere estamos criando no momento eb
armazenará o resultado.Agora, a parte confusa: primeiro, com
(a+=+(c<'a'))
, acrescentamos a0
aa
sec
estiver em maiúsculas;1
de outra forma. Essa expressão retorna o novo valora
, por isso, então podemos verificar se ele atingiu três caracteres de comprimento com, verificando se o personagem no índice 2 existe:[2]?
. Caso contrário, simplesmente encerramos a função com:0
.Se
a
agora tem três caracteres, é um número binário entre000
e111
. Podemos converter isso em um número decimal anexando"0b"
ao início e forçando o mecanismo a analisá-lo como um número com'0b'+a-0
.No entanto, ainda precisamos redefinir
a
a string vazia. Não podemos fazer'0b'+(a="")-0
isso porque isso significaria que a string analisada é justa0b
. Felizmente, quando analisado como um número, a cadeia vazia se torna 0, para que possamos substituir o0
por(a="")
.Agora temos o nosso número, e nós podemos apenas acrescentar o personagem nesse índice em
"><[]-+.,"
ab
. Após a substituição, usamos&&b
para devolvê-lo da função (Bem, a menos que o resultado de.replace
esteja vazio, o que acontece apenas na entrada vazia e retorna a string vazia de qualquer maneira.)fonte
'0b'+a-0
vs+`0b${a}`
e+("0b"+a)
replace
vence depois de tudo!match
trilha ...05AB1E ,
3532 bytesCódigo:
Usando um truque muito inteligente de Martin Büttner, desta resposta . Explicação:
Experimente online!
Usa a codificação CP-1252 .
fonte
Retina ,
79757170 bytesAgradecemos a randomra por economizar 1 byte.
Experimente online!
Explicação
Começamos removendo tudo o que não é uma carta.
Isso divide a string em pedaços de três caracteres, retornando todas as correspondências de 3 caracteres (sem sobreposição). Isso descarta automaticamente qualquer pedaço incompleto à direita.
Anexe um
;
a cada linha. Usaremos isso como um marcador para a conversão de base 2. Falando nisso, simplesmente trataremos as letras maiúsculas1
e minúsculas como0
.Isso faz uma divertida conversão de base 2 para unária. A cada passo, simplesmente dobramos os caracteres à esquerda
;
e movemos o caracter;
para a direita. Por que isso funciona? Lembre-se de que interpretaremos letras minúsculas como0
e maiúsculas como1
. Sempre que processamos uma letra, simplesmente dobramos o total atual (à esquerda) até o momento - as letras minúsculas são justas2*0=0
, para que possam ser completamente ignoradas e as letras maiúsculas representam o número binário até agora, dobrando-as é o que nós queremos. Em seguida, adicionamos a letra atual ao total em execução que representa0
ou1
corresponde.Remova todas as letras minúsculas / zeros.
Combine cada linha e substitua-a pelo número (decimal) de caracteres nessa linha. Devido a
;
isso, o número unário é convertido em seu equivalente decimal + 1.Transliteração que substitui 1-8 pelo comando correspondente.
Remova as alimentações de linha.
fonte
;
. Vou editar isso mais tarde.MATL ,
3832 bytesExperimente online!
fonte
Japonês,
3736 bytesTeste online!
Como funciona
fonte
JavaScript (ES6),
11195 bytesSimplesmente remove não letras, converte letras maiúsculas em 1s e minúsculas em 0s, divide-se em grupos de três, ignora um grupo à direita de 1 ou 2 e decodifica os grupos.
Editar: salvou 16 bytes graças a @ dev-null, embora o código não funcione mais quando passou a string vazia.
fonte
match(/.../g).map().join
abordagem, mas calculei mal o número de bytes e, apesar de não ter me poupado nada. Obrigado pela dica da primeira partida.Python 3, 91 bytes
Hmm ... parece um pouco longo, especialmente a segunda linha.
b=[b,2*b+(c<'a')][c.isalpha()]
é um pouco pior ainda.fonte
Pitão, 40 bytes
Experimente aqui!
Poderia salvar 2 bytes se eu puder exibir o resultado como lista de caracteres em vez de uma sequência.
Explicação
Filtra todas as não letras, converte maiúsculas em 1 e minúsculas em 0, divide-se em partes de 3, interpreta cada parte como número binário e a usa como índice em uma sequência que contém todos os comandos BF.
fonte
Jolf,
3134 bytesExperimente aqui! Substitua
►
por\x10
e♣
com\x05
. Como eu implementei a função chop incorretamente, ganho 3 bytes. :(fonte
Hoon , 212 bytes
Ungolfed:
Hoon não possui expressões regulares apropriadas, apenas uma biblioteca combinadora de analisadores, por isso é muito detalhada. A varredura ++ também falha se o fluxo de entrada inteiro não for analisado, então eu tenho que usar ++ rose, coagir em uma unidade e desembrulhá-la para o valor "análise mais distante". Também faz uso pesado para currying e mapeamento sobre listas (turno ++), então eu alias os nomes das funções para variáveis de uma letra.
Hoon é a linguagem de programação do Urbit, um projeto limpo de reimplementação de ardósia. É puramente funcional, de tipo estático, vagamente parecido com um cisco e compila com o Nock. Nock é uma VM baseada em combinador que é executada em cima de um modelo de memória bignum de árvore binária.
Quando você inicializa o Urbit, você entra em: dojo, o shell e o Hoon substituem. Para executar o snippet, digite:
e cole a função autônoma na próxima linha.
fonte
Gelatina , 27 bytes
Experimente online! Observe que as barras invertidas precisam escapar na sequência de entrada para o segundo último caso de teste.
fonte
Matlab, 98 bytes
fonte
Perl,
767372 + 1 = 73 bytesRequer a
-n
bandeira:Usando o truque com conversão de base 2 .
Como funciona:
fonte
Julia, 107 bytes
Esta é uma função anônima que aceita uma string e retorna uma string. Para chamá-lo, atribua-o a uma variável.
Ungolfed:
fonte
Lua, 120 bytes
Grande uso
string.gsub()
daqui, mais uma vez poderia ter me permitido criar um ponteiro de um caractere nessa função para obter alguns bytes. Além disso, é o meu primeiro programa lua sem espaços! : DEste programa recebe sua entrada via argumento da linha de comando e gera um programa BrainFuck, um comando por linha.
Edit: Saved 1 Byte graças a @Oleg V. Volkov
Ungolf e explicações
fonte
b
e mais um ao salvarstring.gsub
em var mais curto e dobrar manualmente os primeiros argumentos:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 bytes
Vai tentar jogar mais.
fonte
Mathematica, 192 bytes
Função anônima que usa a string desejada como argumento. Etapas no algoritmo (bastante direto):
fonte
Ruby
1171141131118679 Bytestr(?^+m='a-zA-Z','')
define m como'a-zA-Z'
e remove não letras.tr(m,?0*26+?1)
converte minúsculas em 0, maiúsculas em 1.scan(/.../)
string de grupo em grupos de 3 e descartar o último grupo se tiver menos de 3{$><<"><[]-+.,"[$&.to_i 2]}
converter cada número binário em um caracterefonte
tr("a-zA-Z","01")
? ou mesmotr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
gives111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 bytes). A entrada da linha de comando foi alterada para stdin; corrigiu as aspas circundantes na saída (mas agora ela não tem uma nova linha à direita) #tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
é mais curtoPerl 6, 81 bytes
Provavelmente isso pode ser feito melhor, mas esta é a minha chance
Uso
Ungolfed
fonte
C ++,
173167 bytesPrograma completo, jogado no golfe (leituras da entrada padrão):
Um pouco não-destruído:
Note-se que
@A
...Z[
em ASCII, e da mesma forma para`a
...z}
.fonte
Japt v2.0a0
-P
, 27 bytesGuardado 3 bytes graças a @Shaggy
Tente
fonte
Pyke, 31 bytes, não competitivo
Pyke é mais antigo que o desafio, mas eu adicionei alguns recursos para torná-lo mais competitivo - função de bloco. Eu usei o mesmo truque que o @Martin Büttner usou.
Experimente aqui!
fonte
JavaScript, 148 bytes
fonte
TI-BASIC,
311288 bytesO que, sem respostas TI-BASIC? Hora de eu consertar isso!
Entrada é o código oOo em
Ans
.Saída é o código BF traduzido .
Exemplos:
Sem golfe:
(novas linhas e comentários adicionados)
Notas:
fonte