Expand Cadeias de comparação

9

Diferentemente da maioria das linguagens, o Python avalia a<b<ccomo seria feito em matemática, na verdade comparando os três números, em vez de comparar o booleano a<bcom c. A maneira correta de escrever isso em C (e muitos outros) seria a<b && b<c.

Nesse desafio, sua tarefa é expandir essas cadeias de comparação de comprimentos arbitrários da representação intuitiva / Python, para como ela seria escrita em outras linguagens.

Especificações

  • Seu programa terá que lidar com os operadores: ==, !=, <, >, <=, >=.
  • A entrada terá cadeias de comparação usando apenas números inteiros.
  • Não se preocupe com a veracidade de nenhuma das comparações ao longo do caminho, isso é puramente um desafio de análise / sintático.
  • A entrada não terá espaços em branco para impedir respostas que trivializam a análise dividindo espaços.
  • No entanto, sua saída pode ter um único espaço em torno &&dos operadores de comparação e dos operadores &&, ou nenhum, mas seja consistente.

Casos de teste

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

Isso é , então o código mais curto em bytes vence!

Maltysen
fonte
relacionado
Maltysen 9/10
Posso ter dois espaços de cada lado do &&?
H.PWiz
@ H.PWiz não, srry.
Maltysen

Respostas:

6

Retina , 33 22 17 bytes

-5 bytes graças a @MartinEnder

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

Experimente online!

ovs
fonte
@MartinEnder Uma pena 1>-2não funciona para limite de ambas as extremidades de uma vez ...
Neil
@ Neil sim, o Retina 1.0 receberá uma nova sintaxe de limite sempre que possível.
Martin Ender
Você poderia postar uma explicação?
James
5

Casca , 16 14 bytes

Imprime um espaço ao redor de cada operador.

wJ"&&"m←C2X3ġ±

Experimente online!

Explicação:

                  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
fonte
Agradável. Você poderia usar wem vez de ;uma abordagem mais direta de se juntar cordas com espaços
Leo
Ah, sim, como eu não pensei nisso?
H.PWiz
3

Retina , 42 47 22 bytes

Golfe maciço graças a Kevin Cruijssen

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

Experimente online!

ATaco
fonte
(==|!=|<=?|>=?)pode ser \D+
ovs 09/10
Da mesma forma (?<!^|\d)pode ser (?<=\D). Além disso, como (?=\d+)é desnecessário, o operador sempre será seguido por um operando; nesse momento, você poderá soltar o +após o \D. Também há em $&vez de $1$2, e então um byte adicional pode ser salvo capturando para trás e olhando para frente, em vez de capturar para frente e olhar para trás.
Neil
(\D(\d+))(?=\D)na linha 1 e $1&&$2na linha dois é suficiente ( 22 bytes ). Experimente aqui.
21717 Kevin Murrijssen em 09/10
2

V , 37 bytes

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

Experimente 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
fonte
2

Clojure, 88 bytes

Atualização: em subsvez de clojure.string/join.

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

J , 59 46 bytes

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

Experimente online!

Como costumava funcionar

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

Estamos procurando limites do operador. Seqüências de caracteres “decapitadas” e “reduzidas” são transformadas em zeros e aquelas em que 0s são dígitos e depois armazenadas juntas. Anexe um zero para corresponder ao comprimento.

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

Python 2 , 60 59 58 57 bytes

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

Experimente online!

TFeld
fonte
re.sub(r'\D(\d+)(?=\D)',r'\g<0>&&\1',s)salva 1 byte.
Neil
@Neil Thanks :) #
TFeld 9/17
1

Carvão, 29 bytes

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

Duas formulações ligeiramente diferentes do mesmo algoritmo básico. A sequência de entrada é iterada por caractere. À medida que os dígitos são encontrados, eles são coletados em uma variável. Quando um limite entre um número e um operador é encontrado, um "&&" extra mais a variável é impressa e a variável é limpa. A variável é inicializada inicialmente em um espaço para que o primeiro limite não ative o "&&" extra.

Neil
fonte
1

Gelatina , 16 bytes

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

Experimente online!

Explicação:

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, o Outgolfer
fonte
1

Java 8, 46 bytes

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

Explicação:

Experimente aqui.

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)

Explicação 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)

Exemplo passo a passo das substituições:

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
fonte