比較チェーンを拡張


9

ほとんどの言語と異なり、Python a<b<cは数学で行われるように評価し、ブール値a<bをと比較するのではなく、実際には3つの数値を比較しcます。これをC(および他の多くの)で記述する正しい方法は、a<b && b<c

この課題の課題は、このような任意の長さの比較チェーンをPython /直感的な表現から他の言語でどのように記述するかまで拡張することです。

仕様書

  • プログラムは演算子を処理する必要があります。 ==, !=, <, >, <=, >=
  • 入力には、整数のみを使用した比較チェーンがあります。
  • 途中の比較の真実性について心配する必要はありません。これは、純粋に構文解析/構文上の課題です。
  • 入力には、スペースで分割することで解析を簡単にする回答を防ぐための空白はありません。
  • ただし、出力には、&&' のみ、または比較演算子と&&'の両方のいずれか、または両方を囲む単一のスペースがある場合がありますが、一貫性があります。

テストケース

Input                  Output
---------------------------------------------------------------

3<4<5                  3<4 && 4<5
3<4<5<6<7<8<9          3<4 && 4<5 && 5<6 && 6<7 && 7<8 && 8<9
3<5==6<19              3<5 && 5==6 && 6<19
10>=5<7!=20            10>=5 && 5<7 && 7!=20
15==15==15==15==15     15==15 && 15==15 && 15==15 && 15==15

これはなので、バイト単位の最短コードが優先さます

code-golf  parsing  conversion  syntax  code-golf  sequence  primes  code-challenge  geometry  optimization  code-golf  graph-theory  code-golf  number-theory  primes  integer  code-golf  source-layout  cops-and-robbers  code-golf  source-layout  cops-and-robbers  code-golf  sequence  primes  integer  code-golf  math  number-theory  primes  rational-numbers  code-golf  math  sequence  number-theory  primes  code-golf  string  code-golf  math  combinatorics  permutations  restricted-complexity  code-golf  array-manipulation  code-golf  number  sequence  code-golf  number  sequence  code-golf  binary-matrix  code-golf  math  tips  javascript  algorithm  code-golf  string  code-golf  number  sequence  code-golf  math  arithmetic  parsing  code-golf  number  sequence  primes  code-golf  string  ascii-art  geometry  integer  code-golf  geometry  code-golf  number  array-manipulation  code-golf  math  geometry  code-golf  number  sequence  arithmetic  integer  code-golf  string  kolmogorov-complexity  code-golf  number  code-golf  number  chess  code-golf  sequence  decision-problem  subsequence  code-golf  math  number  primes  code-golf  primes  permutations  code-golf  integer  probability-theory  statistics  code-golf  string  code-golf  sequence  decision-problem  parsing  board-game  code-golf  binary  graph-theory  code-golf  board-game  classification  tic-tac-toe  code-golf  ascii-art  polyglot  code-golf  date  code-golf  geometry 


の両側に2つのスペースを確保できますか&&
H.PWiz 2017年

@ H.PWizいいえ、ごめんなさい。
Maltysen、2017年

回答:



5

ハスク16 14バイト

各演算子の周囲にスペースを印刷します。

wJ"&&"m←C2X3ġ±

オンラインでお試しください!

説明:

                  Implicit input, e.g            "3<4<5<6"
            ġ±    Group digits                   ["3","<","4","<","5","<","6"]
          X3      Sublists of length 3           [["3","<","4"],["<","4","<"],["4","<","5"],["<","5","<"],["5","<","6"]]
        C2        Cut into lists of length 2     [[["3","<","4"],["<","4","<"]],[["4","<","5"],["<","5","<"]],[["5","<","6"]]]
      m←          Take the first element of each [["3","<","4"],["4","<","5"],["5","<","6"]]
 J"&&"            Join with "&&"                 ["3","<","4","&&","4","<","5","&&","5","<","6"]
w                 Print, separates by spaces

良いですね。w代わりに;、スペースで文字列を結合するためのより直接的なアプローチを使用できます
Leo

ああ、そう思いませんでしたか。
H.PWiz 2017年

3

Retina42 47 22バイト

Kevin Cruijssenのおかげで大規模なゴルフ

(\D(\d+))(?=\D)
$1&&$2

オンラインでお試しください!


(==|!=|<=?|>=?)することができます \D+
ovs

同様に(?<!^|\d)することができます(?<=\D)。また、(?=\d+)オペレータは、常にあなたがドロップすることができ、その時点で、オペランドが続く、不要である+\D。の$&代わりにもあり$1$2、前方をキャプチャして後方を見る代わりに、後方をキャプチャして前方を見ると、さらにバイトを節約できます。
Neil

(\D(\d+))(?=\D)1 $1&&$2行目と2行目で十分です(22バイト)。ここで試してください。
Kevin Cruijssen、2017年


2

Clojure、88バイト

更新:のsubs代わりにclojure.string/join

#(subs(apply str(for[p(partition 3 2(re-seq #"(?:\d+|[^\d]+)" %))](apply str" && "p)))4)

2

J59 46バイト

4(}.;)_2{.\3' && '&;\]</.~0+/\@,2~:/\e.&'!<=>'

オンラインでお試しください!

以前はどのように機能していたか

                        (0 , }. ~:&(e.&'!<=>') }:)

演算子の境界を探しています。「斬首された」文字列と「短縮された」文字列は、ゼロと1に変換され、次に0が数字になります。長さに合わせてゼロを付加します。

                   +/\                      </. ]     Split on boundaries. 
              ┌──┬──┬─┬─┬─┬──┬──┐
              │10│>=│5│<│7│!=│20│
              └──┴──┴─┴─┴─┴──┴──┘
         3' && '&;\          Add && to infixes of 3.
              ┌────┬──┬──┬──┐
              │ && │10│>=│5 │
              ├────┼──┼──┼──┤
              │ && │>=│5 │< │
              ├────┼──┼──┼──┤
              │ && │5 │< │7 │
              ├────┼──┼──┼──┤
              │ && │< │7 │!=│
              ├────┼──┼──┼──┤
              │ && │7 │!=│20│
              └────┴──┴──┴──┘
    _2{.\                    Take even numbered rows.
;}.,                         Concatenate after dropping the first box.


1

チャコール、29バイト

≔ ηFθ«¿›ι9«F›η!⁺&&η≔ωη»≔⁺ηιηι
≔ ηFθ«F∧›ι9›η!⁺&&η≔⎇›ι9ω⁺ηιηι

同じ基本アルゴリズムの2つのわずかに異なる定式化。入力文字列は文字ごとに繰り返されます。数字が見つかると、変数に収集されます。数値と演算子の境界が見つかると、追加の「&&」と変数が出力され、変数がクリアされます。最初の境界が余分な「&&」をトリガーしないように、変数は最初にスペースに初期化されます。


1

ゼリー、16バイト

e€ØDŒg⁸ṁṡ3m2j⁾&&

オンラインでお試しください!

説明:

e€ØDŒg⁸ṁṡ3m2j⁾&& Uses Jelly stringification, thus full program only
eۯD             For each each char, 1 if it's in '0123456789', otherwise 0
    Œg           Split into longest runs of equal elements
      ⁸ṁ         Reshape original input like the list we just made
                 Reshaping will separate numbers from operators
        ṡ3       Get contiguous sublists of length 3
          m2     Keep every second item, starting from the first
                 This will keep every (number operator number) and
                 remove every (operator number operator) substring
            j⁾&& Join with '&&'

1

Java 8、46バイト

s->s.replaceAll("(\\D(\\d+))(?=\\D)","$1&&$2")

説明:

ここで試してください。

s->                       // Method with String as both parameter and return-type
   s.replaceAll("(\\D(\\d+))(?=\\D)",
                "$1&&$2") //  Replace the match of the regex
                          //  with the second String
                          // End of method (implicit / single-line return-statement)

正規表現の説明:

(\D(\d+))(?=\D)   # 1) For all matches of this regex
   (\d+)          #  Capture group 2: a number (one or more digits)
(\D \d+ )         #  Capture group 1: anything but a number + the number
                  #   (`\D` will match the `=`, `!`, `<`, or `>`)
         (?=\D)   #  Look-ahead so everything after the match remains as is

 $1&&$2           # 2) Replace it with
 $1               #  Result of capture group 1 (trailing part of the equation + the number)
   &&             #  Literal "&&"
     $2           #  Result of capture group 2 (the number)

交換の段階的な例:

Initial:                             10>=5<7!=20
 Match of first replacement:            =5
 Replace with:                          =5&&5
After first replacement:             10>=5&&5<7!=20
 Match of second replacement:                <7
 Replace with:                               <7&&7
After second replacement (result):   10>=5&&5<7&&7!=20



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.