Rozwiń Łańcuchy porównania

9

W odróżnieniu od większości języków Python ocenia a<b<cjak byłoby to zrobić w matematyce, rzeczywiście porównując trzy numery, w przeciwieństwie do porównywania logiczną a<bdo c. Poprawnym sposobem napisania tego w C (i wielu innych) byłoby a<b && b<c.

W tym wyzwaniu Twoim zadaniem jest rozwinięcie takich łańcuchów porównawczych o dowolnej długości z Python / intuicyjnej reprezentacji do sposobu, w jaki zostałby napisany w innych językach.

Dane techniczne

  • Twój program będzie musiał obsługiwać operatorów: ==, !=, <, >, <=, >=.
  • Dane wejściowe będą miały łańcuchy porównania zawierające tylko liczby całkowite.
  • Nie martw się o prawdziwość jakichkolwiek porównań po drodze, jest to wyłącznie parsowanie / syntaktyczne wyzwanie.
  • Dane wejściowe nie będą zawierały żadnych białych znaków, aby zapobiec odpowiedziom, które trywializują parsowanie przez podział na spacje.
  • Jednak dane wyjściowe mogą zawierać pojedynczą przestrzeń otaczającą albo tylko &&operatory, albo operatory porównania i operatory &&, albo żadną, ale być spójne.

Przypadki testowe

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

To jest , więc wygrywa najkrótszy kod w bajtach !

Maltysen
źródło
powiązane
Maltysen
Czy mogę mieć dwie spacje po obu stronach &&?
H.PWiz
@ H.PWiz nie, srry.
Maltysen

Odpowiedzi:

6

Retina , 33 22 17 bajtów

-5 bajtów dzięki @MartinEnder

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

Wypróbuj online!

ovs
źródło
@MartinEnder Szkoda 1>-2nie działa, aby ograniczyć oba końce naraz ...
Neil,
@ Nee tak, Retina 1.0 otrzyma nową składnię limitu tam, gdzie jest to możliwe.
Martin Ender,
Czy możesz opublikować wyjaśnienie?
James,
5

Łuska , 16 14 bajtów

Drukuje przestrzeń wokół każdego operatora.

wJ"&&"m←C2X3ġ±

Wypróbuj online!

Wyjaśnienie:

                  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.PWiz
źródło
Niezłe. Możesz użyć wzamiast ;bardziej bezpośredniego podejścia do łączenia łańcuchów ze spacjami
Leo
Och tak, jak o tym nie pomyślałem?
H.PWiz
3

Retina , 42 47 22 bajtów

Masywny golf dzięki Kevin Cruijssen

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

Wypróbuj online!

ATaco
źródło
(==|!=|<=?|>=?)może być \D+
ovs
Podobnie (?<!^|\d)może być (?<=\D). Również (?=\d+)niepotrzebne jest, operator zawsze będzie poprzedzony operandem, w którym to momencie możesz upuścić +po \D. Istnieje również $&zamiast $1$2, a następnie można zapisać kolejny bajt, przechwytując za siebie i patrząc w przyszłość zamiast przechwytywać w przód i patrząc za siebie.
Neil,
(\D(\d+))(?=\D)w linii 1, a $1&&$2w linii drugiej wystarczy ( 22 bajty ). Wypróbuj tutaj.
Kevin Cruijssen
2

V , 37 bajtów

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

Wypróbuj 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
źródło
2

Clojure, 88 bajtów

Aktualizacja: subszamiast clojure.string/join.

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

J , 59 46 bajtów

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

Wypróbuj online!

Jak to działało

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

Szukamy granic operatora. Łańcuchy „Ścięty” i „skrócony” zamieniane są na zera i na te, w których 0 to cyfry, a następnie xored razem. Wpisz zero, aby dopasować długość.

                   +/\                      </. ]     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
źródło
1

Python 2 , 60 59 58 57 bajtów

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

Wypróbuj online!

TFeld
źródło
re.sub(r'\D(\d+)(?=\D)',r'\g<0>&&\1',s)oszczędza 1 bajt.
Neil,
@Neil Thanks :)
TFeld
1

Węgiel drzewny, 29 bajtów

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

Dwa nieco odmienne sformułowania tego samego podstawowego algorytmu. Łańcuch wejściowy jest iterowany przez znak. Po znalezieniu cyfr są one gromadzone w zmiennej. Po znalezieniu granicy między liczbą a operatorem drukowane jest dodatkowe „&&” plus zmienna, a zmienna jest kasowana. Zmienna jest początkowo inicjowana do spacji, aby pierwsza granica nie wyzwalała dodatkowego „&&”.

Neil
źródło
1

Galaretka , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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
źródło
1

Java 8, 46 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

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)

Wyjaśnienie 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)

Przykład zamiany krok po kroku:

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
źródło