Развернуть цепочки сравнения

9

В отличие от большинства языков, Python оценивает, a<b<cкак это было бы сделано в математике, фактически сравнивая три числа, а не сравнивая логическое значение a<bс 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

Это так что кратчайший код в байтах побеждает!

Maltysen
источник
Могу ли я иметь два пробела по обе стороны &&?
H.PWiz
@ H.PWiz Нет, сри.
Maltysen

Ответы:

6

Сетчатка , 33 22 17 байт

-5 байт благодаря @MartinEnder

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

Попробуйте онлайн!

овс
источник
@MartinEnder Жаль, 1>-2что не работает, чтобы ограничить с обоих концов одновременно ...
Нил
@Neil да, Retina 1.0 получит новый синтаксис предела, где это возможно.
Мартин Эндер
Не могли бы вы опубликовать объяснение?
Джеймс
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
H.PWiz
источник
Хороший. Вы можете использовать wвместо ;более прямого подхода к соединению строк с пробелами
Лев
Ах да, как я не подумал об этом?
H.PWiz
3

Retina , 42 47 22 байта

Массовая игра в гольф благодаря Кевину Круйссену

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

Попробуйте онлайн!

Ataco
источник
(==|!=|<=?|>=?)может быть \D+
овс
Точно так же (?<!^|\d)может быть (?<=\D). Также в (?=\d+)этом нет необходимости, за оператором всегда будет следовать операнд, после чего вы можете опустить +после \D. Кроме того, $&вместо этого $1$2можно сохранить еще один байт, захватив его позади и посмотрев вперед, вместо того, чтобы захватывать вперед и оглядываться назад.
Нил
(\D(\d+))(?=\D)на строке 1 и $1&&$2на строке два достаточно ( 22 байта ). Попробуй это здесь.
Кевин Круйссен
2

V , 37 байт

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

Попробуйте онлайн!

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                             .. ..
Джеймс
источник
2

Clojure, 88 байт

Обновление: subsвместо clojure.string/join.

#(subs(apply str(for[p(partition 3 2(re-seq #"(?:\d+|[^\d]+)" %))](apply str" && "p)))4)
NikoNyrh
источник
2

J , 59 46 байт

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

Попробуйте онлайн!

Как это раньше работало

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

Мы ищем границы оператора. Строки «обезглавлены» и «свернуты» превращаются в нули и строки, где 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.
FrownyFrog
источник
1

Древесный уголь, 29 байт

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

Две немного разные формулировки одного и того же базового алгоритма. Входная строка повторяется символом. Когда цифры найдены, они собираются в переменную. Когда граница между числом и оператором найдена, выводится дополнительный символ «&&» плюс переменная, а переменная очищается. Переменная изначально инициализируется пробелом, чтобы первая граница не вызывала лишние «&&».

Нил
источник
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)

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)

Пошаговый пример замены:

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
Кевин Круйссен
источник