Ecrivez un programme ou une fonction qui prend une chaîne contenant uniquement les caractères ^
et v
(vous pouvez supposer qu'il n'y aura pas d'autres caractères). Lisez de gauche à droite cette chaîne représente la séquence de clics de souris effectués par un seul utilisateur lors de la consultation d'une question ou d'une réponse Stack Exchange pour la première fois.
Chaque ^
représente un clic de upvote bouton et tous v
représente un clic de downvote bouton. (Pour des exemples de travail, regardez légèrement à gauche.)
Supposons qu'aucune limitation de vote ne soit en vigueur, de sorte que tous les clics sont correctement enregistrés.
Imprimer ou retourner:
1
ou+1
si le poste finit par être voté.0
si le poste finit par ne pas être voté. (-0
et+0
ne sont pas valides)-1
si le poste finit par être voté.
Les messages commencent par zéro vote net de l'utilisateur et les boutons permettent de modifier les votes nets comme suit:
Net Votes Before Button Pressed Net Votes After
1 ^ 0
1 v -1
0 ^ 1
0 v -1
-1 ^ 1
-1 v 0
Le code le plus court en octets gagne.
Cas de test:
[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
la source
^
personnage peut provoquer un changement de score de -1, +1 ou +2? Suis-je dense où? Que se passe-t-il?Réponses:
Gol> <> 0.3.11 ,
131211 octetsEssayez-le en ligne . Même si cela fonctionnera correctement dans la prochaine mise à jour, je l’ai répertorié comme 0.3.11 au cas où.
Explication
Notez que la première utilisation de
@
tire un 0 du bas de la pile pour initialiser le nombre de votes pour la première itérationPour illustrer avec un tableau complet:
la source
code machine x86, 24 octets
Il s'agit d'une fonction utilisant la convention d'appel fastcall, qui prend une chaîne et renvoie un entier de 8 bits.
Je l'ai testé avec le programme C suivant, qui doit être compilé pour le mode 32 bits.
la source
JavaScript (ES7),
474644433736 octets44 barré est encore régulier 44 :(
Garde un total cumulé en
s
. Utilisefor of
loop pour parcourir chaque caractère de la chaîne et se met à jour ens
fonction du caractère actuel et de la valeur précédente.Edits: Golfé
~s&&-1
à!~s-1
. Cette expression doit être égale à 0 sis
égal à -1 et -1 sinon. Sauvegardé 6 octets grâce à @nderscore.Comment fonctionne l'expression:
la source
v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
CJam,
1814 octetsVersion mise à jour avec des améliorations significatives apportées par Dennis:
Essayez-le en ligne
Explication:
la source
Befunge 93 - 55 octets
52 caractères et 3 nouvelles lignes.
Testé sur cet interprète .
Il
j
est équidistant de^
etv
en ascii, il est donc utilisé à la fin pour effectuer des conversions arithmétiques, plutôt que des conditionnelles prenant beaucoup de place.la source
brainfuck, 146 octets
Ce programme prend chaque octet d'entrée et le compare au dernier. S'ils sont identiques, il supprime l'entrée et stocke "0" comme "entrée précédente", sinon il la sauvegarde normalement.
Si le résultat final est
v
, il est imprimé-
. Si le résultat final était différent de zéro, 1 est ajouté à une cellule vide. Enfin, 48 sont ajoutés à cette cellule et celle-ci est imprimée.la source
Javascript ES6,
9148 caractèresExplication:
undefined
se termine pard
.Tester:
Réponse historique:
la source
Python 2, 49
Itère avec la fonction de mise à jour
cela prend le nombre actuel de votes
x
et le nouveau personnagec
et génère le nouveau nombre de votes.L'idée est d'utiliser la
cmp
fonction de Python 2 , qui compare ses deux arguments et donne-1, 0, 1
pour<, ==, >
respectivement. L'intérieurcmp('u',c)
donne-1
pourv
et1
pour^
; n'importe quel caractère entre eux suffit pour'u'
. L'extérieur compare ensuite cela àx
, qui donnecmp(1,x)
pour^
etcmp(-1,x)
pourv
, qui ont les bonnes valeurs.L'itération directe était plus longue de 3 caractères (52), mais aurait un caractère trop court (48) si l'utilisation
input()
de guillemets était autorisée.La meilleure fonction récursive que j'ai trouvée était un caractère plus long (50)
la source
Prolog,
159152 octetsCode:
Testez-le vous-même:
Interprète en ligne ici
Exemple
Edit: 7 octets enregistrés en unifiant les clauses r avec OR.
la source
CJam, 16 octets
Cela plantera après avoir imprimé 0 , le cas échéant. L'erreur peut être supprimée avec l'interpréteur Java. Si vous essayez ceci en ligne , ignorez tout sauf la dernière ligne de sortie.
Comment ça fonctionne
la source
Python 2,
177 15972 octetsEncore un peu nouveau dans cette affaire de golf de code.
EDIT: Correction du comportement incorrect.
EDIT 2: Merci @MorganThrapp pour avoir réduit le nombre d'octets.
la source
JavaScript (ES6),
64595852 octetsCeci est basé sur l'observation que seule la dernière partie de la répétition (de l'un
^
ou de l'autrev
) affecte le résultat.Merci à Neil d' avoir joué 6 octets au golf.
la source
f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2
suffisant.>
ou<
opérateur. Merci pour les conseils[0]
qui peut vous avoir confondu.f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2
, ce qui fonctionne à cause de la coercition avec array.Haskell, 40 octets
la source
f
une fonction infixe%
. Aussi, je pense que lev
peut être un_
.-1
auvv
lieu de 0?1%_=-1
_%_=0
12 caractères.Scala, 75 octets
Test de la fonction implémentée.
la source
APL, 17 ans
Pour les interprètes sans notation fork (comme GNU APL), ce serait
{⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞
(19). C’est probablement la solution la plus ennuyeuse car elle découle directement de la définition du problème.la source
Ruby,
4135 octetsRegex. Seul le dernier bouton enfoncé est intéressant, alors vérifiez la durée de cette opération. Puis comparez-le à
"a"
(ou à toute lettre entre^
etv
) pour obtenir1
ou-1
.la source
C # 6, 18 + 80 = 98 octets
A besoin:
Fonction réelle:
Comment ça marche: le code supprime tout avant le dernier
^^
ouvv
. Ce contenu n'est pas pertinent car cliquer deux fois sur le même bouton annulera toujours votre vote. Elle le fait en divisant le^^
etvv
et en prenant le dernier élément. Si cet élément est une chaîne vide (.Length<1
), la fonction retourne0
car tous les votes ont été annulés. Si la chaîne n'est pas vide, il se contente de regarder le dernier caractère de la chaîne d'origine: il remplacera tous les votes précédents. Si le code de caractère est inférieur à 95, il sera alors 94^
, ainsi, il retourne1
sinon-1
.la source
Python 2.7,
797588la source
(-1,(1,0)[n==0])[n>0]
pour économiser 10 octets. Aussi, n'utilisez pasa=str.count
. Cela vous coûte en fait 4 octets.Minkolang 0.11 ,
2822 octetsEssayez ici.
Explication
Notez qu'il n'y a pas
N.
à la fin. C'est parce que je l'ai laissé au début. Lorsque l'entrée est vide, le décompte final est généré sous forme d'entier et le programme s'arrête.la source
Pyth, 13 octets
la source
Mathematica, 60 octets
la source
@#&
? C'est inutile (sauf siSequence
s sont impliqués, maisSequence
ne le sont pas.Script de forme , 26 octets
Comment ça se passe:
la source
C # 6, 18 +
9795 =115113 octets, aucune méthode de chaîne, LINQ excessifMérite vraiment d'être précédé de
Vous avez eu l'idée d'utiliser la réponse de ProgramFOX
x<95?1:-1
au lieu dex=='^'?1:-1
Coïncidences:
la source
C:
6766 octetsjoué au golf:
ungolfed:
la source
Go, 179 octets
Une solution extrêmement naïve.
Ungolfed:
la source
Perl 5, 41 octets
40 octets, plus 1 pour
-p
/(.)\1*$/;
compare la chaîne d'entrée à l'expression régulière/(.)\1*$/
, c'est-à-dire qu'elle se termine par un seul caractère répété un nombre ≥1 fois.Si c'est le cas,
$&
est la chaîne de répétition entière et$1
est le caractère; sinon (c’est-à-dire que la chaîne en entrée est vide), ces deux variables sont la chaîne vide.$1=~v?-1:1
se compare$1
à l'expression régulièrev
et renvoie -1 si elle correspond et 1 sinon.Et multipliez ce ± 1 par
(length$&)%2
la longueur de$&
modulo 2.la source
05AB1E ,
141211 octetsPort de @ Sp3000 's Gol> <> répondre .
NOTE: @Grimy a déjà posté une alternative plus courte de 8 octets pour 05AB1E , assurez-vous donc de lui donner son vote!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
05AB1E , 8 octets
Essayez-le en ligne!
Solutions alternatives avec la même longueur:
u㤮öÓÆ(
,㤮ögÓÆ(
.la source
^^ -> 0
CJam,
2724 octetsEssayez-le en ligne .
Tout ce que j'ai retenu de la réponse de Dennis est
g
(fonction de signe).la source
Ruby, 43 ans
9-i/11
évalue à 1 ou -1 lorsque les codes ascii de^
(94) ouv
(118) sont spécifiésDans le programme de test:
la source