Stack Exchange Vote Simulator


73

Tulis program atau fungsi yang hanya menggunakan karakter yang berisi string ^dan v(Anda dapat mengasumsikan tidak akan ada karakter lain). Baca dari kiri ke kanan string ini mewakili urutan klik mouse yang dilakukan pengguna tunggal saat melihat pertanyaan atau jawaban Stack Exchange untuk pertama kalinya.

Setiap ^mewakili klik tombol upvote dan setiap vmewakili klik tombol downvote . (Untuk contoh yang berfungsi terlihat sedikit ke kiri.)

Asumsikan bahwa tidak ada batasan suara yang berlaku sehingga semua klik terdaftar dengan benar.
Cetak atau kembali:

  • 1atau +1jika postingan akhirnya diunggulkan.
  • 0jika pos akhirnya tidak terpilih. ( -0dan +0tidak valid)
  • -1 jika postingan akhirnya downvoted.

Posting dimulai dengan nol suara bersih dari pengguna dan tombol mengubah suara bersih sebagai berikut:

Net Votes Before    Button Pressed    Net Votes After
1                   ^                 0
1                   v                 -1
0                   ^                 1
0                   v                 -1
-1                  ^                 1
-1                  v                 0

Kode terpendek dalam byte menang.

Kasus uji:

[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

14
Apa? tidak ada pemilihan sisi? Geobort dan Seadrus sedih
Pengoptimal

25
Pengembang SE Secret Secret: Selamat telah berhasil membohongi komunitas Anda sendiri untuk membuat perbaikan situs untuk Anda ...;)
thanby

1
Saya telah membintangi tabel contoh untuk sementara waktu sekarang dan saya masih belum mendapatkan test case. pos dengan skor 1 mendapat suara dan kemudian memiliki skor 0. Dan pos dengan skor 0 mendapat suara untuk memiliki skor 1. Dan pos dengan skor -1 mendapat- memilih memiliki skor 1. Jadi ^karakter dapat menyebabkan perubahan skor -1, +1 atau +2? Apakah saya padat di mana? Apa yang sedang terjadi?
Brad

4
@Brad Saya sarankan Anda mencoba tindakan dengan beberapa posting aktual (mis. Pertanyaan ini sendiri). Memvoting sebuah pos yang telah Anda undian dibatalkan membatalkan unduhan. Sama dengan downvoting.
Hobi Calvin

6
Saya ingin tahu apa suara waktu-nyata pada pertanyaan ini. Saya berani bertaruh banyak orang menggunakan pertanyaan ini sebagai ujian.
MikeTheLiar

Jawaban:


35

Gol> <> 0.3.11 , 13 12 11 byte

iEh`^=:@)+M

Cobalah online . Meskipun ini akan berfungsi dengan baik di pembaruan berikutnya, saya telah mencantumkannya sebagai 0.3.11 untuk berjaga-jaga.

Penjelasan

i               Read char
 Eh             If EOF, halt and output top of stack as num
   `^=          Push 1 if char is ^, else 0
      :@        Dup and rotate, giving [is^ is^ votecount]
        )       Compare greater than, pushing 1 or 0 as appropriate
         +M     Add and subtract 1

Perhatikan bahwa penggunaan pertama @menarik 0 dari bagian bawah tumpukan untuk menginisialisasi penghitungan suara untuk iterasi pertama

Untuk menggambarkan dengan tabel lengkap:

Votes before    Button    Is ^?    Compare <    Add     Subtract 1
     1            ^         1         0          1          0
     1            v         0         0          0         -1
     0            ^         1         1          2          1
     0            v         0         0          0         -1
    -1            ^         1         1          2          1
    -1            v         0         1          1          0

1
.... dang! Yang bagus!
El'endia Starman

22

kode mesin x86, 24 byte

31 C0 8A 11 84 D2 75 07 C0 E0 02 C0 F8 06 C3 41 38 C2 74 EC 88 D0 EB EA

Ini adalah fungsi menggunakan konvensi pemanggilan panggilan cepat, yang mengambil string dan mengembalikan integer 8-bit.

Saya mengujinya dengan program C berikut, yang harus dikompilasi untuk mode 32-bit.

#include <stdio.h>
#include <inttypes.h>

 __attribute__ ((aligned (16))) const unsigned char fun[] = {

    0x31,  //xor eax,eax
        0xC0,
    0x8A, //mov [ecx],dl
        1 | 2<<3,
    0x84, //test dl, dl
        0xC0 | 2<<3 | 2,
    0x75, // jnz
        7,
    0xC0, //shl al 2
        0xC0 | 4<<3,
        2,
    0xC0, //sar al 6
        0xC0 | 7<<3,
        6,
    0xC3, //ret
    0x41, //inc ecx
    0x38, //cmp al,dl
        0xC0 | 2,
    0x74, //je
        -20,
    0x88, //mov dl,al
        0xC0 | 2<<3,
    0xEB, //jmp
        -22,
};

int main()
{
    __fastcall int8_t (*votesimulator)(char*) = fun;
    char* s[] = {
        "",
        "^^",
        "^v",
        "^",
        "v",
        "v^",
        "vv",
        "^^^",
        "vvv",
        "^^^^",
        "vvvv",
        "^^^^^",
        "vvvvv",
        "^^^^^^",
        "vvvvvv",
        "^^v",
        "^v^",
        "^vv",
        "vv^",
        "v^v",
        "v^^",
        "^vvv^^vv^vv^v^",
        "^vvv^^vv^vv^v^^",
        "^vvv^^vv^vv^v^^^",
        "^vvv^^vv^vv^v^^v",
        "^vvv^^vv^vv^v^^vv",
        "^vvv^^vv^vv^v^^vvv",
        "^vvvvvvvvvvvv",
        "^^vvvvvvvvvvvv",
        "^^^vvvvvvvvvvvv",
        "vvv^^^^^^^^^^^^",
        "vv^^^^^^^^^^^^",
        "v^^^^^^^^^^^^",
    };

    for(int i = 0; i < sizeof(s)/sizeof(*s); i++)
        printf("%d\n", votesimulator(s[i]));

    printf("\n%d\n", sizeof(fun));
    for(int i = 0; i < sizeof(fun); i++)
        printf("%02X ", fun[i]);
    return 0;
}

Apakah ini diizinkan? Maksudku, aku juga bisa menulis semuanya dalam C dan hanya mengatakan kode C memerlukan file kosong untuk melakukan tugas sambil mengatakan kode saya adalah kerangka kerja yang membuat kode saya menjadi 0bytes. Mengapa hal itu berbeda dari solusi Anda?
Zaibis

@Zaibis Karena solusi saya mengandung kode yang memecahkan tantangan? Lihat meta.codegolf.stackexchange.com/a/1071/30688 .
feersum

21

JavaScript (ES7), 47 46 44 43 37 36 byte

Dicoret 44 masih teratur 44 :(

s=>[for(x of s)s=x<"v"?s!=1:!~s-1]|s

Menyimpan total running s. Menggunakan for ofloop untuk beralih ke setiap karakter dalam string dan pembaruan sberdasarkan karakter saat ini dan nilai sebelumnya.

Suntingan: Diputar ~s&&-1ke !~s-1. Ekspresi ini harus sama dengan 0 jika ssama dengan -1 dan -1 jika tidak. Disimpan 6 byte berkat @nderscore.

Cara ekspresi bekerja:

 ~s    // Bitwise inverse. ~s==0 only if s==-1
!      // Logical negate. Casts to boolean. Equivalent to s==-1
   -1  // Subtract. Casts to number so true-1 is 1-1 and false-1 is 0-1

3
Saya turun ke 37 byte:v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
nderscore

@nderscore Hei, bagus sekali. Saya pikir variabel ekstra itu canggung, tetapi tidak berpikir saya bisa menghilangkannya.
intrepidcoder

1
Dicoret 44 masih teratur 44 ...
R

Bukankah pemahaman array dihapus dari spec?
MayorMonty

8

CJam, 18 14 byte

Versi terbaru dengan peningkatan signifikan yang disumbangkan oleh Dennis:

0'jqf{-g_@=!*}

Cobalah online

Penjelasan:

0     Start value for running total.
'j    Push character between '^ and 'v for use in loop.
q     Get input.
f{    Apply block with argument to all input characters.
  -     Subtract character from 'j. This will give -12 for '^, 12 for 'v.
  g     Signum, to get 1 for '^, -1 for 'v, which is our increment value.
  _     Copy increment value.
  @     Bring running total to top.
  =     Compare. This will give 1 for the -1/-1 and 1/1 combinations where the new
        running total is 0. Otherwise, the new running total is the increment value.
  !     Negate to get 0 for the -1/-1 and 1/1 cases.
  *     Multiply result with increment value, to get new running total.
}     End block applied to input characters.

7

Melewati 93 - 55 byte

vj#p01:>#<:1+|
>~:10g-|v:g25<
^p01"j"<1^   <
./*34-g0<@

52 karakter dan 3 baris baru.

Diuji pada penerjemah ini .

Ini jsama jauhnya dari ^dan vdi ASCI sehingga digunakan untuk melakukan konversi aritmatika pada akhirnya, daripada menggunakan ruang kondisional.


7

brainfuck, 146 byte

,[[>->+<<-]>[[-]>[<+>-]]>[-]<<[<],]----[>-----<--]--[>>+<<++++++]+>[<-]<[->>++.<++++[<------>-]]>[<+<<]----[>+++++<--]>[,+<]>>[<<]-[>+<-----]>---.

Program ini mengambil setiap byte input dan membandingkannya dengan yang terakhir. Jika mereka sama, itu membuang input dan menyimpan "0" sebagai "input sebelumnya", jika tidak maka simpan secara normal.

Jika hasil akhirnya adalah v, ia mencetak -. Jika hasil akhirnya adalah nol, 1 ditambahkan ke sel kosong. Akhirnya, 48 ditambahkan ke sel itu dan dicetak.


7

Javascript ES6, 91 48 karakter

s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)]

Penjelasan: undefineddiakhiri oleh d.

Uji:

` -> 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`
.split("\n").map(s => s.split(" -> "))
.every(([s,key]) => (s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)])(s)==key)

Jawab sejarah:

s=>({'':0,'^':1,v:-1}[s.replace(/^(.)\1(\1\1)*(?=.?$)|.*(.)(((?!\3).)\5)+/,"").substr(-1)])
s=>~~{'^':1,v:-1}[s.replace(/^(.)\1(\1\1)*(?=.?$)|.*(.)(((?!\3).)\5)+/,"").substr(-1)]
s=>~~{'^':1,v:-1}[s.replace(/^.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").substr(-1)]
s=>~~{'^':1,v:-1}[s.replace(/^.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/.*(.)(((?!\1).)\3)+|(.)\4(\4\4)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/.*(.)(((?!\1).)\3)+|((.)\5)*/,"").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/((.)\2)+/g,"!").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g,"!").slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g,0).slice(-1)]
s=>~~{'^':1,v:-1}[s.replace(/(.)\1/g).slice(-1)]

7

Python 2, 49

lambda s:reduce(lambda x,c:cmp(cmp('u',c),x),s,0)

Iterate melalui dengan fungsi pembaruan

lambda x,c:cmp(cmp('u',c),x)

yang mengambil hitungan suara saat ini xdan karakter baru cdan menghasilkan penghitungan suara baru.

Idenya adalah untuk menggunakan cmpfungsi Python 2 , yang membandingkan dua argumennya dan memberikan masing -1, 0, 1- <, ==, >masing. Yang batin cmp('u',c)memberi -1untuk vdan 1untuk ^; karakter apa pun di antara mereka cukup untuk 'u'. Yang luar kemudian membandingkannya dengan x, yang memberi cmp(1,x)untuk ^dan cmp(-1,x)untuk v, yang memiliki nilai yang benar.

Iterasi langsung adalah 3 karakter lebih lama (52), meskipun akan menjadi satu karakter pendek (48) jika mengambil input()dengan kutipan diizinkan.

x=0
for c in raw_input():x=cmp(cmp('u',c),x)
print x

Fungsi rekursif terbaik yang saya temukan adalah satu char lagi (50)

f=lambda s:len(s)and cmp(cmp('u',s[-1]),f(s[:-1]))

5

Prolog, 159 152 byte

Kode:

v(1,^,0).
v(1,v,-1).
v(0,^,1).
v(0,v,-1).
v(-1,^,1).
v(-1,v,0).
r(X,[H|T]):-T=[],v(X,H,Z),write(Z);v(X,H,Z),r(Z,T).
p(S):-atom_chars(S,L),r(0,L).

Uji sendiri:
Penerjemah Online di sini

Contoh

>p("^vvv^^vv^vv^v^^vvv").
-1

>p("^vvv^^vv^vv^v^")
1

Sunting: Disimpan 7 byte dengan menyatukan r-klausa dengan OR.


Hmm. Sepertinya Anda dapat menyimpan beberapa byte dengan mendefinisikan ulang operator alih-alih mendefinisikan fungsi (jika itu dianggap sebagai fungsi di bawah aturan PPCG?)
ASCII-only

@ Khusus ASCII: Ya. Belum belajar trik itu ketika saya menulis ini :)
Emigna

4

CJam, 16 byte

0re`W=(2%*c'a--g

Ini akan macet setelah mencetak 0 , jika ada. Kesalahan bisa ditekan dengan Java interpreter. Jika Anda mencoba ini secara online , abaikan segala sesuatu kecuali garis keluaran terakhir.

Bagaimana itu bekerja

0                e# Push a 0 on the stack.
 r               e# Read a whitespace-separated token from STDIN.
  e`             e# Perform run-length encoding.
    W=           e# Select the last [repetitions character] pair.
                 e# This will fail for the empty string, so the
                 e# interpreter will print the stack's only element (0).
      (          e# Shift out the number of repetitions.
       2%        e# Compute its parity.
         *       e# Create a string, repeating the character 1 or 0 times.
          c      e# Cast to character.
                 e# This will fail for a zero-length string, so the
                 e# interpreter will print the stack's only element (0).
           'a-   e# Subtract the character 'a' from '^' or 'v'.
              -  e# Subtract the difference (integer) from 0.
               g e# Apply the sign function.

4

Python 2, 177 159 72 byte

Masih agak baru untuk hal kode golf ini.

def v(s): 
 c=0 
 for i in s:c=((0,1)[c<1],(0,-1)[c>-1])[i=="^"] 
 return c

EDIT: Memperbaiki perilaku yang salah.
EDIT 2: Terima kasih @MorganThrapp untuk mencukur banyak byte.


Aneh. Saya akan memeriksanya.
DJgamer98

Ternyata saya lupa perilaku ^ lalu v yang benar (dan sebaliknya).
DJgamer98

Menghapus posting hingga diperbaiki.
DJgamer98

Seharusnya berfungsi sekarang.
DJgamer98

1
Lekukan itu tidak tepat, saya hanya menyarankan suntingan dengan lekukan yang tepat. Anda tidak dapat memformat kode dalam komentar, jadi itu salah pada saya.
Morgan Thrapp

4

JavaScript (ES6), 64 59 58 52 byte

f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2

Ini didasarkan pada pengamatan bahwa hanya bentangan terakhir dari pengulangan (salah satu ^atau v) yang mempengaruhi hasilnya.

Terima kasih kepada Neil untuk bermain golf 6 byte.


1
Mengapa Anda membutuhkan tangkapan? Menurut saya f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2sudah cukup.
Neil

@ Neil: Saya tidak tahu array dipaksa ke elemen pertama >atau <operator. Terima kasih atas tipsnya
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Tidak ada tipe paksaan yang terlibat, saya hanya memindahkan [0]yang mungkin membingungkan Anda.
Neil

@Neil: Oh, aku memang bingung. Saya tidak menyadari bahwa Anda telah memindahkannya ke dalam, saya pikir itu f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2, yang berfungsi karena mengetik paksaan dengan array.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4

Haskell, 40 byte

1%'^'=0
_%'^'=1
1%_=-1
_%_=0
v=foldl(%)0

Anda dapat memotong semua spasi dengan mendefinisikan fsebagai fungsi infiks %. Juga, saya pikir vbisa menjadi _.
xnor

Sebenarnya, tidak ini memberikan -1untuk vvbukan 0?
xnor

Oh, aku selalu lupa tentang infiks. Terima kasih atas tempatnya, melewatkan inversi batin.
Leif Willerts

Simpan 3 karakter dengan mengganti baris ketiga (15 karakter) dengan 1%_=-1 _%_=0, 12 karakter.
Kevin Reid

Oke benar, sekarang itu menjadi lebih pendek.
Leif Willerts

4

Scala, 75 byte

def d(s:String)=s./:(0){case(1,94)|(-1,'v')=>0;case(_,94)=> 1;case _=> -1}

Tes untuk fungsi yang diimplementasikan.

  object Util {
        def d(s: String) = s./:(0) { 
    case (1, '^') | (-1, 'v') => 0
    case (_, '^') => 1
    case (_, _) => -1
  }      
      def main(s: Array[String]): Unit = {
        println("1 == " + d("^vvv^^vv^vv^v^^^"))
        println("1 == " + d("^vvv^^vv^vv^v^"))
        println("-1 == " + d("^vvv^^vv^vv^v^^vvv"))
        println("0 == " + d("^^^vvvvvvvvvvvv"))
        println("0 == " + d("vvv^^^^^^^^^^^^"))
      }
    }

1
Selamat datang di PPCG! Bisakah Anda menambahkan penjelasan dan / atau versi yang tidak disunting?
Addison Crump

3

APL, 17

(⊣×≠)/⌽0,2-'^ '⍳⍞

Untuk penerjemah tanpa notasi garpu (seperti GNU APL), itu akan menjadi {⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞(19). Ini mungkin solusi yang paling membosankan karena ia bekerja langsung dari definisi masalah.


3

Ruby, 41 35 byte

Regex. Hanya menekan tombol terakhir yang menarik, jadi periksa panjangnya. Kemudian bandingkan dengan "a"(atau huruf apa saja antara ^dan v) untuk mendapatkan 1atau -1.

->s{s[/(.?)\1*$/].size%2*(?a<=>$1)}

3

C # 6, 18 + 80 = 98 byte

Membutuhkan:

using System.Linq;

Fungsi yang sebenarnya:

int S(string v)=>v.Split(new[]{"^^","vv"},0).Last().Length<1?0:v.Last()<95?1:-1;

Cara kerjanya: kode pertama menghapus semuanya sebelum ^^atau yang terakhir vv. Konten itu tidak relevan karena mengklik tombol yang sama dua kali akan selalu membatalkan suara Anda. Hal ini dilakukan dengan membelah pada ^^dan vvdan mengambil item terakhir. Jika item ini adalah string kosong ( .Length<1), maka fungsinya kembali 0karena semua suara telah dibatalkan. Jika string itu tidak kosong, maka itu hanya terlihat pada karakter terakhir dari string asli: itu akan menimpa semua suara sebelumnya. Jika kode char lebih kecil dari 95, maka itu akan menjadi 94 ^,, jadi ia mengembalikan 1, sebaliknya -1.


3

Python 2.7, 79 75 88

s=input()
print (0,(1,-1)[s[-1]=='v'])[len(s[s.rfind(('v^','^v')[s[-1]=='v'])+1:])%2!=0]

Ini sebenarnya tidak mencetak apa pun.
Morgan Thrapp

Menjalankannya dalam juru bahasa saya, itu menunjukkan output dari baris terakhir
wnnmaw

Itu karena Anda menjalankannya di REPL. Anda perlu menyediakan program lengkap yang akan bekerja di luar REPL.
Morgan Thrapp

Juga, Anda dapat mempersingkat terary itu (-1,(1,0)[n==0])[n>0]untuk menghemat 10 byte. Juga, jangan gunakan a=str.count. Sebenarnya biaya Anda 4 byte.
Morgan Thrapp

Itu menghasilkan -1 untuk n = 0, tapi sintaks keren
wnnmaw

2

Minkolang 0,11 , 28 22 byte

0$I2&N."j"o-34*:dr=,*!

Coba di sini.

Penjelasan

0                         Push a 0 (running total)
 $I                       Push length of input
   2&N.                   Output as integer and stop if this is 0
       "j"                Push 106
          o               Take character from input (94 for ^, 118 for v)
                          <<so ^ becomes +12 and v becomes -12>>
           -              Subtract
            34*:          Divide by 12
                d         Duplicate top of stack
                 r        Reverse stack
                  =,      Push 0 if equal, 1 otherwise
                    *     Multiply
                          <<this handles two of the same vote in a row>>
                     !    Unconditional trampoline (jumps the 0 at the beginning)

Perhatikan bahwa tidak ada N.pada akhirnya. Itu karena saya membiarkannya membungkus awal. Ketika input kosong, penghitungan akhir adalah output sebagai integer dan program berhenti.



2

Mathematica, 60 byte

Mod[#,2]Sign@#&@Tr@Last@Split@StringCases[#,{"^"->1,_->-1}]&

@#&? Itu tidak berguna (kecuali jika Sequenceterlibat, tetapi Sequencetidak terlibat.
CalculatorFeline

2

Bentuk Skrip , 26 byte

"^"$"0>1@-"~"v"$"0<1-"~0@!

Bagaimana itu wajan:

"^"$     split input on '^'
"
  0>         Check if the number is more than 0 (1 if true, 0 if false).
  1@-        subtract the answer from one.
"~       Join it back together, with this string in place of '^'
"v"$     Split on 'v'
"        
  0<         Check if 0 is more than the number (1 if true, 0 if false).
  1-         subtract one from the results
"~       Join it back together, with this string in place of 'v'
0@       add a zero to the stack and place it under the string just built. 
!        run the string as code

2

C # 6, 18 + 97 95 = 115 113 byte, tanpa metode string, LINQ yang berlebihan

int v(string s)=>(int)s.Reverse().TakeWhile((c,i)=>i<1||c==s[s.Length-i])?.Sum(x=>x<95?1:-1)%2;

Benar-benar layak didahului oleh

using System.Linq;

Punya ide menggunakan x<95?1:-1bukan x=='^'?1:-1dari jawaban ProgramFOX ini

Kebetulan:

  • Tweak yang saya curi memanfaatkan membandingkan dengan 95 - jumlah byte tidak termasuk pernyataan menggunakan, menggunakan kata tweak
  • Jumlah digit dari jumlah byte total sama dengan jumlah digit dari jumlah byte total yang ditulis sebagai angka romawi

2

C: 67 66 Bytes

golf:

void f(char *v){int i=0,c,s=0;for(;v[i]!=0;i++){v[i]>94?s--:s++;}}

ungolfed:

void f (char *v)
{
    int i = 0, c, s = 0;

    for (;v[i]!=0;i++)
    {
        v[i] > 94 ? s-- : s++;
    }
}

Ini tidak memberikan hasil. Itu tidak lulus semua tes.
Robert Andrzantai

2

Pergi, 179 byte

Sebuah sangat solusi naif.

package main
import(."fmt"."strings")
func main(){a:=""
i:=0
Scanln(&a)
b:=Split(a,"")
for _,e:=range b{switch i{case 1:i--
case 0:if e=="^"{i++}else{i--}
case-1:i++}}
Println(i)}

Tidak Disatukan:

package main

import (
    ."fmt"
    ."strings"
)

func main() {
    a := ""
    i := 0
    Scanln(&a)
    b := Split(a, "")
    for _, e := range b {
        switch i {
        case 1:
            i--
        case 0:
            if e == "^" {
                i++
            } else {
                i--
            }
        case -1:
            i++
        }
    }
    Println(i)
}

2

Perl 5, 41 byte

40 byte, ditambah 1 untuk -p

/(.)\1*$/;$_=((length$&)%2)*($1=~v?-1:1)

/(.)\1*$/;membandingkan string input ke regex /(.)\1*$/, yaitu melihat apakah string diakhiri dengan satu karakter yang diulang beberapa kali ≥1 kali.

Jika demikian, $&apakah keseluruhan string pengulangan dan $1merupakan karakter; jika tidak (yaitu string input kosong), kedua variabel tersebut adalah string kosong.

$1=~v?-1:1membandingkan $1dengan regex vdan mengembalikan −1 jika cocok dan 1 sebaliknya.

Dan kalikan itu ± 1 dengan (length$&)%2, panjang $&modulo 2.


2

05AB1E , 14 12 11 byte

Îvy'^QDŠ‹+<

Port of @ Sp3000 's Gol> <> answer .

CATATAN: @Grimy sudah memposting alternatif 8 byte yang lebih pendek untuk 05AB1E , jadi pastikan untuk membesarkannya!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Î            # Push 0 (later mentioned as `r`) and the input-string
 v           # Loop over the characters of the input:
  y'^Q      '#  Does the current character equal "^"?
             #  (results in 1 for truthy; 0 for falsey - later mentioned as `b`)
      D      #  Duplicate this result `b`
       Š     #  Triple swap (`r`,`b`,`b`) to (`b`,`r`,`b`)
            #  Check if the boolean `b` is smaller than the result-integer `r`
             #  (again results in 1 for truthy; 0 for falsey)
         +   #  Add them together
          <  #  Decrease this by 1
             # (Implicitly output the result-integer `r` after the loop)

2

05AB1E , 8 byte

㤮öÓÆ.±

Cobalah online!

Solusi alternatif dengan panjang yang sama: u㤮öÓÆ(, 㤮ögÓÆ(.


1
Ini tidak bekerja Baik kode yang Anda posting maupun kode di tautan TIO (yang berbeda) memperhitungkan suara akun seperti^^ -> 0
Emigna

@Emigna terima kasih telah menunjukkannya! Saya memperbaiki kode, masih 8 byte.
Grimmy


1

Ruby, 43

->s{a=0
s.bytes{|i|b=9-i/11;a=a!=b ?b:0}
a}

9-i/11mengevaluasi ke 1 atau -1 ketika diberi kode ascii dari ^(94) atau v(118)

Dalam program uji:

f=->s{a=0
s.bytes{|i|b=9-i/11;a=a!=b ?b:0}
a}

g=gets.chomp
puts f[g]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.