Napisz program lub funkcję, która pobiera ciąg zawierający tylko znaki ^
i v
(możesz założyć, że nie będzie innych znaków). Ten ciąg znaków odczytywany od lewej do prawej reprezentuje sekwencję kliknięć myszą wykonanych przez jednego użytkownika podczas przeglądania pytania lub odpowiedzi Stack Exchange po raz pierwszy.
Każde ^
oznacza kliknięcie przycisku głosowania , a każde v
oznacza kliknięcie przycisku głosowania . (Dla przykładów roboczych spójrz lekko w lewo.)
Załóżmy, że nie obowiązują żadne ograniczenia głosowania, więc wszystkie kliknięcia są rejestrowane poprawnie.
Wydrukuj lub zwróć:
1
lub+1
jeśli post zostanie ostatecznie oceniony.0
jeśli post nie zostanie poddany głosowaniu. (-0
i+0
nie są ważne)-1
jeśli post zostanie ostatecznie odrzucony.
Wpisy zaczynają się od zerowej liczby głosów netto od użytkownika, a przyciski zmieniają liczbę głosów w następujący sposób:
Net Votes Before Button Pressed Net Votes After
1 ^ 0
1 v -1
0 ^ 1
0 v -1
-1 ^ 1
-1 v 0
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe:
[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
źródło
^
postać może spowodować zmianę wyniku -1, +1 lub +2? Gdzie jestem gęsty? Co się dzieje?Odpowiedzi:
Gol> <> 0.3.11 ,
131211 bajtówWypróbuj online . Mimo że będzie to działać dobrze w następnej aktualizacji, na wszelki wypadek podałem ją jako 0.3.11.
Wyjaśnienie
Zauważ, że pierwsze użycie ciągu
@
ściąga 0 z dołu stosu, aby zainicjować liczenie głosów dla pierwszej iteracjiAby zilustrować pełnym stołem:
źródło
kod maszynowy x86, 24 bajty
Jest to funkcja korzystająca z konwencji wywoływania fastcall, która pobiera ciąg znaków i zwraca 8-bitową liczbę całkowitą.
Przetestowałem go za pomocą następującego programu C, który musi zostać skompilowany dla trybu 32-bitowego.
źródło
JavaScript (ES7),
474644433736 bajtówPrzekreślone 44 jest nadal regularne 44 :(
Utrzymuje bieżącą sumę w
s
. Wykorzystujefor of
pętlę do iteracji każdego znaku w ciągu i aktualizuje ws
oparciu o bieżący znak i poprzednią wartość.Edycje: Grał
~s&&-1
w golfa!~s-1
. To wyrażenie musi być równe 0, jeśli ws
przeciwnym razie będzie równe -1 i -1. Zaoszczędź 6 bajtów dzięki @nderscore.Jak działa to wyrażenie:
źródło
v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
CJam,
1814 bajtówZaktualizowana wersja ze znacznymi ulepszeniami wniesionymi przez Dennisa:
Wypróbuj online
Wyjaśnienie:
źródło
Befunge 93-55 bajtów
52 znaki i 3 nowe linie.
Testowany na tym tłumaczu .
j
Jest w równej odległości od^
iv
ASCII więc jest używany do konwersji arytmetycznych w końcu, zamiast kosmicznych zużywających warunkowych.źródło
pieprzenie mózgu, 146 bajtów
Ten program pobiera każdy bajt danych wejściowych i porównuje go z ostatnim. Jeśli są takie same, odrzuca dane wejściowe i zapisuje „0” jako „poprzednie dane wejściowe”, w przeciwnym razie zapisuje je normalnie.
Jeśli końcowy wynik jest
v
, drukuje się-
. Jeśli końcowy wynik był niezerowy, 1 dodaje się do pustej komórki. Na koniec do tej komórki dodaje się 48 i drukuje.źródło
JavaScript ES6,
9148 znakówObjaśnienie:
undefined
kończy się nad
.Test:
Historia odpowiedzi:
źródło
Python 2, 49
Iteruje za pomocą funkcji aktualizacji
, która pobiera bieżącą liczbę głosów
x
i nową postaćc
i generuje nową liczbę głosów.Chodzi o to, aby użyć Python 2 w
cmp
funkcję, która porównuje swoje dwa argumenty i daje-1, 0, 1
do<, ==, >
odpowiednio. Wewnętrznycmp('u',c)
daje-1
zav
i1
za^
; wystarczy każda postać między nimi'u'
. Zewnętrzny porównuje to z tymx
, co dajecmp(1,x)
za^
icmp(-1,x)
zav
, które mają odpowiednie wartości.Bezpośrednia iteracja była o 3 znaki dłuższa (52), choć byłaby krótsza o jeden znak (48), gdyby
input()
dozwolone było przyjmowanie cudzysłowów.Najlepsza funkcja rekurencyjna, jaką znalazłem, była o jeden znak dłużej (50)
źródło
Prolog,
159152 bajtówKod:
Sprawdź to sam:
Interpreter online tutaj
Przykład
Edycja: Zapisano 7 bajtów poprzez ujednolicenie klauzul r z OR.
źródło
CJam, 16 bajtów
Spowoduje to zawieszenie po wydrukowaniu 0 , jeśli dotyczy. Błąd można ukryć za pomocą interpretera Java. Jeśli spróbujesz tego online , zignoruj wszystko oprócz ostatniego wiersza wyników.
Jak to działa
źródło
Python 2,
177 15972 bajtówNadal trochę nowy w tej dziedzinie golfa.
EDYCJA: Naprawiono nieprawidłowe zachowanie.
EDYCJA 2: Dzięki @MorganThrapp za golenie dużej ilości bajtów.
źródło
JavaScript (ES6),
64595852 bajtówJest to oparte na spostrzeżeniu, że tylko ostatni odcinek powtórzenia (jednego
^
lub jednegov
) wpływa na wynik.Dzięki Neil za grę w golfa z 6 bajtów.
źródło
f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2
wystarczające.>
lub<
operatorze. Dzięki za wskazówki[0]
co mogło was pomylić.f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2
, co działa z powodu przymusu typu z tablicą.Haskell, 40 bajtów
źródło
f
jako funkcję infix%
. Myślę też, żev
może to być_
.-1
zavv
zamiast 0?1%_=-1
_%_=0
, 12 znaków.Scala, 75 bajtów
Test na zaimplementowaną funkcję.
źródło
APL, 17
Dla tłumaczy bez notacji widelca (jak GNU APL) byłoby to
{⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞
(19). Jest to prawdopodobnie najbardziej nudne z możliwych rozwiązań, ponieważ działa bezpośrednio od zdefiniowania problemu.źródło
Rubin,
4135 bajtówRegex. Interesujący jest tylko ostatni naciśnięty przycisk, więc sprawdź jego długość. Następnie porównaj go z
"a"
(lub dowolną literą pomiędzy^
iv
), aby uzyskać1
lub-1
.źródło
C # 6, 18 + 80 = 98 bajtów
Wymaga:
Rzeczywista funkcja:
Jak to działa: kod najpierw usuwa wszystko przed ostatnim
^^
lubvv
. Ta treść nie jest istotna, ponieważ dwukrotne kliknięcie tego samego przycisku zawsze anuluje Twój głos. Czyni to poprzez podział na^^
avv
i zrobieniu ostatniego elementu. Jeśli ten element jest pustym ciągiem (.Length<1
), funkcja zwraca,0
ponieważ całe głosowanie zostało anulowane. Jeśli ciąg nie jest pusty, to po prostu patrzy na ostatni znak oryginalnego ciągu: zastąpi wszystkie poprzednie głosy. Jeśli kod znaków jest mniejszy niż 95, wówczas będzie wynosił 94^
, więc w1
przeciwnym razie zwraca-1
.źródło
Python 2.7,
797588źródło
(-1,(1,0)[n==0])[n>0]
aby zaoszczędzić 10 bajtów. Nie używaj teża=str.count
. W rzeczywistości kosztuje to 4 bajty.Minkolang 0.11 ,
2822 bajtówWypróbuj tutaj.
Wyjaśnienie
Zauważ, że
N.
na końcu nie ma . To dlatego, że pozwoliłem temu zawinąć do początku. Gdy wejście jest puste, końcowy licznik jest wyprowadzany jako liczba całkowita, a program zatrzymuje się.źródło
Pyth, 13 bajtów
źródło
Mathematica, 60 bajtów
źródło
@#&
? To bezużyteczne (chybaSequence
że są zaangażowane, aleSequence
nie są zaangażowane.Skrypt kształtu , 26 bajtów
Jak to działa:
źródło
C # 6, 18 +
9795 =115113 bajtów, brak metod łańcuchowych, nadmierne LINQNaprawdę zasługuje na to, aby być poprzedzonym
Wpadł na pomysł wykorzystania
x<95?1:-1
zamiastx=='^'?1:-1
z odpowiedzią ProgramFOX zaKoincydencje:
źródło
DO:
6766 bajtówgrał w golfa:
bez golfa:
źródło
Idź, 179 bajtów
Skrajnie naiwne rozwiązanie.
Nie golfowany:
źródło
Perl 5, 41 bajtów
40 bajtów plus 1 dla
-p
/(.)\1*$/;
porównuje ciąg wejściowy z wyrażeniem regularnym/(.)\1*$/
, tzn. sprawdza, czy kończy się on pojedynczym znakiem powtarzanym pewną liczbę ≥1 razy.Jeśli tak,
$&
to cały ciąg powtórzeń i$1
znak; w przeciwnym razie (tzn. ciąg wejściowy jest pusty), te dwie zmienne są ciągiem pustym.$1=~v?-1:1
porównuje$1
do wyrażenia regularnegov
i zwraca -1, jeśli pasuje, a 1 w przeciwnym razie.I pomnóż to ± 1 przez
(length$&)%2
długość$&
modulo 2.źródło
05AB1E ,
141211 bajtówPort of @ Sp3000 's Gol> <> odpowiedz .
UWAGA: @Grimy opublikował już krótszą 8-bajtową alternatywę dla 05AB1E , więc upewnij się, że go głosujesz!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
05AB1E , 8 bajtów
Wypróbuj online!
Alternatywne rozwiązania o tej samej długości:
u㤮öÓÆ(
,㤮ögÓÆ(
.źródło
^^ -> 0
CJam,
2724 bajtówWypróbuj online .
Wszystko, co wziąłem z odpowiedzi Dennisa, to
g
(funkcja znaku).źródło
Ruby, 43
9-i/11
ocenia na 1 lub -1, gdy podano kody ascii^
(94) lubv
(118)W programie testowym:
źródło