Ters cümleler


15

Bu zorluğun amacı, o cümle sırası tersine çevrilmiş bir girdi ve çıktı almaktır. Örnek Giriş:

Hello friend. What are you doing? I bet it is something I want to do too!

Örnek Çıktı:

I bet it is something I want to do too! What are you doing? Hello friend.

Örneklerden de anlaşılacağı gibi, programınızın soru işaretleri, ünlem işaretleri ve noktalarla ilgilenmesi gerekir. Her cümlenin bir noktalama işareti olduğunu ve bir sonraki cümlenin önünde bir boşluk olduğunu varsayabilirsiniz. Sondaki boşluklar / yeni satırlar okunabilir olduğu sürece iyidir. En kısa kod kazanır.

İyi şanslar!

DÜZENLEME: Cümle tırnak veya parantez varsayalım, ancak kodunuzu her ikisiyle de başa çıkabiliyorsanız -5 bayt alırsınız Parens / quotes için örnek çıktı:

"Hello, " she said. (I didn't know what she was talking about.) --> (I didn't know what she was talking about.) "Hello, " she said.

Tırnak veya parantez olmayacağını varsayabilir miyiz? Değilse, onları nasıl ele alacağız?
BrainSteel

Bunu temizleyerek yayında bir düzenleme yaptı.

Tırnak veya parantez içeren bir cümle için beklenen çıktıya örnek verebilir misiniz?
mbomb007

6
Bir cümlenin tırnak işaretleri veya parenler içinde noktalama işaretleri varsa, bununla nasıl başa çıkmalıyız?
isaacg

2
@Scimonster Yani "yani", vb. Oh, ve lütfen test davamın teklifini şu şekilde değiştirin:"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.
Charles'ın

Yanıtlar:


9

Julia, 45 42 bayt - 5 bonus = 37

s->join(reverse(split(s,r"[.?!]\K "))," ")

Bu, bir dizeyi girdi olarak kabul eden ve cümleleri ters çevrilmiş olarak döndüren anonim bir işlev oluşturur. Bu, herhangi bir özel karakteri uygun şekilde ele alır, ancak çift tırnak ve dolar işareti kaçmak zorundadır, aksi takdirde Julia'da geçerli dizeler değildir.

Ungolfed + açıklaması:

function f(s)
    # Get individual sentences by splitting on the spaces that
    # separate them. Spaces are identified by matching punctuation
    # then moving the position beyond that match and matching a
    # space. This is accomplished using \K.

    sentences = split(s, r"[.?!]\K ")

    # Reverse the order of the array of sentences.

    reversed_order = reverse(sentences)

    # Join the array elements into a string, separated by a space.

    join(reversed_order, " ")
end

Örnekler:

julia> f("Hello friend. What are you doing? I bet it is something I want to do too!")
"I bet it is something I want to do too! What are you doing? Hello friend."

julia> f("\"Hello, \" she said. (I didn't know what she was talking about.)")
"(I didn't know what she was talking about.) \"Hello, \" she said."

Ve çıktıdaki kaçan alıntılara bakmaktan hoşlanmıyorsanız:

julia> println(f("\"Hello, \" she said. (I didn't know what she was talking about.)"))
(I didn't know what she was talking about.) "Hello, " she said.

Martin Büttner sayesinde düzenli ifadede 3 bayt tasarruf etti! Daha önce bu Geriye İlerleme kullandı: (?<=[.?!]).


Bunun bonus için uygun olduğunu düşünmüyorum ...
Doktor

@Optimizer: Nasıl değil? Postada verildiği gibi parantez, tırnak vb. İle beklendiği gibi çalışır.
Alex A.

Sorunun bonus bölümündeki örnekle test etmek için çevrimiçi bir bağlantı sağlayabilir misiniz?
Doktor

@Optimizer: Julia'nın yeni bir sürümünü çalıştırmanın tek yolu kayıt gerektirir ve kalıcı bağlantıları desteklemez. Buraya yazıya yalnızca girdi ve çıktı eklemek yeterli olur mu?
Alex A.

Tabii ki, sanırım ..
Optimizer

7

CJam, 23 22 bayt

Bunun bonus için uygun olup olmadığından emin değilim, ama çözüm burada:

Sq{1$".?!"-{])[}|}%]W%

Kod Genişletme (bit modası geçmiş) :

Sq+                      e# Read the input and prepend with a space
   {            }%       e# For each input character
    _".?!"&              e# Copy and check if its one of ., ? and !
           {][}&         e# If it is one of the above, wrap everything till now in an array
                         e# and start a new array to be wrapped next time we get one of those
                         e# three characters. We now have an array of strings, each having
                         e# a single sentence
                  W%     e# Reverse the ordering of these sentences
                    s(   e# Convert to string and remove the first space

Buradan çevrimiçi deneyin


Ah, bu gönderiyi ilk düzenledikten hemen sonra yaptın. Şimdi -5 bonus kazanıyorsun (Sadece biraz daha zorlaştırmak için) Yani -5 bonus sana! 18 bayt, vay, yenilebilir olup olmadığından emin değilim: P

5

J, 35 32

Neredeyse tekli kesme işaretlerinden kaçmak zorunda kalmam dışında bonus girdisini işliyor, bu yüzden sanmıyorum. (Ayrıca, buraya ilk gönderim)

f=.;@|.@(]<;.2~'.?!'e.~])@,~&' '

Kullanımı:

f 'Hello friend. What are you doing? I bet it is something I want to do too!'

4

Perl, 27/25

#!perl -n
print reverse/ |[^.!?]*./g

Veya komut satırından:

$perl -nE'say reverse/ |[^.!?]*./g'

Güzel! perl -nE 'say reverse/ |[^.?!]*.\)?/g'Toplam sayınızı 23'e getirerek -5 bonusu
kazanabilirsiniz

2

PHP, 60

echo join(' ',array_reverse(preg_split('/(?<=[?!.])/',$s)));

[?!.]\KBunun yerine normal ifadeyi kullanabilir misiniz ?
Martin Ender

Ayrıca, bölünecek desene boşluk eklemezseniz, dizeye ek boşluklar eklemez mi?
Martin Ender

@ MartinBüttner, hayır, veriye geri katılırken uygun işareti geri yükleyemeyeceğim, bu yüzden karakteri tüketmeyecek bir şeye ihtiyacımız var.
romaninsh

2

Bash + coreutils, 40 bayt

sed 's/\([?.!]\) */\1\n/g'|tac|tr \\n \ 

Bu STDIN okur, böylece girdi beni bir dosyadan yeniden yönlendirebilir veya basitçe, örneğin:

$ printf 'Hello friend. What are you doing? I bet it is something I want to do too!' | sed 's/\([?.!]\) */\1\n/g'|tac|tr \\n \ 
I bet it is something I want to do too! What are you doing? Hello friend. 
$ 

Bu gerçekten (foo bar.)bir birim olarak değiştirilen anlamda parantezler için işe yarıyor mu?
Martin Ender

@ MartinBüttner Soru düzenlenmiş gibi görünüyor, bu yüzden artık bonusu talep edemiyorum :(
Digital Trauma

2

Pip , 25 bayt

a.:sRV(a^@2+$ALa@*^".?!")

Giriş dizesi bir boşluk ekleme sonra biz tüm indisleri bulmak ., ?ve !, 2 ekleyin ve kullanımı^@ cümle dizesi (bir boşluk bırakılarak yazılır her) kırmak için operatör de bölünmüş-. Listeyi tersine çevirdiğinizde, program sonunda otomatik olarak yazdırılır. Voila

Girdili ana hesaplamanın aşamalarını gösteren örnek A! B? C. D!:

              ^".?!"     ["." "?" "!"]
           a@*           [[7] [4] [1 10]]
        $AL              [7 4 1 10]
      2+                 [9 6 3 12]
   a^@                   ["A! " "B? " "C. " "D! "]
RV(                 )    ["D! " "C. " "B? " "A! "]

                         D! C. B? A! 

Hayır
Optimizer

2

Retina , 61 34 33 30 bayt

Bunu 24 byte azaltmak için nutki'ye verilen krediler.

^
#
+`(#.*[.!?]) (.+)
$2 $1
#
<empty>

Nerede <empty> boş bir çizgi anlamına gelir. Bu #, girdinin bir parçası olmadığını varsayar , ancak bu meşru değilse, "(sadece bonusu ele almam gerekir) veya yazdırılamaz bir şey dahil olmak üzere başka bir karakter için değiştirebilirim . -sBayrağı kullanırsanız kodu tek bir dosyada çalıştırabilir veya her satırı ayrı bir dosyaya koyabilir ve tümünü Retina'ya iletebilirsiniz.

Bunu tek bir regex değiştirme ile tersine çevirmek mümkündür, ancak gerçekten hantal. .NET dengeleme gruplarında bile 90 baytlık bir şeye ihtiyacım vardı, bunun yerine birden çok adımda yapmayı denedim.

Retina'da her satır çifti, ilk satırın desen ve ikinci satırın yedek olduğu bir değiştirme aşamasıdır.

^
#

Bu aşama, dizeyi daha sonraki işlemler için hazırlar. #İşaretçi olarak a'yı öneriyor . Bu işaretleyici, önündeki her şeyin zaten doğru yere yerleştirildiğini ve sonraki her şeyin hala işlenmesi gerektiğini gösterir.

+`(#.*[.!?]) (.+)
$2 $1

Bu aşama, son cümleyi tekrar tekrar #(işlemdeki dize boyunca ilerler ) önüne taşıyarak cümleleri değiştirir . +`Çıktı değişen durana kadar bu aşamayı tekrarlamak Retina talimatını verir. Örnek olarak, girdinin nasıl foo. bar! blah?işleneceği aşağıda açıklanmıştır:

#foo. bar! blah?
blah? #foo. bar!
blah? bar! #foo.

Ve son olarak işaretleyiciyi kaldırıyoruz:

#
<empty>

Neden sadece .+=> $0 #ve tekrarlanan (.*?[.!?] )(.*#)=> değil $2$1?
nutki

@nutki Oh, bu çok daha hoş, teşekkürler. :)
Martin Ender

1

Java, 113

s->{String t[]=s.split("(?<=[\\.?!]) "),u="";for(int i=t.length;i-->0;)u+=t[i]+" ";return u.replaceAll(".$","");}

1

JavaScript (ES6) 47 45

Belirtildiği gibi, bu basit bir normal ifade egzersizidir. Javascript dilinde:

// ES6 - FireFox only
F=t=>t.match(/\S[^.!?]+./g).reverse().join(' ')

// ES5 - so much longer
function G(t){return t.match(/\S[^.!?]+./g).reverse().join(' ')}

// TEST

alert(G("Hello friend. What are you doing? I bet it is something I want to do too!"))
 


Javascript yapacaktım, ama sen beni dövüyordun.
BobTheAwesome

Bu, son cümle (başlangıçta ilk) hariç her şeyden önce ekstra boşluklar üretir. Görev iyi tanımlanmadığından, sorun olup olmadığından emin değilim.
nutki

@nutki evet, katılıyorum. Sabit
EDC65

1

Python 2, 62

Muhtemelen bayt maliyetine değer olmadığı için bonusu geliştirmeyeceksiniz.

import re
print' '.join(re.split('(?<=[?!.]).',input())[::-1])

Bu bonus için geçerli değildir. Sorudaki bonus örneğe bakın
Optimizer

@Optimizer Soru geçmişine bakın. Bonus eklemek için sorumu güncellediğimde, çıktım örnekle eşleşti. Parantezin bir süre dışında olabileceğini gösteren hiçbir şey yoktu.
mbomb007

Bence niyet bu sadece başlangıçtan beri. Ancak daha sonra sağlam bir örnek geldi. Hala bonusu alacağınız anlamına gelmez :) (Benimkini de kaldırdım)
Optimizer

1

Matlab (93 bayt)

y=[32 input('','s')];y=sortrows([cumsum(ismember(y,'?!.'),'reverse');y]',1)';disp(y(4:2:end))
  • Bu, girdinin ön veya arka boşluk içermediğini varsayar
  • Standart giriş ve çıkış kullanır
  • Matlab 2014b'de test edildi

1

Yakut 41

Diğer Ruby cevaplarında yeterli WTF yok.

#!ruby -apF(?<=[.!?])\s
$_=$F.reverse*" "

Bu en azından Ruby 2'de çalışır. aVe Fanahtarı 1.8.7'de çalışıyorsa, sanırım $_=üç karakteri kaydetmek için düşebilirsiniz .

Stdin'deki her satırı tersine çevirir ve stdout'a yazdırır:

$ ruby foo.rb <<< "Hello. Hi. How are you? Good, you? fine, thanks."
fine, thanks. Good, you? How are you? Hi. Hello.

Lütfen cevabı açıklar mısınız?
Mhmd

1

Ruby, 48 (koymadan 42) bayt

reverse_sentence.rb

puts $*[0].scan(/\S[^.!?]+./).reverse.join(" ")

Kullanımı:

ruby reverse_sentence.rb 'Hello friend. What are you doing? I bet it is something I want to do too!'

Çıktı:

I bet it is something I want to do too! What are you doing? Hello friend.

Eleştiri hoş karşılanmıyor.


2
Eleştiri: "Cümle" yi yanlış hecelediniz.
Alex

6 karakteri kaydet: .join(" ")=>*" "
daniero

@AlexA. Şimdiye kadarki en iyi geri bildirim!
DickieBoy

@daniero teşekkürler, bilmek güzel
DickieBoy

1

k, 31

{1_,/|(0,1+&x in"?!.")_x:" ",x}

.

k){1_,/|(0,1+&x in"?!.")_x:" ",x} "Hello friend. What are you doing? I bet it is something I want to do too!"
"I bet it is something I want to do too! What are you doing? Hello friend."

0

LINQPAD - 93-5 = 88 bayt

void Main(){string.Join(" ",Regex.Split(Console.ReadLine(),"(?<=[.?!]) ").Reverse()).Dump();}

C # Konsol Uygulaması 189 - 5 = 184 bayt

using System;using System.Linq;using System.Text.RegularExpressions;class P{static void Main(){Console.WriteLine(string.Join(" ",Regex.Split(Console.ReadLine(), "(?<=[.?!]) ").Reverse()));}}

regex utanmadan Alex A. kırbaçlandı :)


Uygulamanızı namespace Systembu using Linq;usingText.RegularExpressions2x tasarrufun içine koyarak 7 bayt tasarruf edebilirsiniz system.
ldam

Bunun bonus için uygun olduğunu düşünmüyorum. Sorudaki bonus örneğe bakın
Optimizer

0

Clojure - 44 71 karakter

(defn rs[s](reverse(re-seq #"\S.+?[.!?]"s)))

Geliştirilmiş ve basitleştirilmiş RE, gereksiz boşlukları ortadan kaldırdı.

Çıktı, orijinal dizedeki cümlelerin bir sırasıdır ve cümlelerin sırası tersine çevrilmiştir:

Girdi: "Merhaba arkadaşım. Ne yapıyorsun? Eminim ben de yapmak istiyorum!" Çıktı: ("Eminim ben de yapmak istiyorum!" "Ne yapıyorsun?" "Merhaba arkadaşım.")


0

Yakut, 47

$><<gets.strip.split(/(?<=[.?!]) /).reverse*' '

için kredi Martin Büttner bazı karakterleri kaydetmek için.


1
getsBir bayt kaydetmek için STDIN ile girişi okuyabilir, bayt kaydetmek için yazdırabilirsiniz $><<(boşluğa gerek yoktur) ve *''iki bayt kaydetmek için dizeye katılabilirsiniz .
Martin Ender

@ MartinBüttner öneri için teşekkürler, yine de STDIN girişinden okuma ile gitmek olmazdı. Çünkü yeni bir çizgi olacak.
Mhmd

Aslında, kodunuzun şu anda önde gelen bir alanla sonuçlanacağını düşünüyorum.
Martin Ender

mmm, haklısın. Ne yapmam gerektiğini göreceğim.
Mhmd

0

CJam, 21 bayt

1q{1?_"!.?"-}%1a/W%S*

Bu !, s, .s ve ?s'den sonraki boşlukları 1 rakamına çevirerek çalışır ( karakteri değil 1 karakterine veya kod noktası 1'e sahip , böylece giriş yine de içerebilir), 1'lere bölünerek, ortaya çıkan parçaların sırasını tersine çevirir ve birleşir boşluklara göre.

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

1                     e# B := 1
 q                    e# Q := input()
  {         }%        e# for each C in Q (map):
   1?                 e#   C := B ? C : 1
     _"!.?"-          e#   B := string(C).strip("!.?")
              1a/     e# Q := Q.split([1])
                 W%   e# Q := reverse(Q)
                   S* e# Q := Q.join(" ")
                      e# print(Q)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.