Stack Exchange Vote Simulator


73

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสตริงเท่านั้นที่มีตัวอักษร^และv(คุณสามารถสมมติว่าจะไม่มีตัวละครอื่น ๆ ) อ่านจากซ้ายไปขวาสตริงนี้แสดงลำดับของการคลิกเมาส์ของผู้ใช้คนเดียวในขณะที่ดูคำถามหรือคำตอบของExchange Exchangeเป็นครั้งแรก

ทุกคน^แสดงให้เห็นถึงการคลิกปุ่มupvoteและทุกคนvแสดงให้เห็นถึงการคลิกปุ่มdownvote (สำหรับตัวอย่างการทำงานให้มองไปทางซ้ายเล็กน้อย)

สมมติว่าไม่มีข้อ จำกัด การลงคะแนนมีผลบังคับใช้ดังนั้นการคลิกทั้งหมดจะได้รับการลงทะเบียนอย่างถูกต้อง
พิมพ์หรือส่งคืน:

  • 1หรือ+1ถ้าโพสต์ท้ายจะถูก upvoted
  • 0หากโพสต์ท้ายไม่ได้รับการโหวต ( -0และ+0ไม่ถูกต้อง)
  • -1 หากโพสต์ท้ายถูก downvote

โพสต์เริ่มต้นด้วยศูนย์โหวตสุทธิจากผู้ใช้และปุ่มเปลี่ยนคะแนนโหวตสุทธิดังนี้:

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ:

[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
อะไร? ไม่มีการลงคะแนนด้าน? Geoborts และ Seadrus เศร้า
เครื่องมือเพิ่มประสิทธิภาพ

25
เรียนผู้พัฒนา SE Secret: ขอแสดงความยินดีกับการทำให้ชุมชนของคุณประสบความสำเร็จในการปรับปรุงเว็บไซต์ให้กับคุณ ... ;)
โดย

1
ฉันนำแสดงโดยในตารางตัวอย่างมาระยะหนึ่งแล้วและยังไม่ได้รับกรณีทดสอบ โพสต์ที่มีคะแนน 1 ได้รับการโหวตและจากนั้นมีคะแนน 0 และโพสต์ที่มีคะแนน 0 ลุกขึ้นโหวตให้มีคะแนน 1 และโพสต์ที่มีคะแนน -1 ได้รับเพิ่มขึ้น - โหวตให้มีคะแนน 1 ดังนั้น^ตัวละครสามารถทำให้คะแนนเปลี่ยนเป็น -1, +1 หรือ +2 ได้หรือไม่ ฉันหนาแน่นที่ไหน เกิดอะไรขึ้น?
แบรด

4
@Brad ฉันขอแนะนำให้คุณลองดำเนินการกับโพสต์จริง ๆ (เช่นคำถามนี้เอง) การโพสต์โพสต์ที่คุณโพสต์ไว้แล้วยกเลิกการโพสต์ เช่นเดียวกันกับ downvoting
งานอดิเรกของ Calvin

6
ฉันสงสัยว่าการโหวตตามเวลาจริงของคำถามนี้คืออะไร ฉันยินดีที่จะเดิมพันผู้คนจำนวนมากใช้คำถามนี้เป็นกรณีทดสอบ
MikeTheLiar

คำตอบ:


35

Gol> <> 0.3.11 , 13 12 11 ไบต์

iEh`^=:@)+M

ลองมันออนไลน์ แม้ว่าสิ่งนี้จะใช้ได้ดีในการอัปเดตครั้งต่อไป แต่ฉันได้ระบุไว้ว่าเป็น 0.3.11 ในกรณีนี้

คำอธิบาย

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

โปรดทราบว่าการใช้งานครั้งแรกของการ@ดึง 0 จากด้านล่างของสแต็กเพื่อเริ่มต้นการนับคะแนนสำหรับการวนซ้ำครั้งแรก

เพื่อแสดงให้เห็นถึงตารางเต็ม:

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
.... แดง! ทำได้ดีนี่!
El'endia Starman

22

รหัสเครื่อง x86, 24 ไบต์

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

นี่คือฟังก์ชั่นที่ใช้แบบแผนการเรียก fastcall ซึ่งรับสายและส่งกลับจำนวนเต็ม 8 บิต

ฉันทดสอบด้วยโปรแกรม C ต่อไปนี้ซึ่งจะต้องรวบรวมสำหรับโหมด 32 บิต

#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;
}

สิ่งนี้ได้รับอนุญาตหรือไม่? ฉันหมายถึงฉันสามารถเขียนสิ่งทั้งหมดใน C และเพียงแค่บอกว่ารหัส C ต้องใช้ไฟล์ที่ว่างสำหรับการปฏิบัติงานในขณะที่บอกว่ารหัสของฉันเป็นกรอบการทำงานทำให้รหัสของฉันกลายเป็น 0bytes เหตุใดจึงแตกต่างจากโซลูชันของคุณ
Zaibis

@Zaibis เพราะโซลูชันของฉันมีรหัสที่แก้ปัญหาได้หรือไม่ ดูmeta.codegolf.stackexchange.com/a/1071/30688
feersum

21

JavaScript (ES7), 47 46 44 43 37 36 ไบต์

ข้ามออก 44 ยังคงเป็นปกติ 44 :(

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

sช่วยให้รวมการทำงานใน ใช้การfor ofวนซ้ำเพื่อวนซ้ำอักขระแต่ละตัวในสตริงและการอัพเดตsตามอักขระปัจจุบันและค่าก่อนหน้า

การแก้ไข: แข็งแรงเล่นกอล์ฟไป~s&&-1 !~s-1นิพจน์นี้ต้องเท่ากับ 0 ถ้าsเท่ากับ -1 และ -1 บันทึกแล้ว 6 ไบต์ขอบคุณ @nderscore

นิพจน์ทำงานอย่างไร:

 ~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
ฉันได้ลงไปที่ 37 bytes:v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
ขีดล่าง

@ ขีด จำกัด เฮ้เยี่ยมมาก ฉันคิดว่าตัวแปรพิเศษนั้นเงอะงะ แต่ไม่คิดว่าฉันจะกำจัดมันได้
intrepidcoder

1
เดินออก 44 ยังคงเป็นปกติ 44 ...
Rɪᴋᴇʀ

ไม่ได้ลบอาร์เรย์ความเข้าใจออกจากข้อมูลจำเพาะหรือไม่
MayorMonty

8

CJam, 18 14 ไบต์

เวอร์ชันที่อัปเดตพร้อมการปรับปรุงที่สำคัญโดยเดนนิส:

0'jqf{-g_@=!*}

ลองออนไลน์

คำอธิบาย:

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

Befunge 93 - 55 bytes

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

52 ตัวอักษรและ 3 บรรทัดใหม่

ทดสอบกับล่ามนี้

jเป็นเท่ากันจาก^และvใน ASCII จึงนำมาใช้เพื่อให้การแปลงทางคณิตศาสตร์ในที่สุดมากกว่าการบริโภคพื้นที่เงื่อนไข


7

brainfuck, 146 ไบต์

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

โปรแกรมนี้ใช้แต่ละไบต์ของการป้อนข้อมูลและเปรียบเทียบกับที่ผ่านมา หากพวกเขาเหมือนกันมันจะทิ้งอินพุตและเก็บ "0" เป็น "อินพุตก่อนหน้า" มิฉะนั้นจะบันทึกตามปกติ

หากผลลัพธ์สุดท้ายคือvมันจะพิมพ์-ออกมา หากผลลัพธ์สุดท้ายไม่ใช่ศูนย์จะเพิ่ม 1 ลงในเซลล์ว่าง ในที่สุดจะมีการเพิ่ม 48 ในเซลล์นั้นและจะถูกพิมพ์


7

Javascript ES6, 91 48 ตัวอักษร

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

คำอธิบาย: จบลงโดยundefinedd

ทดสอบ:

` -> 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)

ประวัติคำตอบ:

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)

ทำซ้ำผ่านฟังก์ชั่นอัพเดท

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

ที่ใช้ในการนับคะแนนเสียงปัจจุบันxและตัวละครใหม่cและเอาท์พุทนับคะแนนใหม่

ความคิดที่จะใช้งูหลาม 2 cmpฟังก์ชั่นซึ่งเปรียบเทียบสอง args และช่วยให้-1, 0, 1สำหรับ<, ==, >ตามลำดับ คนชั้นในcmp('u',c)ให้-1สำหรับvและ1เพื่อ^; ตัวอักษรใด ๆ 'u'ระหว่างพวกเขาพอเพียงสำหรับ ด้านนอกหนึ่งแล้วเปรียบเทียบที่xซึ่งจะช่วยให้cmp(1,x)สำหรับ^และcmp(-1,x)สำหรับvที่มีค่าที่เหมาะสม

การทำซ้ำโดยตรงคือ 3 ตัวอักษรอีกต่อไป (52) แต่จะเป็นหนึ่งตัวอักษรสั้น (48) หากinput()อนุญาตให้มีเครื่องหมายคำพูด

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

ฟังก์ชั่นเรียกซ้ำที่ดีที่สุดที่ฉันพบคือถ่านอีกต่อไป (50)

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

5

อารัมภบท159 152 ไบต์

รหัส:

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).

ทดสอบด้วยตัวเอง:
Online Interpreter ที่นี่

ตัวอย่าง

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

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

แก้ไข:บันทึกแล้ว 7 ไบต์โดยยกเลิกการรวมคำสั่ง r กับ


อืมมม ดูเหมือนว่าคุณสามารถบันทึกได้ไม่กี่ไบต์โดยการกำหนดตัวดำเนินการใหม่แทนการกำหนดฟังก์ชั่น (หากนับว่าเป็นฟังก์ชั่นภายใต้กฎของ PPCG?)
ASCII เท่านั้น

@ ASCII เท่านั้น: ใช่ ไม่ได้เรียนรู้เคล็ดลับว่าเมื่อผมเขียนนี้ :)
Emigna

4

CJam, 16 ไบต์

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

สิ่งนี้จะผิดพลาดหลังจากการพิมพ์0ถ้ามี ข้อผิดพลาดสามารถถูกระงับได้ด้วยล่าม Java หากคุณลองใช้งานออนไลน์อย่าเพิกเฉยต่อทุกสิ่งยกเว้นบรรทัดสุดท้ายของผลลัพธ์

มันทำงานอย่างไร

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 ไบต์

ยังค่อนข้างใหม่กับสิ่งที่รหัสกอล์ฟนี้

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

แก้ไข:แก้ไขพฤติกรรมที่ไม่ถูกต้อง
แก้ไข 2:ขอบคุณ @MorganThrapp สำหรับการลบจำนวนมาก


แปลก. ฉันจะดูมัน
DJgamer98

ปรากฎว่าฉันลืม ^ ที่ถูกต้องแล้วพฤติกรรม v (และในทางกลับกัน)
DJgamer98

กำลังลบโพสต์จนกว่าจะได้รับการแก้ไข
DJgamer98

มันควรจะทำงานตอนนี้
DJgamer98

1
การเยื้องนั้นค่อนข้างไม่ถูกต้องฉันแนะนำการแก้ไขด้วยการเยื้องที่ถูกต้อง คุณไม่สามารถจัดรูปแบบรหัสในความคิดเห็นดังนั้นจึงเป็นความผิดพลาดของฉัน
Morgan Thrapp

4

JavaScript (ES6), 64 59 58 52 ไบต์

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

สิ่งนี้อยู่บนพื้นฐานของการสังเกตว่าการยืดออกไปซ้ำ ๆ ( ^หรืออย่างใดอย่างหนึ่งv) ครั้งสุดท้ายมีผลต่อผลลัพธ์

ขอบคุณNeilสำหรับการเล่นกอล์ฟขนาด 6 ไบต์


1
ทำไมคุณต้องมีการจับกุม? ดูเหมือนว่าf=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2พอเพียงกับฉัน
Neil

@ Neil: ฉันไม่ได้ตระหนักถึงอาร์เรย์ที่ถูกบังคับให้องค์ประกอบแรกใน>หรือ<ผู้ประกอบการ ขอบคุณสำหรับเคล็ดลับ
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

ไม่มีการบีบบังคับประเภทใดเลยฉันแค่ย้ายสิ่ง[0]ที่อาจทำให้คุณสับสน
Neil

@ นิล: โอ้ฉันสับสนจริงๆ ฉันไม่ได้ตระหนักว่าคุณได้ย้ายเข้าไปข้างในฉันคิดว่ามันเป็นf=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2ซึ่งทำงานได้เนื่องจากการข่มขู่ด้วยอาร์เรย์
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

4

Haskell, 40 ไบต์

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

คุณสามารถตัดช่องว่างทั้งหมดโดยการกำหนดเป็นฟังก์ชั่นมัดf %นอกจากนี้ผมคิดว่าอาจจะเป็นv _
xnor

ที่จริงไม่ได้นี้ให้-1สำหรับvvแทน 0?
xnor

โอ้ฉันมักจะลืมเกี่ยวกับมัด ขอบคุณสำหรับจุดที่พลาดการผกผันด้านใน
Leif Willerts

บันทึก 3 ตัวอักษรโดยแทนที่บรรทัดที่สาม (15 ตัวอักษร) ด้วย1%_=-1 _%_=0, 12 ตัว
Kevin Reid

โอเคตอนนี้มันสั้นลงแล้ว
Leif Willerts

4

สกาลา, 75 ไบต์

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

ทดสอบฟังก์ชั่นการใช้งาน

  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
ยินดีต้อนรับสู่ PPCG! คุณช่วยเพิ่มคำอธิบายและ / หรือรุ่นที่ไม่ได้เสริมได้ไหม?
Addison Crump

3

APL, 17

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

สำหรับล่ามที่ไม่มีเครื่องหมายทางแยก (เช่น GNU APL) ก็จะเป็น{⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞(19) นี่อาจเป็นวิธีที่น่าเบื่อที่สุดสำหรับการแก้ปัญหาที่เป็นไปได้เพราะทำงานได้โดยตรงจากคำจำกัดความของปัญหา


3

Ruby, 41 35 ไบต์

regex เฉพาะปุ่มสุดท้ายที่กดเท่านั้นที่น่าสนใจดังนั้นให้ตรวจสอบความยาวของปุ่มนั้น แล้วเปรียบเทียบกับ"a"(หรือตัวอักษรใด ๆ ระหว่าง^และv) ที่จะได้รับหรือ1-1

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

3

C # 6, 18 + 80 = 98 ไบต์

ต้องมี:

using System.Linq;

ฟังก์ชั่นที่เกิดขึ้นจริง:

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

วิธีการทำงาน: รหัสแรกเอาทุกอย่างก่อนที่สุดท้ายหรือ^^ vvเนื้อหานั้นไม่เกี่ยวข้องเนื่องจากการคลิกปุ่มเดิมสองครั้งจะเป็นการยกเลิกการลงคะแนนของคุณ มันเป็นเช่นนี้โดยแยกบน^^และvvและการถ่ายรายการสุดท้าย หากรายการนี้เป็นสตริงว่างเปล่า ( .Length<1) ฟังก์ชันจะส่งคืน0เนื่องจากการลงคะแนนทั้งหมดถูกยกเลิก หากสตริงนั้นไม่ว่างเปล่ามันก็จะดูที่อักขระตัวสุดท้ายของสตริงเดิม: มันจะแทนที่การโหวตก่อนหน้านี้ทั้งหมด ถ้ารหัสถ่านมีขนาดเล็กกว่า 95 แล้วมันจะเป็น 94, ^ดังนั้นมันกลับมิฉะนั้น1-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]

นี่ไม่ได้พิมพ์อะไรเลย
Morgan Thrapp

ทำงานในล่ามของฉันมันแสดงผลลัพธ์ของบรรทัดสุดท้าย
wnnmaw

นั่นเป็นเพราะคุณกำลังใช้งานมันใน REPL คุณต้องจัดเตรียมโปรแกรมแบบเต็มซึ่งจะทำงานนอก REPL
Morgan Thrapp

นอกจากนี้คุณยังสามารถย่อให้(-1,(1,0)[n==0])[n>0]เหลือน้อยที่สุดเพื่อประหยัด 10 ไบต์ a=str.countนอกจากนี้ยังไม่ได้ใช้ มีค่าใช้จ่าย 4 ไบต์
Morgan Thrapp

สิ่งนี้จะสร้าง -1 สำหรับ n = 0 แต่มีไวยากรณ์ที่ยอดเยี่ยม
wnnmaw

2

Minkolang 0.11 , 28 22 ไบต์

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

ลองที่นี่

คำอธิบาย

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)

โปรดทราบว่าไม่มีN.ที่สิ้นสุด นั่นเป็นเพราะฉันปล่อยให้มันพันรอบจุดเริ่มต้น เมื่ออินพุตว่างการนับครั้งสุดท้ายจะถูกส่งออกเป็นจำนวนเต็มและโปรแกรมหยุด




2

สคริปต์รูปร่าง , 26 ไบต์

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

มันทำงานอย่างไร:

"^"$     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 ไบต์, ไม่มีเมธอดสตริง, LINQ มากเกินไป

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

สมควรที่จะได้รับการนำหน้าอย่างแท้จริง

using System.Linq;

มีความคิดของการใช้x<95?1:-1แทนx=='^'?1:-1จากคำตอบของ ProgramFOX

บังเอิญ:

  • ปรับแต่งฉันขโมยใช้ประโยชน์จากการเปรียบเทียบกับ 95 - จำนวนไบต์ไม่รวมคำสั่งการใช้งานโดยใช้ปรับแต่งดังกล่าว
  • ผลรวมของตัวเลขของจำนวนไบต์ทั้งหมดเท่ากับจำนวนหลักของจำนวนไบต์ทั้งหมดที่เขียนเป็นตัวเลขโรมัน

2

C: 67 66 ไบต์

แข็งแรงเล่นกอล์ฟ:

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++;
    }
}

สิ่งนี้จะไม่ส่งคืนผลลัพธ์ มันไม่ผ่านการทดสอบทั้งหมด
Robert Andrzejuk

2

ไป, 179 ไบต์

มากวิธีการแก้ปัญหาที่ไร้เดียงสา

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)}

Ungolfed:

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 ไบต์

40 ไบต์, บวก 1 สำหรับ -p

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

/(.)\1*$/;เปรียบเทียบสตริงอินพุตกับ regex /(.)\1*$/คือดูว่ามันลงท้ายด้วยอักขระตัวเดียวทำซ้ำจำนวน≥1ครั้ง

ถ้าเป็นเช่นนั้น$&คือสตริงการทำซ้ำทั้งหมดและ$1เป็นอักขระ มิฉะนั้น (เช่นสตริงอินพุตว่างเปล่า) ตัวแปรสองตัวนั้นเป็นสตริงว่าง

$1=~v?-1:1เปรียบเทียบ$1กับ regex vและส่งคืน −1 หากตรงกับและ 1 เป็นอย่างอื่น

และคูณนั้น± 1 โดย(length$&)%2ความยาวของ$&โมดูโล 2


2

05AB1E , 14 12 11 ไบต์

Îvy'^QDŠ‹+<

ท่าเรือ@ SP3000 > คำตอบของกอล>

หมายเหตุ: @Grimyโพสต์ทางเลือก 8 ไบต์ที่สั้นกว่าสำหรับ 05AB1Eแล้วดังนั้นอย่าลืมโหวตขึ้น!

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Î            # 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 ไบต์

㤮öÓÆ.±

ลองออนไลน์!

โซลูชันทางเลือกที่มีความยาวเท่ากัน: u㤮öÓÆ(, 㤮ögÓÆ(.


1
มันใช้งานไม่ได้ ทั้งรหัสที่คุณโพสต์และรหัสในลิงค์ TIO (ซึ่งแตกต่างกัน) คำนึงถึงคะแนนโหวตเช่น^^ -> 0
Emigna

@ Emigna ขอบคุณที่ชี้ให้เห็น! ฉันแก้ไขรหัสมันยังมีขนาด 8 ไบต์
Grimy


1

ทับทิม, 43

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

9-i/11หาค่าเป็น 1 หรือ -1 เมื่อได้รับรหัส ascii ของ^(94) หรือv(118)

ในโปรแกรมทดสอบ:

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

g=gets.chomp
puts f[g]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.