Which side has more?

The challenge is to golf a program when given a string composed of any number of asterisks, then a comma, than any number of asterisks, say which side has more.

The asterisk-strings can be empty.

0 for ties.

1 for the left.

2 for the right.

Examples

Input: ***,**** Output: 2

Input: ***, Output: 1

Input: ***,*** Output: 0

Input: , Output: 0

Scoring

This is . Shortest answer wins.

• It seems this would be improved by loosening the output format—for example, allowing -1, 0, and 1 for the three possibilities, or really any three consistent outputs. Jun 8 '20 at 8:06
• I'm not sure that this is Ok at this stage (already 25 answers). Some of the existing answers (including my own) already made some effort to adhere to the originally-specified output format. Jun 8 '20 at 10:21
• @DominicvanEssen Alright, I will remove this option,
– nph
Jun 8 '20 at 10:22

Python 2, 25 bytes

lambda s:cmp(s[::-1],s)%3

Try it online!

///, 6064 28 bytes

/*,*/,//,*/2//*,/1//,/0//*//

Try it online!

Found out most of my program was unnecessary, -32 bytes.

I made this program when I was learning the language, and decided to post it as a question.

• Very cool language for the problem Jun 15 '20 at 10:35

05AB1E, 6 bytes

Â.S(3%

Try it online!

How?

Note that ',' is greater than '*'.

Â.S(3%
Â      - input, reversed(input) (say a, b)
.S    - compare: 1 if a > b; -1 if a < b; 0 if a = b
(   - negate
3  - push three
% - modulo
• Nice approach!! Jun 8 '20 at 0:14
• @LuisMendo Did you see dingledooper's Python answer?
– user92069
Jun 8 '20 at 0:47
• @Memberfor3months I hadn't seen it. Thanks! Jun 8 '20 at 10:11

C (gcc), 65 $$\\cdots\$$ 54 47 bytes

Saved a 10 bytes thanks to dingledooper!!!
Saved a byte thanks to ceilingcat!!!
Saved 7 bytes thank to l4m2!!!

f(c){c=strlen(c)-strspn(c,"*")*2;c=c>1?2:c!=1;}

Try it online!

• f(c){c=strlen(c)-strspn(c,"*")*2;c=c>1?2:c!=1;} if high address not used
– l4m2
Jun 15 '20 at 9:31
• @l4m2 Works on TIO, so I guess it's allowed - thanks! :D Jun 15 '20 at 10:13

Gema, 20 characters

*,*=@cmps{*;*;2;0;1}

Sample run:

Try it online!

APL (Dyalog Extended), 9 bytes

(⊥⍋|⍒)⊢⍮⌽

Try it online!

How it works

(⊥⍋|⍒)⊢⍮⌽  ⍝ left '*,' | right ',*' | equal ','
⊢⍮⌽  ⍝ Length-2 nested vector of self and reverse
⍋        ⍝ Grade up; order of indices to make it ascending-sorted
⍝ 1 2       | 2 1        | 1 2
⍒      ⍝ Grade down; order of indices to make it descending-sorted
⍝ 2 1       | 1 2        | 1 2
|       ⍝ Right modulo left
⍝ 0 1       | 1 0        | 0 0
⊥         ⍝ From base 2 to integer
⍝ 1         | 2          | 0
• How many bytes if you port my oK answer?
– mkst
Jun 15 '20 at 16:02
• @streetster APL doesn't have a built-in for "split at ','". Jun 26 '20 at 4:13

APL (Dyalog Unicode), 2019 13 bytesSBCS

Whooping -6 thanks to @Bubbler.

(⊃3|⍒-⍋)⊂,⊂∘⌽

Try it online! This should be golfable as there are some things I am repeating there but I am not sure how to do it yet.

APL (Dyalog Unicode), 19 bytesSBCS

{3|×1+(2×⍵⍳',')-≢⍵}

Try it online!

• 13 bytes using your second answer as the starting point. Jun 8 '20 at 7:05
• @Bubbler thanks for the step by step!
– RGS
Jun 8 '20 at 8:26
• I would be interested in understanding how my answer isn't helpful and the reason it got downvoted :)
– RGS
Jun 15 '20 at 10:41
• (1 of 2) 05AB1E, Jelly, Japt and (2 of 2) APL answers downvoted - I imagine someone does not think we're counting bytes, (only ones missing would be Charcoal and Stax, maybe they didn't go to page 2). Jun 15 '20 at 11:29
• @JonathanAllan that is weird, I even link the SBCS wiki page so people can rest assured I'm really counting bytes :/ these downvote floods always confuse me
– RGS
Jun 15 '20 at 11:31

JavaScript (ES6),  26  25 bytes

Saved 1 byte thanks to @tsh

Taking advantage of the looser output rules: this versions returns 0 for ties, undefined for left or * for right.

s=>(s+0)[s.search,*2+1]

Try it online!

JavaScript (ES6), 31 bytes

Returns a Boolean value instead of 0 / 1.

s=>([a,b]=s.split,,a<b?2:a>b)

Try it online!

• @Shaggy Do you mean other than the one I'm linking to in my answer? Jun 8 '20 at 10:23
• Christ! I really can't function without caffeine, can I?! :\ Jun 8 '20 at 11:36

Ruby -nl, 18 bytes

~/,/;p ($<=>$')%3

Try it online!

Takes input from STDIN. Compares the regex match groups $ and$', which are set equal to everything on the left and right of the comma, respectively.

Io, 51 bytes

Mod3 doesn't work in Io. Too bad.

method(x,I := -x compare(x reverse);if(I== -1,2,I))

Try it online!

brainfuck, 57 bytes

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

Try it online!

It spreads * on the tape and checks if the second branch went past the first.

(.*),\1$\*+ Try it online! If the right-hand-side has an equal or less number of *'s, then those *'s are removed from both sides, along with the ,. Then the number of runs of *'s are counted. Japt, 9 8 bytes Returns true/false instead of 1/0 >Ô?2:U<Ô >Ô?2:U<Ô :Implicit input of string U > :Greater than Ô : U reversed ? :If true 2 : Literal 2 : :Else U<Ô : U less than U reversed? Try it Original, 9 bytes 5 bytes just to handle the I/O requirements :\ q, mÊrÎu3 Try it q, mÊrÎu3 :Implicit input of string q, :Split on "," m :Map Ê : Length r :Reduce by Î : Sign of difference u3 :Positive modulo 3 If we could take a space delimited string as input then -2 bytes: ¸mÊrÎu3 If we could take an array as input then -1 more byte: mÊrÎu3 And, if we could use any 3 distinct values for the output then -2 more bytes: mÊrÎ Java 10, 7451 50 bytes s->(Long.signum(s.indexOf(44)*2-s.length()+1)+3)%3 -24 bytes thanks to @OlivierGrégoire. Try it online. Explanation: s->{ // Method with String parameter and long return-type Math.signum( // Take the signum of: s.indexOf(44) // The index of ',' (codepoint 44) *2 // multiplied by 2 -s.length() // Subtract the entire length of the input +1 // And add 1 +3) // Then increase that result by 3 %3 // And take modulo-3 on it • 51 bytes if double as result is accepted Jun 8 '20 at 15:20 • @OlivierGrégoire Oh, nice approach. Maybe you should post it as a separated answer, since it's completely different than what I currently have. :) Jun 8 '20 at 15:27 • @OlivierGrégoire Ah ok, from that 72 byter to your 51 byter makes indeed sense. If you don't want to post it, I will edit. Thanks! :) Jun 8 '20 at 15:43 • F.Y.I. I just noticed that Long.signum exists. It might be better than Math.signum so that there's not this trailing .0. Jun 8 '20 at 15:45 • A further byte can be saved by replacing "," with 44 (which is the codepoint for the comma). Jun 8 '20 at 17:00 Ruby -n, 21 20 bytes p (~/,/*2<=>~/.$/)%3

Try it online!

• That's cool! I think it's its own answer. Jun 9 '20 at 1:05
• Posted :) Jun 9 '20 at 2:46

J, 19 18 bytes

3|i.&','*@--:@<:@#

Try it online!

How it works

3|i.&','*@--:@<:@#
-:@<:@# halved (length-1) of list
(where , would be in a balanced list)
i.&','           position of the ,
*@-        signum'd difference between both
3|                 mod 3

Alternative version, 19 bytes

This inserts - and + between the bit mask of the string: **,* -> 1 1 0 1 -> 1 + (1 + (0 - 1))) to get the difference between both sides. Then both signum and mod 3 like other solutions.

3|[:*'*'-+@.[/@:=]

Try it online!

How it works

3|[:*'*'-+@.[/@:=]
'*'         =] '***,*' -> 1 1 1 0 1
-+@.[      a function that chooses - or + based on the left argument
/@:   puts this function inbetween: 1+(1+(1+(0-1))) = 2
[:*               signum: 2 -> 1
3|                  mod 3

Befunge-93, 31 bytes

2>1~:1+v
p^_"$"2 0 .@^-","_$2\-

Try it online!

After initially pushing 2 to the stack, we push 1 for every * we encounter. After finding the ,, we start popping them instead. When we run out of input we subtract the top of the stack from 2, resulting in the correct output values.

Excel,  44  40 Bytes

=MOD(3-SIGN(1+LEN(A1)-2*FIND(",",A1)),3)

Finds the difference between Total Length + 1 and twice the position of the comma (Negative: Left; Zero: Tie; Positive: Right), use SIGN to convert these into -1, 0 and 1. Then subtract this from 3 to give 4/0/2, and take the Modulo Base 3 (1, 0, 2)

Old version: 44 Bytes

=MID(102,2+SIGN(1+LEN(A1)-2*FIND(",",A1)),1)

Finds the difference between Total Length + 1 and twice the position of the comma (Negative: Left; Zero: Tie; Positive: Right), use SIGN to convert these into -1, 0 and 1, add 2 (1, 2, 3), and then use MID to take the first, second or third digit from 102, respectively.

(Using MID saved 3 bytes over using CHOOSE)

I also experimented with a more maths-based approach (Multiply the Sign by 1.5, round it in the Positive direction with CEILING, then take the Absolute value), but that was 51 bytes instead.

Python 3, 56 60 bytes

-4 bytes thanks to math junkie

A third approach to this in python.

def f(x):a,b=x.split(',');return(1,0,2)[((a<b)-(a>b))+1]

Try it online!

• You can remove some unnecessary whitespace: Try it online! Jun 10 '20 at 4:51

C (gcc) - 67 bytes

This is a complete program and can be compiled with gcc. Input is the first command line argument and output is the exit status.

main(u,v)int**v;{u=strlen(*++v)-strspn(*v,"*")*2;exit(u>1?2:u!=1);}

C (gcc), 83 bytes

x;f(char*z){char*Z,*W;for(Z=z;44-*Z++;);for(W=Z;*W++;)Z--;x=!!x*((x=z-Z+1)<0?1:2);}

Try it online!

C (gcc), 58 bytes

f(z,Z)long z,Z;{Z-=strlen(Z=index(z,44))+z-1;z=Z<0?2:!!Z;}

Try it online!

• @ceilingcat Thank you. Jun 11 '20 at 22:43

Excel, 6463 62 bytes

=IF(LEN(A1)+1=2*FIND(",",A1),0,IF(LEN(A1)<2*FIND(",",A1),1,2))

-1 byte thanks to Dominic van Essen -1 byre thanks to Chronocidal

• 63 bytes by using >=: =IF(LEN(A1)+1=2*FIND(",",A1),0,IF(LEN(A1)>=2*FIND(",",A1),2,1)) Jun 8 '20 at 15:48
• Can't you save another byte by changing >= to <, and swapping the 2 and the 1? (i.e. inverting the Logical Condition) Jun 10 '20 at 13:16
• A few bytes can be saved by subtracting from 2 rather than using conditionals:. =2-(find(",",A1)>Len(a1)/2)-(find(",",A1)*2=Len(A1)+1) Jun 15 '20 at 11:57

PHP, 5551 47 bytes

fn($s)=>(3+(($a=explode(',',$s))[0]<=>$a[1]))%3

Try it online!

This is the best I have so far.. Gosh, longer than Java and C :O

Try it online!