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 .

code-golf  parsing  conversion  syntax  code-golf  sequence  primes  code-challenge  geometry  optimization  code-golf  graph-theory  code-golf  number-theory  primes  integer  code-golf  source-layout  cops-and-robbers  code-golf  source-layout  cops-and-robbers  code-golf  sequence  primes  integer  code-golf  math  number-theory  primes  rational-numbers  code-golf  math  sequence  number-theory  primes  code-golf  string  code-golf  math  combinatorics  permutations  restricted-complexity  code-golf  array-manipulation  code-golf  number  sequence  code-golf  number  sequence  code-golf  binary-matrix  code-golf  math  tips  javascript  algorithm  code-golf  string  code-golf  number  sequence  code-golf  math  arithmetic  parsing  code-golf  number  sequence  primes  code-golf  string  ascii-art  geometry  integer  code-golf  geometry  code-golf  number  array-manipulation  code-golf  math  geometry  code-golf  number  sequence  arithmetic  integer  code-golf  string  kolmogorov-complexity  code-golf  number  code-golf  number  chess  code-golf  sequence  decision-problem  subsequence  code-golf  math  number  primes  code-golf  primes  permutations  code-golf  integer  probability-theory  statistics  code-golf  string  code-golf  sequence  decision-problem  parsing  board-game  code-golf  binary  graph-theory  code-golf  board-game  classification  tic-tac-toe  code-golf  ascii-art  polyglot  code-golf  date  code-golf  geometry 


¿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!


@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

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!


(==|!=|<=?|>=?)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                             .. ..

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)

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.


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.


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 '&&'

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



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.