Estou reproduzindo a segunda parte do primeiro dia do Advent of Code, com permissão do criador.
Papai Noel está tentando entregar presentes em um grande prédio de apartamentos, mas ele não consegue encontrar o andar certo - as instruções que recebeu são um pouco confusas. Ele começa no térreo (andar 0) e segue as instruções, um personagem de cada vez.
Um parêntese de abertura (
significa que ele deve subir um andar e um parêntese de fechamento )
significa que ele deve descer um andar.
O prédio é muito alto e o porão é muito profundo; ele nunca encontrará o piso superior ou inferior.
Dado um conjunto de instruções, encontre a posição do primeiro caractere que o leva a entrar no porão (piso -1).
Como exemplos:
entrada )
faz com que ele entre no porão na posição 1 do personagem.
entrada ()())
faz com que ele entre no porão na posição 5 do personagem.
Uma entrada longa é fornecida aqui que deve render a solução 1797.
Isso é código de golfe, então a solução mais curta vence!
Respostas:
Geléia,
87 bytesGraças ao @ Sp3000 por jogar fora 1 byte!
Experimente online!
Como funciona
fonte
Python 2, 44 bytes
Essa solução inteligente foi encontrada por hallvabo, xsot, mitchs e whatisgolf sobre esse problema no golfe da anarquia . Se algum de vocês quiser publicá-lo, removerei isso.
O truque é deixar o analisador do Python fazer o trabalho. A função
input()
tenta avaliar uma sequência de entrada e gera um erro no primeiro parêntese sem correspondência. Este erro, quando detectado, tem formaque inclui o número do caractere em que o erro ocorreu.
fonte
Python,
7977 bytesProvavelmente existe uma maneira melhor de fazer isso, mas estou sem ideias. Também este é o meu primeiro post sobre codegolf.
Graças a @Erwan. para jogar fora de 2 bytes.
fonte
[0:g]
por[:g]
-2*ord(z)+81
por2*(z<')')-1
Python 3, 59
Economizou 3 bytes graças ao grc.
Eu realmente não gosto de fazer indexação manual de strings em Python. Parece tão errado.
fonte
C, 55 bytes
Experimente aqui .
Edit: Não sei por que deixei uma variável não utilizada lá ...
fonte
CJam, 10 bytes
ou
ou (créditos para Dennis)
Teste aqui.
Explicação
Como A Simmons já observou,
()
é uma escolha de sorte para o CJam, pois esses são os operadores de decremento / incremento, respectivamente. Isso significa que, se estamos começando do zero, estamos procurando a etapa em que o Papai Noel chega ao andar 1.fonte
Labirinto , 18 bytes
Experimente online! Esta resposta foi o resultado da colaboração com o @ MartinBüttner.
Explicação
O habitual Labirinto iniciador (eu digo "habitual", mas na verdade reescrevo isso toda vez):
n*10 + <digit>
. Isso permite a fácil criação de grandes números. Para iniciar um novo número, use_
, que empurra zero.Esse código é um pouco estranho, pois, para fins de golfe, o loop principal combina duas tarefas em uma. Para a primeira metade da primeira passagem, eis o que acontece:
Agora que a pilha foi inicializada com -1 no topo, o processamento real pode começar. Aqui está o que o loop principal faz.
A última duplicata adiciona um elemento à pilha para cada iteração que realizamos. Isso é importante porque, quando atingimos zero e avançamos no NOP, fazemos:
fonte
Oracle SQL 11.2,
160159 bytesSem golfe
fonte
Retina ,
2221Experimente online ou experimente o grande caso de teste. (O URL é grande para o grande caso de teste, deixe-me saber se ele quebra para você, parece bom no chrome.)
1 byte economizado graças ao Martin!
Combinamos o primeiro conjunto de parênteses balanceados e o extraímos, depois contamos o número de vezes que a sequência vazia corresponderá a esse resultado. Não tenho certeza se essa é a melhor maneira de fazer isso no Retina, principalmente se o modo PCRE o tornar mais curto, mas o uso da
$#_
substituição pareceu ser mais longo por causa de um erro e pelo problema de ter mais de uma correspondência.Esse algoritmo causa um comportamento estranho para entrada inválida, essencialmente pressupõe que, se o Papai Noel não chegar ao porão, ele misteriosamente se teleporta para lá após os outros movimentos.
fonte
Grep + AWK, 51 bytes
O
grep
comando coloca cada caractere em uma nova linha.fonte
Pitão, 13 bytes
Explicação
Experimente aqui
Algoritmo antigo, 15 bytes
Explicação:
Experimente aqui
Ou, se for permitido o uso de caracteres diferentes de
(
e)
, 9 bytes (movendo o pré-processamento para a entrada)Explicação
Experimente aqui
fonte
JavaScript (ES6), 58 bytes
Funciona removendo recursivamente um par de
()
s correspondentes até o primeiro caractere ser a)
. Aviso: não tente fazer isso em strings que não possuem)
s suficientes . Exemplo:Neste ponto, vê que 12 caracteres foram excluídos no total, de modo que a resposta é 13.
fonte
MATL ,
1211 bytes1 byte salvo usando a ideia de computação de Dennis -1 aumentada para a string de entrada
Experimente online!
fonte
CJam,
1210 bytesExperimente aqui.
Dois bytes salvos graças a Martin.
Explicação:
fonte
Javascript, 117 bytes
Ignora outros caracteres. Usos
prompt
ealert
.fonte
Perl, 34 + 1 = 35 bytes
Obrigado a Dennis por algumas dicas.
Corra com a
-p
bandeira. Ele funciona no Perl 5.10, mas as versões posteriores precisam de um espaço aqui:++ while
Versão mais antiga e não destruída:
fonte
Python, 44 bytes
O piso
i
começa de1
forma que terminemosi
sendo o valor de falsey0
. Se não for finalizado, adicione recursivamente um ao resultado com o primeiro caractere removido e o número do andar atualizado com base nesse caractere.fonte
Javascript, 57 bytes
Muito simples, apenas itera sobre a entrada, incs if '(' decs if ')'. Retorna na primeira negativa.
fonte
Ruby, 47 bytes
Função anônima.
fonte
C, 73 bytes
Espera entrada no STDIN; nenhum caractere que não seja
(
e)
possa aparecer na entrada (pelo menos até chegarmos à resposta). A entrada deve ser ASCII.Emite a resposta em STDOUT.
Usa a diferença de 1 bit entre o ASCII para
(
e)
.Versão bem formatada:
fonte
f=c=0
inicialização do loopfor(f=c=0;f!=...
para salvar um byte?PowerShell,
756562 bytesUsa uma técnica semelhante à dos números binários parentificáveis para percorrer todos os caracteres de entrada, mantendo uma
$c
onça corrente de+1
cada um(
e-1
de cada um)
e testando se atingimos negativo (por exemplo, estamos no porão).Edit - salvo 10 bytes por iteração sobre os personagens reais, em vez de seus índices
Editar 2 - salva 3 bytes adicionais por cheque igualdade trocando para modulo tão fundição está implícita
fonte
Mathematica,
6255 bytesTodos os nomes de funções longos! Funciona de maneira semelhante à resposta CJam de Simmons.
fonte
Baixar 25 bytes
Saídas em unário. Isso o inicia no primeiro andar e vai até 0.
fonte
Raquete (102)
Ungolfed
fonte
APL, 18 caracteres
Em inglês:
¯1*')'=⍵
: -1 onde input = ")", 1 caso contrário;+\
: soma em execução;1⍳⍨¯1=
: encontre o índice do primeiro -1.fonte
Lua,
928987 BytesEle recebe um argumento da linha de comando.
Editar: salvos 3 bytes
Edit: salvou 2 bytes e corrigiu um bug que poderia ocorrer em casos extremos, agora ele sai via seu código de saída
Ungolfed
fonte
k / kona ,
2321 bytes2 bytes salvos removendo parênteses desnecessários.
Uso:
fonte
Perl, 40 + 1 = 41 bytes
Requer a
-p
bandeira:Pressupõe entrada válida.
Como funciona:
fonte
Javascript (ES6),
6867 bytesRecebe entrada como primeiro argumento
Explicação
fonte
Python (3.5),
787162 bytesuma solução recursiva
é semelhante a esta solução para minigolfe
podemos assumir que o Papai Noel sempre chega ao porão
fonte