Sorunuz tam olarak neydi?


19

Giriş

Sıkıcı bir metin verildiğinde, metni olabildiğince hızlı bir şekilde ele geçirmek istersiniz. Aşağıdaki metni inceleyelim:

Ens colligi timenda etc priorem judicem. De quascunque ii at contingere 
repugnaret explicetur intellectu. Adjuvetis hoc fortassis suspicari opportune 
obversari vix eam? Dei praemia prudens hominum iii constet requiri haberem. Ima 
sane nemo modi fuit lus pro dem haud. Vestro age negare tactum hoc cui lor. Ne et 
ut quod id soli soni deus. At constare innumera is occurret ea. Nia calebat seu 
acquiro fraudem effingo dicimus.

Not: Bu metinde okunabilirlik için yeni satırlar bulunurken, işlemeniz gereken test senaryolarında yeni satır karakterleri yoktur.

Metni gözden kaçırmanın bir yolu, yazarın metne sorduğu soruları bulmaktır. Örneğin, yukarıdaki metinde 1 soru var. Yani:

Adjuvetis hoc fortassis suspicari opportune obversari vix eam?

Bu, metni cümlelere bölerek yapılabilir. Bir cümle her zaman aşağıdaki noktalama işaretlerinden biriyle sona erer: .?!(diğerlerinin işlenmesi gerekmez). Bunlardan başka semboller cümlenin bir parçasıdır.


Görev

Yalnızca aşağıdakilerden oluşan bir metin satırı verilir:

  • harfler (A-Za-z)
  • sayılar (0-9)
  • alanlarda
  • punctuation ( ,.;:?!) (bir cümle bunlardan biriyle başlayamaz).

Metindeki soruları makul bir formatta çıkarın. Metnin her zaman en az 1 sorusu olacağını varsayabilirsiniz . Çıktısı sondaki ve öncü önce ve bir soru bırakılır sonra boşluk.

Önemli : Bir Sonraki noktalama sembolü, orada olacak asla (örneğin başka bir noktalama sembolü olmak ??geçersizdir ve sap için gerekli edilmeyecektir).


Test senaryoları

Biçiminde:

Input
Output(s)

Test senaryoları:

Huh? I haven't heard what you just said. Could you repeat that please?
Huh?
Could you repeat that please?

plz can i haz cheesburgr? i am cat pls.
plz can i haz cheesburgr?

This is a badly formatted question.Can u please help me,or my friends,with formatting this question    ?thankyou.
Can u please help me,or my friends,with formatting this question    ?

a.b.c.d?
d?

Does this question have a question mark? yes
Does this question have a question mark?

Why example.com resolves to 127.0.0.1 in 99.9 percent of cases?
9 percent of cases?

A? b? c? d!
A?
b?
c?

Bu , bu yüzden en az bayt ile gönderme kazanır!


2
.?!Diğerleri olmamalıdır Kurallarınızın belirtmek gibi ele alınması, ancak diğerleri söylediler yok işlenecek.
Outgolfer Erik

Birden fazla sorusu olan bir testcase yok mu?
edc65

@ edc65 İlk test senaryosunun 2 sorusu var, ancak başka bir test vakası ekleyeceğim.
Adnan

Yanıtlar:



5

Python, 46 Bayt

import re
f=lambda s:re.findall("[^!?.]*\?",s)

İle ara:

f("your string here")

test çıktısı:

['Can u please help me,or my friends,with formatting this question    ?', 'Can u please help me,or my friends,with formatting this question    ?', ' Huh?', ' Could you repeat that please?', ' plz can i haz cheesburgr?', 'd?', 'Does this question have a question mark?', '9 percent of cases?', 'A?', ' b?', ' c?']

başka bir fikir, 77 bayt (python3'te filtre etrafında bir listeye ihtiyacınız olacak):

import re
f=lambda s:filter(lambda x:x[-1]=="?",re.split("(?<=[\.\?!]).",s)))

Ben bu konuda yeniyim, bu yüzden bu muhtemelen çok daha kısa olabilir.

Martin sayesinde -17 (!) Bayt

-2! Bayt "!", "?" veya "." (Kabuk çözümlerine yaklaşıyorum, ama çok daha fazla tasarruf edebileceğimden şüpheliyim)


1
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Çok güzel ilk cevap :).
Adnan

Bu [\w,:; ]*gözün arkasına ihtiyacın olduğunu düşünmüyorum ve ne de ungreedy yapmana gerek yok (çünkü bu grup zaten bir noktalama karakterini geçemez) ve daha sonra da .girdinin başına geçmene gerek yok . Geri kalan karakter sınıfını da kısaltırsınız [^.!?].
Martin Ender

Teşekkürler, Martin! Bu biraz denedim, ama bariz görmedim.
KarlKastor

4

JavaScript, 35 24 bayt

a=>a.match(/[^.?!]*\?/g)

İade bir sonra başlayan tüm altdizgelerin ., ?ya !(veya metin başlamak üzere) bir ve sonunda ?.


Urgh. 40 bayt ile iyi yaptığımı düşündüm. İyi iş OP ve @MartinEnder
MayorMonty

3

V , 12 bayt

Í[^.!?]*[.!]

Çevrimiçi deneyin!

Çok basit bir cevap.

Í             "Remove every occurrence, on every line
 [^.!?]       "Of any character that isn't '.', '!', or '?'
       *      "Repeated any number of times
        [.!]  "Followed by a a '.' or a '!'

Neyse ki, yeni satırları işlemek veya tüm test senaryolarını doğrulamak bayt eklemez.


3

Jöle , 16 bayt

f€“.?!”0;œṗfÐf”?

Çevrimiçi deneyin! veya tüm test durumları doğrulamak


28 bayt, değil mi? (16 UTF-8 karakter)
Fabio Iotti

6
@ bruce965 Jelly, anladığı 256 karakterin her birini tek bayt olarak kodlayan özel bir kod sayfası kullanır. Bayt buna başlık noktalarında bağlar.
Dennis

Vaay havalı! Ben henüz bir codegolfer değilim, bu yüzden bu hilelerin farkında değilim, soru için üzgünüm.
Fabio Iotti

4
@ bruce965 Kayıt için, bu bir hile değil: dil ISO 8859-1'i (veya mevcut başka bir tek baytlı kodlamayı) da kullanabilir ve aynı derecede güçlü olabilir, ancak özel bir kod sayfası kullanmak daha fazlasını kullanmanıza izin verir Kolayca yazılabilir karakterler ve daha iyi anımsatıcılar, örneğin kontrol karakterleriyle kodlamak zorunda olduğunuzdan daha iyi. Günün sonunda, sadece her baytın bir anlamı atandığı sadece bir bayt akışı.
Martin Ender

2
Tamam, "hile" kötü bir çağrışımla gelmiş olabilir, ben "stratagem" falan demeliydim. "Hile" den daha iyi bir kelime bulamadım.
Fabio Iotti

3

Kabuk yardımcı programları, 43 38 bayt

5 baytlık düzeltme için rexkogitans'a teşekkürler !

tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"

Boru girişi, şöyle:

echo Huh? I haven't heard what you just said. Could you repeat that please?|tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"

Eğer önemliyse, kullanıyorum:

  • GNU tr5.3.0
  • GNU sed4.2.1
  • Microsoft cmd.exe, Windows 5.1.2600 ile birlikte gelir

  • 1
    Daha önce birden fazla yardımcı program kullanarak hiç bir yanıt göndermedim, bu yüzden yanlış bir şey yapıyorsam bana bildirin.
    Joe

    GNU araçlarının Windows sürümlerini veya pencereler için bir kabuk kullanıyor musunuz?
    Outgolfer Erik

    tr ? "\n"|sed "s/.*[\.!]//;s/.\+/&?/"5 Bayt kaydeder (ikisi eklendi trve 7 kaydedildi sed- bu bash'da test edildi). /gsatır satır işlendiği için gerekli değildir.
    rexkogitans

    @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ, GNU yardımcı programlarının Windows bağlantı noktalarını kullanıyorum.
    Joe

    @rexkogitans, teşekkürler! Ben unuttum []; ilk denemem buna benziyordu \(\.|!\).
    Joe

    2

    Perl 5.10, 21 18 bayt ( -n bayrağıyla)

    say m/[^?.!]+\?/g
    

    Sorunun doğrudan uygulanması.

    Burada deneyin!


    Sen önde gelen kurtulabilirsiniz msenin regex ait ve sonra arasında boşluk kaldırmak mümkün olacak sayve/
    Dada

    2

    Yakut 1.9, 17 bayt

    $_=$F
    

    Aşağıdaki komut satırı seçenekleriyle çağrılması gereken 5 baytlık bir program:

    paF[^?]*[.!]
    

    Ruby bayraklarının bu şekilde boğuşabileceğini bilmiyordum, +1! Diğer sorular ayrı olsa da, birbirini izleyen sorular bu dizi içinde bir dize olarak birlikte olacağından, biraz garip geliyor, değil mi? Farkında olmadığım bir Ruby 1.9 tuhaflığı olmadıkça.
    Değer Mürekkebi

    @ValueInk Dizinin içeriği bir araya getirilir, böylece program bir dizi değişmez değeri değil, tek bir dize çıkarır. Yakut 1.9 olan golf.shinh.org/check.rb adresinden deneyebilirsiniz . Bayraklar gövdede ayarlanabilir.
    xsot

    Aha, neden 2.0'dan beri 1.9'a ihtiyacınız olduğunu açıklıyor ve çıkış gerçek bir dizi gibi görünecek.
    Değer Mürekkebi

    1

    Toplu, 174 bayt

    @echo off
    set/ps=
    set t=
    :l
    set c=%s:~0,1%
    set t=%t%%c%
    if "%c%"=="?" echo %t%&set t=
    if "%c%"=="!" set t=
    if "%c%"=="." set t=
    set s=%s~1%
    if not "%s%"=="" goto l
    

    STDIN'den bir satır okumak, kullanmaktan daha kısa bir bayttır set s=%*.


    1

    PowerShell v4 +, 43 bayt

    ([regex]::Matches($args,'[^?!.]*\?')).Value
    

    Gerçekten anlaşılır. Girdiyi alır $argsve bunu ilk parametre olarak .NET [regex]::Matches(...)statik işlevine gönderir. Eşleştirdiğimiz normal ifade [^?!.]*\?- yani, bir soru işareti izleyen herhangi bir cümle sonu olmayan karakter. Statik işlev, hangi yakalama grubu, dizin vb. Ayrıntılarını veren bir nesne dizisi döndürür, ancak yalnızca .Values'yi istiyoruz , bu nedenle dönüş parens içinde kapsüllenir ve bu özelliği çağırırız. Bu, v4 + gereksiniminin devreye girdiği yerdir, önceki sürümlerde olduğu gibi bunun yerine bir döngü gibi bir şey yapmanız |%{$_.Value}veya |Select Valueuygun özellikleri elde etmeniz gerekir.

    Parensiz örnek ve .Value

    PS C:\Tools\Scripts\golfing> .\what-exactly-was-your-question.ps1 "Huh? I haven't heard what you just said! Could you repeat that please?"
    
    Groups   : {Huh?}
    Success  : True
    Captures : {Huh?}
    Index    : 0
    Length   : 4
    Value    : Huh?
    
    Groups   : { Could you repeat that please?}
    Success  : True
    Captures : { Could you repeat that please?}
    Index    : 40
    Length   : 30
    Value    :  Could you repeat that please?
    

    Parens ile örnek ve .Value

    PS C:\Tools\Scripts\golfing> .\what-exactly-was-your-question.ps1 "Huh? I haven't heard what you just said! Could you repeat that please?"
    Huh?
     Could you repeat that please?
    

    1

    Python 3, 91 bayt

    def f(x,a=0):
     for n in range(len(x)):
      if x[n]in".!":a=n+1
      if x[n]is"?":print(x[a:n+1])
    

    Python 2'de 1 bayt kaydeder:

    def f(x,a=0):
     for n in range(len(x)):
      if x[n]in".!":a=n+1
      if x[n]is"?":print x[a:n+1]
    
    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.