Stack Exchange Vote Simulator


73

文字のみを含む文字列を取り込みプログラムまたは機能書く^v(あなたが他の文字がないと仮定することができますが)。左から右に読むと、この文字列は、Stack Exchangeの質問または回答を初めて表示しているときに1人のユーザーが行ったマウスクリックのシーケンスを表します。

すべては^をクリック表しupvoteボタンを、すべてはvをクリック表しdownvoteのボタンを。(実際の例については、左を少し見てください。)

すべてのクリックが正しく登録されるように、投票制限が有効になっていないと仮定します。
印刷または返却:

  • 1または+1投稿が最終的に投票される場合。
  • 0投稿が最終的に投票されない場合。(-0そして+0無効です)
  • -1 投稿がダウン投票された場合。

投稿はユーザーからのゼロ投票で始まり、ボタンは次のようにネット投票を変更します。

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
何?サイド投票なし?ジオボルトとシードラスは悲しいです
オプティマイザー

25
親愛なるシークレットSE開発者:自分のコミュニティを成功させてサイトの改善に成功したことをおめでとうございます
;;

1
しばらくの間、サンプルテーブルに主演してきましたが、まだテストケースを取得できません。スコアが1の投稿は投票され、その後スコアが0になります。また、スコアが0の投稿はスコアが1になるように投票されます。スコアが-1の投稿は、スコア1に投票しました。^キャラクターは-1、+ 1または+2のスコア変更を引き起こすことができますか?私はどこに密集していますか?どうしたの?
ブラッド

4
@Brad実際の投稿(この質問自体など)でアクションを試すことをお勧めします。既に投票した投稿を投票すると、その投票は取り消されます。ダウン投票でも同じです。
カルビンの趣味

6
この質問に対するリアルタイムの投票は何だったのだろうか。多くの人がこの質問をテストケースとして使ったことに賭けたいと思っています。
MikeTheLiar

回答:


35

GOL> <> 0.3.1113の 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
....ダン!良いですね!
エレンディアスターマン

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

これは、文字列を取り、8ビット整数を返すfastcall呼び出し規約を使用する関数です。

32ビットモード用にコンパイルする必要がある次のCプログラムでテストしました。

#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コードはタスクを実行するために空のファイルを必要とし、コードは0バイトになるフレームワークであると言います。なぜあなたのソリューションと違うのですか?
ザイビス

@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、現在の文字と以前の値に基づいて更新します。

編集:Golfed ~s&&-1!~s-1。この式はs、-1に等しい場合は0、それ以外の場合は-1 に等しくなければなりません。@nderscoreのおかげで6バイト節約されました。

式の仕組み:

 ~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バイトにv=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
減らしました

@nderscoreやあ、それは素晴らしい。余分な変数は不器用だと思ったが、それを排除できるとは思わなかった。
intrepidcoder

1
消さ44は...まだ、通常の44です
Rɪᴋᴇʀ

配列の内包表記は仕様から削除されていませんか?
MayorMonty

8

CJam、18 14バイト

Dennisによる大幅な改善が加えられた更新バージョン:

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バイト

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

52文字と3つの新しい行。

このインタープリターでテスト済み。

j等距離にある^v、かなりのスペースを消費条件文よりも、最終的には算術変換を行うために使われていますので、アスキーインチ


7

brainfuck、146バイト

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

このプログラムは、入力の各バイトを受け取り、最後のバイトと比較します。それらが同じ場合、入力は破棄され、「前の入力」として「0」が保存されます。それ以外の場合は、通常どおり保存されます。

最終結果がの場合、v印刷され-ます。最終結果がゼロ以外の場合、空のセルに1が追加されます。最後に、48がそのセルに追加され、印刷されます。


7

JavascriptをES6、91の 48文字

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

説明:でundefined終了しdます。

テスト:

` -> 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を取得し、新しい投票数を出力します。

その考えはcmp、2つの引数を比較し-1, 0, 1<, ==, >それぞれに与えるPython 2の関数を使用することです。内側のものcmp('u',c)-1for v1for を与え^ます。それらの間の任意の文字で十分です'u'。外側のものは、それとを比較し、正しい値を持つfor とfor xを与えます。cmp(1,x)^cmp(-1,x)v

直接の反復は3文字長くなりました(52)が、input()with引用符を使用できる場合は1文字短くなります(48)。

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

私が見つけた最高の再帰関数は、1文字長くなりました(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).

自分でテスト:
オンラインインタープリターはこちら

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

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

編集: r節をORで統合して7バイトを保存しました。


うーん。関数を定義する代わりに演算子を再定義することでかなりのバイト数を節約できるようです(PPCGのルールで関数としてカウントされる場合)
ASCIIのみ

@ASCIIのみ:はい。私がこれを書いたとき、そのトリックを学んでいませんでした:)
エミグナ

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

正しい^ then vの動作を忘れてしまいました(逆も同様です)。
DJgamer98

修正されるまで投稿を削除します。
DJgamer98

これで動作するはずです。
DJgamer98

1
そのインデントはまったく正しくありません。正しいインデントで編集することを提案しました。コメント内のコードをフォーマットすることはできませんので、私の場合は間違っていました。
モーガントラップ

4

JavaScript(ES6)、64 59 58 52バイト

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

これは、繰り返しの最後のストレッチ(^またはv)のみが結果に影響するという観察に基づいています。

6バイトのゴルフをしてくれたニールに感謝します。


1
なぜキャプチャが必要なのですか?私にはf=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2十分のようです。
ニール

@Neil:>or <演算子の最初の要素に配列が強制されていることを知りません。ヒントをありがとう
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

型強制は一切関係なく、単に[0]あなたを混乱させるかもしれないものを移動しました。
ニール

@ニール:ああ、私は確かに混乱しています。私はあなたがそれを内部に移動したことに気付いていませんでした、私はそれが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

ああ、私はいつも中置を忘れます。スポットをありがとう、内側の反転を見逃した。
レイフウィラーツ

3行目(15文字)を1%_=-1 _%_=012文字に置き換えて、3文字を保存します。
ケビンリード

さて、今は短くなりました。
レイフウィラーツ

4

Scala、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へようこそ!説明および/または無料版を追加してもらえますか?
アディソンクランプ

3

APL、17

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

フォーク表記のないインタプリタ(GNU APLなど)の場合、{⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞(19)になります。これはおそらく、問題の定義から直接機能するため、可能な限り最も退屈なソリューションです。


3

Ruby、41 35バイト

正規表現。最後に押されたボタンのみが興味深いので、そのランレングスを確認してください。その後にそれを比較する"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。同じボタンを2回クリックすると、常に投票がキャンセルされるため、そのコンテンツは関係ありません。これは、上分割することによってこれを行う^^vv、最後の項目を取ります。この項目が空の文字列(.Length<1)の場合、0すべての投票がキャンセルされたため、関数が返されます。文字列が空でない場合は、元の文字列の最後の文字だけを調べます。以前のすべての投票を上書きします。charコードが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]

これは実際には何も印刷しません。
モーガンスラップ

インタープリターで実行すると、最後の行の出力が表示されます
-wnnmaw

これは、REPLで実行しているためです。REPLの外部で機能する完全なプログラムを提供する必要があります。
モーガンスラップ

また、この3進(-1,(1,0)[n==0])[n>0]数を10バイト節約するために短縮できます。また、を使用しないでくださいa=str.count。実際には4バイトかかります。
モーガントラップ

それはn = 0に対して-1を生成しますが、構文はクールです
-wnnmaw

2

Minkolang 0.1128の 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

Mathematica、60バイト

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

@#&?それは役に立たない(Sequencesが関与しているが、sは関与していない限りSequence。)
CalculatorFeline

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;

ProgramFOXの答えからではx<95?1:-1なく使用するというアイデアを得ましたx=='^'?1:-1

偶然の一致:

  • 私が盗んだ微調整は、95との比較を使用します。つまり、前述の微調整を使用して、usingステートメントを除くバイト数
  • 総バイト数の桁の合計は、ローマ数字として書かれた総バイト数の桁数に等しい

2

C: 67 66バイト

ゴルフ:

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

なし:

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

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

これは結果を返しません。すべてのテストに合格するとは限りません。
ロバートアンドジェジュク

2

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

ゴルフをしていない:

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*$/;入力文字列を正規表現と比較します/(.)\1*$/。つまり、1文字以上1回以上繰り返される単一の文字で終わるかどうかを調べます。

そうである場合$&は、繰り返し文字列全体で$1あり、文字です。それ以外の場合(つまり、入力文字列が空の場合)、これらの2つの変数は空の文字列です。

$1=~v?-1:1$1正規表現vと比較し、一致する場合は-1を返し、一致しない場合は1を返します。

そして、その±1に2 (length$&)%2$&法とする長さを掛けます。


2

05AB1E14 12 11 バイト

Îvy'^QDŠ‹+<

@ Sp3000のGol> <>回答のポート。

注:@Grimyはすでに05AB1Eの短い8バイトの代替を投稿しているので、必ず彼に賛成してください!

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Î            # 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バイトです。
グリミー


1

ルビー、43

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

9-i/11^(94)またはv(118)のASCIIコードを指定すると、1または-1に評価されます

テストプログラムで:

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.