Luaskan Chains Perbandingan

9

Tidak seperti kebanyakan bahasa, Python mengevaluasi a<b<ckarena akan dilakukan dalam matematika, sebenarnya membandingkan tiga angka, yang bertentangan dengan membandingkan boolean a<buntuk c. Cara yang benar untuk menulis ini dalam C (dan banyak lainnya) adalah a<b && b<c.

Dalam tantangan ini, tugas Anda adalah untuk memperluas rantai perbandingan dengan panjang sewenang-wenang dari Python / representasi intuitif, hingga bagaimana itu akan ditulis dalam bahasa lain.

Spesifikasi

  • Program Anda harus menangani operator: ==, !=, <, >, <=, >=.
  • Input akan memiliki rantai perbandingan menggunakan hanya bilangan bulat.
  • Jangan khawatir tentang kebenaran dari perbandingan mana pun di sepanjang jalan, ini murni tantangan parsing / sintaksis.
  • Masukan tidak akan memiliki spasi putih untuk mencegah jawaban yang meremehkan penguraian dengan membagi pada spasi.
  • Namun, output Anda mungkin memiliki ruang tunggal yang mengelilingi baik saja &&, atau kedua operator perbandingan dan &&, atau tidak, tetapi konsisten.

Uji Kasus

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

Ini adalah , jadi kode terpendek dalam byte menang!

Maltysen
sumber
terkait
Maltysen
Bisakah saya memiliki dua ruang di kedua sisi &&?
H.PWiz
@ H.PWiz nggak, srry.
Maltysen

Jawaban:

6

Retina , 33 22 17 byte

-5 byte terima kasih kepada @MartinEnder

-2`\D(\d+)
$&&&$1

Cobalah online!

ovs
sumber
@ MartinEnder Kasihan 1>-2tidak bekerja untuk membatasi dari kedua ujungnya sekaligus ...
Neil
@Neil ya, Retina 1.0 akan mendapatkan sintaks batas baru di mana itu mungkin.
Martin Ender
Bisakah Anda memposting penjelasan?
James
5

Sekam , 16 14 byte

Mencetak ruang di sekitar masing-masing operator.

wJ"&&"m←C2X3ġ±

Cobalah online!

Penjelasan:

                  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
H.Piz
sumber
Bagus Anda bisa menggunakan walih-alih ;untuk pendekatan yang lebih langsung untuk menggabungkan string dengan spasi
Leo
Oh ya, bagaimana saya tidak memikirkan itu?
H.PWiz
3

Retina , 42 47 22 byte

Bermain golf secara besar- besaran berkat Kevin Cruijssen

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

Cobalah online!

ATaco
sumber
(==|!=|<=?|>=?)dapat \D+
ovs
Demikian pula (?<!^|\d)bisa (?<=\D). Juga (?=\d+)tidak perlu, operator akan selalu diikuti oleh operan, pada titik mana Anda dapat membatalkan +setelah \D. Ada juga $&bukannya $1$2, dan kemudian byte lebih lanjut dapat disimpan dengan menangkap balik dan melihat ke depan alih-alih menangkap ke depan dan melihat ke belakang.
Neil
(\D(\d+))(?=\D)pada baris 1, dan $1&&$2pada baris dua sudah cukup ( 22 byte ). Coba di sini.
Kevin Cruijssen
2

V , 37 byte

òͨ䫄0-9& ]«©¨ä«©¨„0-9& ]«©/±² ¦¦ ²³

Cobalah online!

Hexdump:

00000000: f2cd a8e4 ab84 302d 3926 205d aba9 a8e4  ......0-9& ]....
00000010: aba9 a884 302d 3926 205d aba9 2fb1 b220  ....0-9& ]../.. 
00000020: a6a6 20b2 b3                             .. ..
James
sumber
2

Clojure, 88 byte

Perbarui: subsalih-alih clojure.string/join.

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

J , 59 46 byte

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

Cobalah online!

Cara kerjanya dulu

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

Kami sedang mencari batasan operator. String "Dipenggal" dan "dibatasi" diubah menjadi nol dan yang 0 adalah digit, kemudian digabungkan bersama. Prepend nol untuk mencocokkan panjang.

                   +/\                      </. ]     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.
FrownyFrog
sumber
1

Python 2 , 60 59 58 57 byte

lambda s:re.sub(r'(\D(\d+))(?=\D)',r'\1&&\2',s)
import re

Cobalah online!

TFeld
sumber
re.sub(r'\D(\d+)(?=\D)',r'\g<0>&&\1',s)menghemat 1 byte.
Neil
@Neil
1

Arang, 29 byte

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

Dua formulasi yang sedikit berbeda dari algoritma dasar yang sama. String input diulangi oleh karakter. Ketika digit ditemukan mereka dikumpulkan dalam suatu variabel. Ketika batas antara angka dan operator ditemukan, "&&" tambahan ditambah variabel dicetak dan variabel dihapus. Variabel awalnya diinisialisasi ke spasi sehingga batas pertama tidak memicu ekstra "&&".

Neil
sumber
1

Jelly , 16 byte

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

Cobalah online!

Penjelasan:

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 '&&'
Erik the Outgolfer
sumber
1

Java 8, 46 byte

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

Penjelasan:

Coba di sini.

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)

Penjelasan regex:

(\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)

Langkah demi langkah contoh penggantian:

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
Kevin Cruijssen
sumber
0

Ruby , 37 byte

->s{s.gsub(/\D(\d+)(?=\D)/,'\&&&\1')}

Cobalah online!

GB
sumber