El objetivo de este desafío es recibir una entrada y salida de esa entrada pero con el orden de las oraciones invertido. Entrada de ejemplo:
Hello friend. What are you doing? I bet it is something I want to do too!
Salida de ejemplo:
I bet it is something I want to do too! What are you doing? Hello friend.
Como puede ver en los ejemplos, su programa tiene que lidiar con signos de interrogación, signos de exclamación y puntos. Puede suponer que cada oración tiene una puntuación y un espacio antes de la siguiente oración. Los espacios finales / líneas nuevas están bien, siempre y cuando sea legible. El código más corto gana.
¡Buena suerte!
EDITAR: puede suponer que las oraciones no tienen comillas ni paréntesis, pero si hace que su código sea capaz de lidiar con ambos, obtendrá -5 bytes Salida de ejemplo para parens / quotes:
"Hello, " she said. (I didn't know what she was talking about.) --> (I didn't know what she was talking about.) "Hello, " she said.
"Hello!" she said. (I hesitated. How should I respond? This is too much!) I responded, "Hi there. How are you? What is your cat's name?" without thinking any more about it.
Respuestas:
Julia,
4542 bytes - 5 bonus = 37Esto crea una función anónima que acepta una cadena como entrada y devuelve la cadena con sus oraciones invertidas. Esto maneja cualquier carácter especial de manera apropiada, aunque se deben escapar las comillas dobles y los signos de dólar, de lo contrario no son cadenas válidas en Julia.
Ungolfed + explicación:
Ejemplos:
Y si no le gusta mirar las comillas escapadas en la salida:
¡Ahorré 3 bytes en la expresión regular gracias a Martin Büttner! Anteriormente, esta utiliza una búsqueda hacia atrás:
(?<=[.?!])
.fuente
CJam,
2322 bytesNo estoy seguro de si esto califica para el bono o no, pero aquí está la solución:
Expansión de código (poco anticuado) :
Pruébalo en línea aquí
fuente
J,
3532Casi maneja la entrada de bonificación, excepto que tengo que escapar de apóstrofes individuales, por lo que supongo que no cuenta. (Además, mi primera presentación aquí)
Uso:
fuente
Perl, 27/25
O desde la línea de comando:
fuente
perl -nE 'say reverse/ |[^.?!]*.\)?/g'
, con lo que su recuento total es 23.PHP, 60
fuente
[?!.]\K
lugar?Bash + coreutils, 40 bytes
Esto se lee desde STDIN, por lo que la entrada puede redirigirse desde un archivo o simplemente canalizarse, por ejemplo:
fuente
(foo bar.)
se intercambia como una unidad?Pip , 25 bytes
Después de agregar un espacio a la cadena de entrada, encontramos todos los índices de
.
,?
y!
, sumamos 2, y usamos el^@
operador de división para dividir la cadena en oraciones (cada una con un espacio final). Invierta la lista y se imprimirá automáticamente al final del programa. Voilà!Ejemplo que muestra las etapas del cálculo principal con entrada
A! B? C. D!
:fuente
Retina ,
61343330 bytesCréditos a nutki por reducir esto en 24 bytes.
Donde se
<empty>
encuentra una línea vacía. Esto supone que#
no es parte de la entrada, pero si eso no es legítimo, podría cambiarlo por cualquier otro personaje, incluido"
(que solo tendría que manejar para la bonificación) o algo no imprimible. Puede ejecutar el código de esa manera en un solo archivo si usa la-s
bandera, o puede poner cada línea en un archivo separado y pasarlas todas a Retina.Revertir esto con un solo reemplazo de expresiones regulares es posible, pero realmente engorroso. Incluso con los grupos de equilibrio de .NET, necesitaba algo de alrededor de 90 bytes, así que intenté hacerlo en varios pasos.
En Retina, cada par de líneas es una etapa de reemplazo, donde la primera línea es el patrón y la segunda línea es el reemplazo.
Esta etapa simplemente prepara la cadena para su posterior procesamiento. Precede a
#
como un marcador. Este marcador indica que todo lo que está frente a él ya se ha colocado en el lugar correcto, y todo lo que queda después aún debe procesarse.Esta etapa intercambia las oraciones, moviendo repetidamente la última oración frente a la
#
(que se mueve hacia adelante a través de la cadena en el proceso). Le+`
indica a Retina que repita esta etapa hasta que la salida deje de cambiar. Como ejemplo, así es comofoo. bar! blah?
se procesaría la entrada :Y finalmente simplemente eliminamos el marcador:
fuente
.+
=>$0 #
y repetido(.*?[.!?] )(.*#)
=>$2$1
?Java, 113
fuente
JavaScript (ES6) 47
45Como se dijo, es un simple ejercicio de expresiones regulares. En javascript:
fuente
Pitón 2, 62
No va a mejorar la bonificación, ya que probablemente no valga la pena el costo del byte.
fuente
Matlab (93 bytes)
fuente
Rubí 41
Las otras respuestas de Ruby no tienen suficiente WTF.
Esto al menos funciona en Ruby 2. Si el interruptor
a
yF
funciona en 1.8.7, supongo que podría caer$_=
para guardar tres caracteres.Invierte cada línea en stdin e imprime en stdout:
fuente
Ruby, 48 (42 sin los put) bytes
reverse_sentence.rb
Uso:
Salida:
Críticas más que bienvenidas.
fuente
.join(" ")
=>*" "
k, 31
.
fuente
C # - LINQPAD - 93 - 5 = 88 bytes
Aplicación de consola C # 189 - 5 = 184 bytes
expresión regular descaradamente azotado de Alex A. :)
fuente
namespace System
dentro de eseusing Linq;usingText.RegularExpressions
ahorro 2xsystem
.Clojure - 44
71caracteresRE mejorada y simplificada, elimina espacios en blanco innecesarios.
La salida es una secuencia de las oraciones en la cadena original, con el orden de las oraciones invertidas:
Entrada: "Hola amigo. ¿Qué estás haciendo? ¡Apuesto a que es algo que también quiero hacer!" Salida: ("¡Apuesto a que es algo que también quiero hacer!", "¿Qué estás haciendo?", "Hola amigo").
fuente
Ruby, 47
Créditos a Martin Büttner , por salvar algunos personajes.
fuente
gets
para guardar un byte, imprimirla$><<
para guardar el byte (sin necesidad de espacio) y unir la cadena con*''
para guardar dos bytes.CJam, 21 bytes
Esto funciona girando espacios después de
!
s,.
sy?
s en el número 1 (no el carácter 1 ni el carácter con el punto de código 1, por lo que la entrada aún puede contener esos), dividiendo en 1, invirtiendo el orden de los fragmentos resultantes y uniendo por espacios.Pruébelo en línea en intérprete de CJam .
Cómo funciona
fuente