Expandir cadenas de comparación

9

A diferencia de la mayoría de los lenguajes, Python evalúa a<b<ccomo se haría en matemáticas, comparando en realidad los tres números, en lugar de comparar el booleano a<bcon c. La forma correcta de escribir esto en C (y muchas otras) sería a<b && b<c.

En este desafío, su tarea es expandir tales cadenas de comparación de longitudes arbitrarias desde Python / representación intuitiva, hasta cómo se escribiría en otros idiomas.

Especificaciones

  • Su programa tendrá que manejar los operadores: ==, !=, <, >, <=, >=.
  • La entrada tendrá cadenas de comparación usando solo enteros.
  • No se preocupe por la veracidad de ninguna de las comparaciones en el camino, este es un desafío puramente analítico / sintáctico.
  • La entrada no tendrá espacios en blanco para evitar respuestas que trivializan el análisis dividiendo en espacios.
  • Sin embargo, su salida puede tener un solo espacio que rodea solo los &&'s, o tanto los operadores de comparación como los &&' s, o ninguno, pero sea consistente.

Casos de prueba

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

Este es el , por lo que gana el código más corto en bytes .

Maltysen
fuente
relacionado
Maltysen
¿Puedo tener dos espacios a cada lado del &&?
H.PWiz
@ H.PWiz no, srry.
Maltysen

Respuestas:

6

Retina , 33 22 17 bytes

-5 bytes gracias a @MartinEnder

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

Pruébalo en línea!

ovs
fuente
@MartinEnder Una lástima 1>-2no funciona para limitar desde ambos extremos a la vez ...
Neil
@Neil, sí, Retina 1.0 obtendrá una nueva sintaxis de límite donde sea posible.
Martin Ender
¿Podría publicar una explicación?
James
5

Casco , 16 14 bytes

Imprime un espacio alrededor de cada operador.

wJ"&&"m←C2X3ġ±

Pruébalo en línea!

Explicación:

                  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
fuente
Buena esa. Podría usar en wlugar de ;un enfoque más directo para unir cadenas con espacios
Leo
Oh sí, ¿cómo no pensé en eso?
H.PWiz
3

Retina , 42 47 22 bytes

Golf masivo gracias a Kevin Cruijssen

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

Pruébalo en línea!

Un taco
fuente
(==|!=|<=?|>=?)puede ser \D+
ovs
Del mismo modo (?<!^|\d)puede ser (?<=\D). Además, (?=\d+)es innecesario, el operador siempre será seguido por un operando, en cuyo punto puede soltar el +después del \D. También hay en $&lugar de $1$2, y luego se puede guardar un byte adicional capturando hacia atrás y mirando hacia adelante en lugar de capturar hacia adelante y mirar hacia atrás.
Neil
(\D(\d+))(?=\D)en la línea 1 y $1&&$2en la línea dos es suficiente ( 22 bytes ). Pruébalo aquí
Kevin Cruijssen
2

V , 37 bytes

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

Pruébalo en línea!

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
fuente
2

Clojure, 88 bytes

Actualización: en subslugar de clojure.string/join.

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

J , 59 46 bytes

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

Pruébalo en línea!

Cómo solía funcionar

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

Estamos buscando límites de operadores. Las cadenas "decapitadas" y "acortadas" se convierten en ceros y unos donde los 0 son dígitos, luego se juntan. Anteponer cero para que coincida con la longitud.

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

Python 2 , 60 59 58 57 bytes

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

Pruébalo en línea!

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

Carbón, 29 bytes

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

Dos formulaciones ligeramente diferentes del mismo algoritmo básico. La cadena de entrada se itera por carácter. A medida que se encuentran los dígitos, se recopilan en una variable. Cuando se encuentra un límite entre un número y un operador, se imprime un "&&" más la variable y se borra la variable. La variable se inicializa inicialmente en un espacio para que el primer límite no active el "&&" adicional.

Neil
fuente
1

Jalea , 16 bytes

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

Pruébalo en línea!

Explicación:

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 el Outgolfer
fuente
1

Java 8, 46 bytes

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

Explicación:

Pruébalo aquí.

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)

Explicación de expresiones regulares:

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

Ejemplo paso a paso de los reemplazos:

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
fuente