Escreva um programa ou função que use uma string contendo apenas os caracteres ^
e v
(você pode assumir que não haverá outros caracteres). Ler da esquerda para a direita esta sequência representa a sequência de cliques do mouse feitos por um único usuário enquanto visualiza uma pergunta ou resposta do Stack Exchange pela primeira vez.
Every ^
representa um clique no botão de votação positiva e every v
representa um clique do botão de votação negativa . (Para exemplos de trabalho, veja um pouco à esquerda.)
Suponha que nenhuma limitação de votação esteja em vigor; portanto, todos os cliques são registrados corretamente.
Imprimir ou devolver:
1
ou+1
se a postagem acabar sendo votada.0
se a postagem acabar não sendo votada. (-0
e+0
não são válidos)-1
se a postagem acabar com voto negativo.
As postagens começam com zero voto líquido do usuário e os botões alteram o voto líquido da seguinte maneira:
Net Votes Before Button Pressed Net Votes After
1 ^ 0
1 v -1
0 ^ 1
0 v -1
-1 ^ 1
-1 v 0
O código mais curto em bytes vence.
Casos de teste:
[empty string] -> 0
^^ -> 0
^v -> -1
^ -> 1
v -> -1
v^ -> 1
vv -> 0
^^^ -> 1
vvv -> -1
^^^^ -> 0
vvvv -> 0
^^^^^ -> 1
vvvvv -> -1
^^^^^^ -> 0
vvvvvv -> 0
^^v -> -1
^v^ -> 1
^vv -> 0
vv^ -> 1
v^v -> -1
v^^ -> 0
^vvv^^vv^vv^v^ -> 1
^vvv^^vv^vv^v^^ -> 0
^vvv^^vv^vv^v^^^ -> 1
^vvv^^vv^vv^v^^v -> -1
^vvv^^vv^vv^v^^vv -> 0
^vvv^^vv^vv^v^^vvv -> -1
^vvvvvvvvvvvv -> 0
^^vvvvvvvvvvvv -> 0
^^^vvvvvvvvvvvv -> 0
vvv^^^^^^^^^^^^ -> 0
vv^^^^^^^^^^^^ -> 0
v^^^^^^^^^^^^ -> 0
fonte
^
personagem pode causar uma alteração na pontuação de -1, +1 ou +2? Eu sou denso onde? O que está acontecendo?Respostas:
Gol> <> 0.3.11 ,
131211 bytesExperimente online . Mesmo que isso funcione bem na próxima atualização, listei como 0.3.11 por precaução.
Explicação
Observe que o primeiro uso de
@
puxa um 0 da parte inferior da pilha para inicializar a contagem de votos para a primeira iteraçãoPara ilustrar com uma tabela completa:
fonte
código de máquina x86, 24 bytes
Esta é uma função que utiliza a convenção de chamada de chamada rápida, que pega uma sequência e retorna um número inteiro de 8 bits.
Testei-o com o seguinte programa C, que deve ser compilado no modo de 32 bits.
fonte
JavaScript (ES7),
474644433736 bytesRiscado 44 ainda é regular 44 :(
Mantém um total em execução
s
. Usa umfor of
loop para iterar sobre cada caractere na string e atualiza coms
base no caractere atual e no valor anterior.Edições: jogou golfe
~s&&-1
para!~s-1
. Essa expressão deve ser igual a 0 se fors
igual a -1 e -1 caso contrário. Economizou 6 bytes graças a @nderscore.Como a expressão funciona:
fonte
v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
CJam,
1814 bytesVersão atualizada com melhorias significativas contribuídas por Dennis:
Experimente online
Explicação:
fonte
Baixar 93 - 55 bytes
52 caracteres e 3 novas linhas.
Testado neste intérprete .
O
j
é equidistante de^
ev
em ascii, por isso é usado para fazer conversões aritméticas no final, em vez de condicionais que consomem espaço.fonte
brainfuck, 146 bytes
Este programa pega cada byte de entrada e o compara com o último. Se forem iguais, ela joga a entrada fora e armazena "0" como a "entrada anterior", caso contrário, a salva normalmente.
Se o resultado final for
v
, ele será impresso-
. Se o resultado final for diferente de zero, 1 será adicionado a uma célula vazia. Finalmente, 48 é adicionado a essa célula e é impresso.fonte
Javascript ES6,
9148 caracteresExplicação:
undefined
termina emd
.Teste:
Histórico de respostas:
fonte
Python 2, 49
Repete com a função de atualização
que pega a contagem atual de votos
x
e o novo caracterec
e gera a nova contagem de votos.A idéia é usar do Python 2
cmp
função, que compara seus dois argumentos e dá-1, 0, 1
para<, ==, >
respectivamente. O interiorcmp('u',c)
dá-1
parav
e1
para^
; qualquer caractere entre eles basta'u'
. O externo então compara isso ax
, que dácmp(1,x)
para^
ecmp(-1,x)
parav
, que tem os valores corretos.A iteração direta foi de três caracteres a mais (52), mas seria um caractere curto (48) se
input()
permitir cotações.A melhor função recursiva que encontrei foi um caractere a mais (50)
fonte
Prolog,
159152 bytesCódigo:
Teste você mesmo:
Intérprete online aqui
Exemplo
Editar: salvou 7 bytes unificando cláusulas r com OR.
fonte
CJam, 16 bytes
Isso falhará após a impressão de 0 , se aplicável. O erro pode ser suprimido com o interpretador Java. Se você tentar isso online , ignore tudo, exceto a última linha de saída.
Como funciona
fonte
Python 2,
177 15972 bytesAinda meio novo nessa coisa do código de golfe.
EDIT: Corrigido o comportamento incorreto.
EDIT 2: Obrigado @MorganThrapp por cortar muitos bytes.
fonte
JavaScript (ES6),
64595852 bytesIsso se baseia na observação de que apenas o último trecho da repetição (de um
^
ou dev
) afeta o resultado.Agradecimentos a Neil por jogar fora 6 bytes.
fonte
f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2
suficiente.>
ou<
operador. Obrigado pelas dicas[0]
que pode ter confundido você.f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2
, o que funciona devido ao tipo de coerção com o array.Haskell, 40 bytes
fonte
f
como uma função infix%
. Além disso, acho quev
pode ser um_
.-1
emvv
vez de 0?1%_=-1
_%_=0
12 caracteres.Scala, 75 bytes
Teste para função implementada.
fonte
APL, 17
Para intérpretes sem notação de fork (como GNU APL), seria
{⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞
(19). Essa é provavelmente a mais chata das soluções possíveis, porque funciona diretamente a partir da definição do problema.fonte
Ruby,
4135 bytesRegex. Somente o último botão pressionado é interessante, portanto verifique a duração disso. Em seguida, compare-o com
"a"
(ou qualquer letra entre^
ev
) para obter1
ou-1
.fonte
C # 6, 18 + 80 = 98 bytes
Requer:
Função real:
Como funciona: o código primeiro remove tudo antes do último
^^
ouvv
. Esse conteúdo não é relevante porque clicar duas vezes no mesmo botão sempre cancelará seu voto. Ele faz isso através da divisão em^^
evv
e tendo o último item. Se este item for uma string vazia (.Length<1
), a função retornará0
porque todas as votações foram canceladas. Se a string não estiver vazia, apenas o último caractere da string original: substituirá todos os votos anteriores. Se o código de caractere for menor que 95, será 94 e , caso contrário,^
retornará .1
-1
fonte
Python 2.7,
797588fonte
(-1,(1,0)[n==0])[n>0]
para economizar 10 bytes. Além disso, não usea=str.count
. Na verdade, custa 4 bytes.Minkolang 0.11 ,
2822 bytesExperimente aqui.
Explicação
Observe que não há
N.
no final. Isso porque deixei envolver desde o início. Quando a entrada está vazia, a contagem final é emitida como número inteiro e o programa para.fonte
Pitão, 13 bytes
fonte
Mathematica, 60 bytes
fonte
@#&
? Isso é inútil (a menos queSequence
s estão envolvidos, masSequence
s não estão envolvidos.Script de forma , 26 bytes
Como funciona:
fonte
C # 6, 18 +
9795 =115113 bytes, sem métodos de cadeia, LINQ excessivoMerece verdadeiramente ser precedido por
Teve a ideia de usar
x<95?1:-1
, em vez dex=='^'?1:-1
partir a resposta de ProgramFOXCoincidências:
fonte
C:
6766 bytesgolfed:
ungolfed:
fonte
Vá, 179 bytes
Uma solução extremamente ingênua.
Ungolfed:
fonte
Perl 5, 41 bytes
40 bytes, mais 1 para
-p
/(.)\1*$/;
compara a sequência de entrada ao regex/(.)\1*$/
, ou seja, vê se termina com um único caractere repetido algum número ≥1 de vezes.Se sim,
$&
é toda a sequência de repetições e$1
é o caractere; caso contrário (ou seja, a sequência de entrada está vazia), essas duas variáveis são a sequência vazia.$1=~v?-1:1
compara$1
com o regexv
e retorna -1 se corresponder e 1 caso contrário.E multiplique ± 1 por
(length$&)%2
, o comprimento do$&
módulo 2.fonte
05AB1E ,
141211 bytesPorto da resposta Gol> <> do @ Sp3000 .
NOTA: O @Grimy já postou uma alternativa mais curta de 8 bytes para 05AB1E , portanto, faça um voto positivo!
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
05AB1E , 8 bytes
Experimente online!
Soluções alternativas com o mesmo comprimento:
u㤮öÓÆ(
,㤮ögÓÆ(
.fonte
^^ -> 0
CJam,
2724 bytesExperimente online .
Tudo o que tirei da resposta de Dennis é
g
(função de sinal).fonte
Ruby, 43
9-i/11
avalia como 1 ou -1 quando recebem os códigos ascii de^
(94) ouv
(118)No programa de teste:
fonte