O objetivo deste desafio é receber uma entrada e saída dessa entrada, mas com a ordem da sentença invertida. Exemplo de entrada:
Hello friend. What are you doing? I bet it is something I want to do too!
Saída de exemplo:
I bet it is something I want to do too! What are you doing? Hello friend.
Como você pode ver nos exemplos, seu programa precisa lidar com pontos de interrogação, pontos de exclamação e pontos. Você pode assumir que cada sentença tem uma pontuação e um espaço antes da próxima sentença. Os espaços à direita / novas linhas estão ok, desde que sejam legíveis. O menor código vence.
Boa sorte!
EDIT: Você pode assumir que as frases não têm aspas ou parênteses, mas se você tornar seu código capaz de lidar com ambos, obterá -5 bytes Exemplo de saída para parens / aspas:
"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.
Respostas:
Julia,
4542 bytes - 5 bônus = 37Isso cria uma função anônima que aceita uma string como entrada e retorna a string com suas frases invertidas. Ele lida com qualquer caractere especial de maneira apropriada, embora as aspas duplas e os cifrões devam ser escapados, caso contrário, não são cadeias válidas em Julia.
Ungolfed + explicação:
Exemplos:
E se você não gosta de olhar as aspas escapadas na saída:
Economizou 3 bytes na expressão regular graças a Martin Büttner! Anteriormente, este usou um lookbehind:
(?<=[.?!])
.fonte
CJam,
2322 bytesNão tenho certeza se isso se qualifica para o bônus ou não, mas aqui vai a solução:
Expansão do código (pouco desatualizado) :
Experimente online aqui
fonte
J,
3532Ele quase lida com entrada de bônus, exceto que eu tenho que escapar de apóstrofos únicos, então acho que não conta. (Além disso, minha primeira submissão aqui)
Uso:
fonte
Perl, 27/25
Ou na linha de comando:
fonte
perl -nE 'say reverse/ |[^.?!]*.\)?/g'
, elevando sua contagem total para 23.PHP, 60
fonte
[?!.]\K
?Bash + coreutils, 40 bytes
Como lê STDIN, a entrada pode ser redirecionada a partir de um arquivo ou simplesmente canalizada, por exemplo:
fonte
(foo bar.)
é trocado como uma unidade?Pip , 25 bytes
Depois de anexar um espaço para a cadeia de entrada, encontramos todos os índices de
.
,?
e!
, adicione 2, e usar o^@
split-no operador para quebrar a string em sentenças (cada um com um espaço à direita). Inverta a lista e é impressa automaticamente no final do programa. Voilà!Exemplo mostrando os estágios da computação principal com entrada
A! B? C. D!
:fonte
Retina ,
61343330 bytesCréditos ao nutki por reduzi-lo em 24 bytes.
Onde
<empty>
significa uma linha vazia. Isso pressupõe que isso#
não faz parte da entrada, mas se isso não for legítimo, eu poderia trocá-la por qualquer outro personagem, incluindo"
(que eu precisaria lidar apenas com o bônus) ou algo imprimível. Você pode executar o código como esse em um único arquivo se usar o-s
sinalizador ou colocar cada linha em um arquivo separado e passá-las para a Retina.É possível reverter isso com uma única substituição de regex, mas é realmente complicado. Mesmo nos grupos de balanceamento do .NET, eu precisava de algo em torno de 90 bytes, então tentei fazê-lo em várias etapas.
Na Retina, todo par de linhas é um estágio de substituição, onde a primeira linha é o padrão e a segunda linha é a substituição.
Este estágio simplesmente prepara a string para processamento adicional. Anexa a
#
como um marcador. Esse marcador indica que tudo à sua frente já foi colocado no lugar certo e tudo depois ainda precisa ser processado.Esse estágio troca as sentenças, movendo repetidamente a última sentença na frente da
#
(que se move para a frente na sequência no processo). O+`
instrui a Retina a repetir esse estágio até que a saída pare de mudar. Como um exemplo, aqui está como a entradafoo. bar! blah?
seria processada:E, finalmente, simplesmente removemos o marcador:
fonte
.+
=>$0 #
e repetido(.*?[.!?] )(.*#)
=>$2$1
?Java, 113
fonte
JavaScript (ES6) 47
45Como afirmado, é um exercício simples de regex. Em javascript:
fonte
Python 2, 62
Não vai melhorar o bônus, pois provavelmente não vale o custo de bytes.
fonte
Matlab (93 bytes)
fonte
Ruby 41
As outras respostas do Ruby não têm WTF suficiente.
Isso pelo menos funciona no Ruby 2. Se a opção
a
eF
funcionar na 1.8.7, acho que você pode soltar$_=
para salvar três caracteres.Inverte todas as linhas no stdin e imprime no stdout:
fonte
Ruby, 48 (42 sem os putts) bytes
reverse_sentence.rb
Uso:
Resultado:
Criticism more than welcome.
fonte
.join(" ")
=>*" "
k, 31
.
fonte
C# - LINQPAD - 93 - 5 = 88 bytes
C# Console App 189 - 5 = 184 bytes
regex shamelessly flogged from Alex A. :)
fonte
namespace System
then within thatusing Linq;usingText.RegularExpressions
saving 2xsystem
.Clojure - 44
71charsImproved and simplified RE, eliminated unnecessary whitespace.
Output is a sequence of the sentences in the original string, with the order of the sentences reversed:
Input: "Hello friend. What are you doing? I bet it is something I want to do too!" Output: ("I bet it is something I want to do too!" "What are you doing?" "Hello friend.")
fonte
Ruby, 47
credits to Martin Büttner, for saving some characters.
fonte
gets
to save a byte, print it with$><<
to save byte (no need for a space) and join the string with*''
to save two bytes.CJam, 21 bytes
This works by turning spaces after
!
s,.
s and?
s into the number 1 (not the character 1 nor the character with code point 1, so the input can still contain those), splitting at 1's, reversing the order of the resulting chunks and joining by spaces.Try it online in the CJam interpreter.
How it works
fonte