Considere uma gramática sobre o alfabeto { 0
, 1
, ?
, :
} definido pela regra de produção
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Dada uma sequência gerada a partir de s , analise-a como uma expressão ?:
associativa à direita (por exemplo, a?B?X:Y:c?d:e?f:g
significa a?(B?X:Y):(c?d:(e?f:g))
) e avalie-a com a seguinte semântica:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Se o resultado for 0 , produza algum valor fixo; se a saída for 1 , produza um valor fixo diferente. Especifique seus valores de saída escolhidos (por exemplo, 0
/ 1
ou False
/ True
) em sua resposta.
Casos de teste
0 -> 0
1 -> 1
0?0:1 -> 1
0?1:0 -> 0
1?0:1 -> 0
1?1:0 -> 1
0?1?0:1:1 -> 1
1?0?1:1:1 -> 1
1?0:1?0:1?1:1 -> 0
1?1?1:0?1?0:0:0:0 -> 1
1?0:1?0?1:1?1:0:1?1?1:1:1?0:1 -> 0
1?1?1:0?0?1:1:0?1:0:1?1?0?0:0:1?1:0:0?1?0:1:1?0:1 -> 1
0?0?1?0?0:1:0?0:0:0?0?1:1:1?0:1:0?0?0?1:0:0?1:1:1?1?0:1:1 -> 0
Regras
- Você não pode usar built-ins de linguagem que interpretam seqüências de caracteres como código em alguma linguagem de programação e as executam (como JavaScript / Perl / Ruby / Python
eval
). - Dito isto, seu código não realmente têm para analisar e, em seguida, avaliar a cadeia de entrada. Você pode adotar qualquer abordagem que alcance resultados equivalentes e não viole a regra anterior.
- Seu programa será verificado
perl -le 'print eval<>'
. - O código mais curto (em bytes) vence.
S → T | T ? S : S
,T → 0 | 1
, eliminando a necessidade de falar sobre associatividade?Respostas:
GolfScript, 21 bytes
Isso gera
0
ou1
. Presume-se que a entrada tenha uma única nova linha à direita. Usar~
(que avalia seqüências de caracteres) salvaria um byte:Isso é baseado em http://golf.shinh.org/reveal.rb?The+B+Programming+Language/tails_1462638030&gs .
fonte
Retina , 23 bytes
Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Explicação
Na verdade, é bastante simples. A entrada é reduzida ao resultado
+
avaliando repetidamente ( ) ternários que contêm apenas literais. Para garantir que isso seja feito de maneira associativa, procuramos correspondências da direita para a esquerda (r
) e substituímos apenas a última correspondência que encontramos (-1=
).A própria expressão regular corresponde
0\?.:
e a remove (deixando apenas o material depois:
) ou1\?.:.
e o substitui pelo valor após o?
.fonte
1
correspondência st em vez de-1
st?Haskell,
106 101 100 9083 bytesIsso depende muito dos recursos de correspondência de padrões de Haskell. Antes de tudo, invertemos a string de modo que possamos buscar pela primeira ocorrência de
b:a?x
(que normalmente seria lida comox?a:b
) e a substituímos por seu valor. Isso fornece automaticamente a associatividade correta . Aqui fazemos uso dox:xs
padrão. É isso que a funçãof
está fazendo. Basicamente, aplicamosf
sua saída repetidamente, até termos um único número (0 ou 1).Obrigado @Lynn por 12 bytes!
fonte
Brainfuck,
826463 bytesA saída é
\xff
para0
e\x00
para1
. A implementação do brainfuck deve permitir ir para a esquerda da célula inicial.Isso usa essencialmente a mesma abordagem da resposta Python do xsot , mas a ramificação é provavelmente mais difícil de seguir em comparação com meu envio inicial de 82 bytes:
(Para esta solução, a saída é
\xfe
para0
e\xff
para1
, e uma compatibilidade mais ampla é alcançada quando a entrada termina com uma nova linha.)Se você não se incomoda em analisar a solução da xsot, a idéia é a seguinte: Prossiga da esquerda para a direita. Se você
1?
vir, descarte-o avidamente. Se você0?
vir, descarte tudo entre isso e o correspondente:
. Quando?
não aparecer como o segundo caractere, pare o loop e imprima o primeiro caractere da seqüência restante.Portanto, a solução de 82 bytes realmente reflete esse esquema de perto. O loop interno lida com
0?
, assim como o loop interno do xsot. Alguns cuidados são tomados para entrar no loop principal sem verificar nenhum caractere de entrada; ou seja, queremos verificar se o segundo caractere é?
apenas uma vez no final do loop principal e não também no início antes de entrar no loop principal.A solução de 63 bytes combina essencialmente os loops internos e externos em um, que eu suspeitava ser possível, dada a semelhança entre esses loops. O layout da memória no loop principal pode ser descrito como:
where
[x]
significa célula atual -s
começa como um valor fictício diferente de zero que apenas indica que ainda estamos em loop e é imediatamente substituído por um caractere de entrada (0
ou1
). Ad
célula mantém a profundidade (negativa) no caso de estarmos no meio de uma0?
, caso contrário0
. Oc
que vai ser?
ou:
ou nova linha ou EOF.Após a atualização
s
ec
, lidamos com o0?
caso atualizando ded
acordo e ajustando o ponteiro; caso contrário, usamos o valor atual dec
como o valor dad
próxima iteração ou paramos se tivermos terminado.fonte
Python 2,
76747372 bytesCom entrada como string literal para evitar
raw_
.A saída é
0
ou é1
seguida por<built-in function id>
.fonte
3>>int(c)
`id`
truque…! Bem-feito :) #Python 2, 89 bytes
A entrada é aceita como uma string literal.
fonte
Grime ,
3431 bytesImprime
1
para entradas0
verdadeiras e falsas. Experimente online! Infelizmente, o último caso de teste fica sem memória no TIO.Explicação
A associatividade correta significa essencialmente que em
a?b:c
,a
sempre é um0
ou1
, nunca uma expressão mais longa. Definirei recursivamente um padrão que corresponda a uma expressão verdadeira como essa e verificarei a entrada. Também é desnecessário verificar se every:
é realmente a:
, se todos os?
s estão marcados: existe um número igual de?
s e:
s na entrada e se alguns?
são classificados incorretamente como a:
, o correspondente:
falhará em corresponder e o emparelhamento do Grime o motor retornará.fonte
Haskell,
79 71 70 62 6056 bytesEdit: Obrigado a @ Zgarb por 3 bytes e a @nimi por 4 bytes!
Essa é uma abordagem recursiva
que abusa um pouco da regra de saída "algum valor fixo". Edit: Livrar-se das tuplas não apenas salva 8 bytes, mas também produz uma saída melhor:"0"
ou"1"
.Versão não destruída:
Como funciona?
A
eval
função percorre a árvore implícita das expressõese retorna uma tupla do formulário
(result, rest)
.O primeiro padrão
(x:'?':r1)
correspondex
a'1'
er1
para"0?0:1:0?1:0"
. Aplicando recursivamenteeval
parar1
avaliar a subexpressão0?0:1
e retornos(0,":0?1:0")
. Combinar isso com o padrão(a,':':r2)
geraa=0
er2=0?1:0
. Essa subfórmula também é avaliada recursivamente para queb='0'
er3=""
. Verifique sex
é'1'
ou'0'
e retorne(a, r3)
ou(b, r3)
.fonte
x>'0'
trabalhar no lugar dex=='1'
?':'
por_
.:
. Obrigado novamente!if .. then .. else
comlast$e s:[a:tail(e s)|x>'0']
.JavaScript (ES6), 53 bytes
Retorna
0
ou1
para entrada válida; trava para entrada inválida. Explicação: como a reversão de uma string é desajeitada no JavaScript, minha primeira tentativa de 71 bytes funcionou usando um cabeçote negativo negativo para um?
que, de outra forma, perturbaria a associatividade:Como isso foi um pouco longo, fiquei pensando se poderia melhorar as coisas incorporando a tomada de decisão no regexp. Como se viu, não foi um sucesso imediato, pois também levou 71 bytes:
Então me ocorreu que
0?0:
e0?1:
sempre são não-ops, sem preocupação com associatividade. Isso me salvou quase 25%.fonte
f=
. Não verifiquei se sua contagem de bytes está levando em consideração ou não.Perl, 32 + 1 (
-p
sinalizador) = 33 bytesCrédito total para @Mitch Swartch , pois sua solução era 14 bytes menor que a minha!
Agradecemos também a @ Neil, que sugeriu uma solução 1 byte mais que Mitch.
Precisa de
-p
sinalizador, bem como-M5.010
ou-E
para executar. Por exemplo :Explicações : Basicamente, reduz os blocos de
a?b:c
(começando do final para garantir que não se?
segue) emb
ouc
dependendo da verdade dea
, repetidamente, até que a sequência contenha apenas1
ou0
.fonte
-
não conta para a sua pontuação? Hrm. Interessante ... Boa resposta!perl -e '<code>'
, adicionando assimp
apenas 1 byte de custoperl -pe '<code>'
.?
, eu consegui reduzir para 34 bytes dessa maneira.s/.*\K(1\?(.)..|0\?..)/\2/&&redo
Python 3,
9369 bytesEntrada é a sequência como uma lista de caracteres, a saída é
"0"
ou"1"
Versão não destruída:
Outra tentativa, mas com consideravelmente mais bytes:
fonte
def f(s):x=s.pop(0);return[]<s<s.pop(0)>'>'and(f(s),f(s))[x<'1']or x
, e para o Python 3 com pequena distância de edição da sua, existedef f(s):z=s.pop;r=z(0);return s and':'<z(0)and(f(s),f(s))[r<'1']or r
.SED,
75 74 68(40 + 1 para -r) 41fonte
(.*)
e adicionar um termo de substituição extra.\3
vez de\2
. Além disso, você pode juntar as linhas com;
a get:;s/(.*)(1\?(.):.|0\?.:)/\1\3/;t
.\3
, o que significa que eu acidentalmente copiei uma versão anterior. Eu sei sobre ponto e vírgula. Mas eca, por que você quer usar ponto e vírgula.Utilitários Bash + GNU, 42
Idéia semelhante à maioria das outras respostas de correspondência de padrões.
Ideone .
fonte
0
caso, que economiza 5 bytes.