Kod Golf: İleri sdrawkcaB sdrawkcaB İleri İleri sdrawkcaB


14

Görev

  • Kullanıcı bir cümle girer - sadece kelimeler. Tamsayılar ve noktalama işaretleri de dahil olmak üzere, harfler veya boşluklar dışındaki tüm girdiler bir istisna oluşturmalıdır: "Cümle yalnızca harfleri kullanmalıdır".
  • Çıktıda bazı kelimelerin ters çevrildiği ve bazı kelimelerin normal olduğu bir desen bulunur.
  • Örüntü normal bir sözcük olarak başlar, sonraki iki sözcük tersine çevrilir, sonraki iki sözcük normaldir ve örüntü devam eder.
  • Kelimelerin nerede normal olması gerektiğine ve kelimelerin nerede tersine çevrildiğine bir örnek aşağıdadır:

Normal - Ters - Ters - Normal - Normal - Ters - Ters - Normal ...

Giriş Örneği

Deniz kıyısında deniz kabukları satıyor

Çıktı Örneği

AeS kıyısında aeS mermileri slles

Ek Kurallar

  • Büyük harfler kullanılırsa, aslen gönderildikleri mektupta kalmalıdırlar.
  • Başlangıçta girişe gönderilen birden çok boşluk bir boşluğa indirilmelidir. Örneğin Programming Puzzles and Code Golf,Programming selzzuP dna Code Golf

En Kısa Kod Kazandı !!

Mutlu kodlama ...


8
Çoğu programlama dilinin istisnası yoktur.
Kapı tokmağı

15
@nimi Bu kadar önemsiz bir nedenden ötürü, bir meydan okumayı küçük bir dil alt kümesiyle sınırlamak tamamen gereksiz görünüyor.
Kapı tokmağı

10
Aksi takdirde bu iyi zorluk kural tarafından mahvoldur Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Bu, kelimeleri tersine çevirme zorluğu ile tamamen ilgisiz ikincil bir görev uygulamak, istisnaları olmayan dilleri kesmek ve çok fazla yer kaplayan uzun bir dizeyi zorlamak veya sıkıştırmak anlamına gelir. bayt sayısı.
xnor

2
@Belfield Evet, bağını görüyorum. Sanırım şimdi yapabileceğin hiçbir şey yok. Gelecekte, göndermeden önce geri bildirim almak için Sandbox'ta yayınlamayı deneyin .
xnor

3
@ İyi bir meydan okuma, iyi bir yanıttan çok daha zordur. Zaten bu bir zevk ve sonraki wil daha iyi.
edc65

Yanıtlar:


15

TeaScript , 55 bayt 58 60 69 76 78 80 87 89

xO`a-z `?xl(#~-i&2?l:lv(),/ +/):Ld`SÀZn­ Û § «e Ò5s`

Bu çok kısa, bundan çok memnunum.

Son ~ 20 karakter anlamsız gelebilir, ancak bu "Cümle yalnızca harfleri kullanmalıdır" olarak kodlanmıştır. Tüm karakterlerin 256'nın altında karakter kodları vardır, böylece her biri bir bayttır

açıklama

xO`a-z `?  // If input contains only a-z and space...

   xl(#       // Loop through input 
      ~-i&2?  // If (index - 1 "unary and"ed with 2) isn't 0...
          :l,     // Leave alone
          lv()    // Otherwise, reverse string
       / +/ // Loops on spaces
   )

:Ld`SÀZn­ Û § «e Ò5s` // Otherwise... decompress and print  the error string

Testi gönderdiğiniz için teşekkürler - çok güzel. Hata söz konusu olduğunda her biri aynı teknede - bu çizgide golf yok
Belfield

Garip, şimdi Firefox'ta çalışıyor. Ama daha önce Firefox'u da kullandım.
Jakube

Şimdiye kadarki en iyi cevap!
Belfield

Ne? Pyth'i yendin mi ?! JS tabanlı bir dille?!? Bu nasıl mümkün olabilir?!?!
ETHproductions

2
Dennis rekabet etmediği sürece her zaman kazanabilirsin: p
Downgoat

4

Haskell, 141 bayt

r=reverse
f x|all(`elem`(' ':['a'..'z']++['A'..'Z']))x=unwords$zipWith($)(cycle[id,r,r,id])$words x|1<2=error"Sentence must only use letters"

Kodun neredeyse 2 / 3'ü hata kontrolü içindir. Gerçek dünyadaki ilk zorluk gibi görünüyor.

İş, unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xgirdiyi bir kelime listesine bölerek, döngü işlevler listesiyle sıkıştırır [id,reverse,reverse,id,id,reverse...]ve sonucu boşluklarla tek bir dizeye birleştirir.

@Christian Irwan'a 2 bayt için teşekkürler.


"Cümle sadece kullanıcı harfleri" olarak değiştirilebilir "Cümle sadece harfleri kullanmalıdır" - hatadaki benim hatam!
Belfield

@Belfield: sabit
nimi

Neden olmasın r=reverse?
Akangka

@ChristianIrwan: Teşekkürler! (Erken bir sürümünde bir isimsiz bir pointfree işlevi vardı, bu yüzden iki kez kullanarak reverseve r=reverseaynı uzunluğu vardı, çünkü eksik f=. Pointfree olmayan hareket ederken tekrar kontrol etmedi).
nimi

3

JavaScript (ES6) 122

f=s=>/[^a-z ]/i.test(s)?"Sentence must only use letters":s.split(/ +/).map((w,i)=>~-i&2?w:[...w].reverse().join``).join` `

alert(f(prompt('?','She sells Sea shells on the Sea shore')))


Girişte yeni satır varsa, bunun olması gerektiğini düşünmüyorum örneğinden bir hata çıktı
Downgoat

1
@ Vɪʜᴀɴ zor, Örnek birden fazla alanla ilgili, ancak daha sonra birden fazla alan yok - sadece 1 yeni satır. Bence SO editörü tarafından yönetildi. Yeni satırları ve diğer genel alanı
yönetmemiz gerekiyorsa

2

Retina , 103 bayt

\s+

(?<=^\S+ (\S+ )?((\S+ ){4})*)
;
+`(;\S*)(\S)
$2$1
;

i`.*[^a-z ].*
Sentence must only use letters

İkinci satırda, SE'nin yutuyor gibi göründüğü tek bir boşluk olmalıdır. Kodu -sbayraklı tek bir dosyadan çalıştırın .

Retina'nın istisna kavramı yoktur, bu nedenle Sentence must only use lettersgirişte harf olmayan boşluk olmayan karakterler varsa çıktı basitçe değiştirilir .



2

Python, 163 160 157 145

k=raw_input()
k=["Sentence tsum ylno use letters",k][k.replace(' ','').isalpha()]
for i,x in enumerate(k.split()):print x[::-1if(i+1)/2%2else 1],

15 karakter kaldırıldı, teşekkürler Mego !!


Evet, korkan nimi'nin bir anlamı var ...
Belfield

Vur, özledim. Ben gözden geçireceğim.
Geyik

@Mego, re.search, sonuç bulunmazsa None (dizin olarak kullanılamaz) döndürür ve "! = None" eklemek aslında orijinal yöntemimden bir bayt daha uzun olur. Yine de son iki satırı birleştirerek 3 bayt kazandım. Teşekkürler!
Geyik

1

Bash + coreutils, 108

[ ${@//[a-zA-Z]/} ]&&echo Sentence must only use letters||for t;{
((++i/2%2))&&rev<<<$t||echo $t
}|tr \\n \ 

Bu programın son karakteri bir boşluktur.

Giriş komut satırından alınır:

$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf
Programming selzzuP dna Code Golf $ 
$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf1
Sentence must only use letters
$ 


1

Julia, 109 bayt

s->(i=0;join([isalpha(w)?(i+=1)%4>1?reverse(w):w:error("Sentence must only use letters")for w=split(s)]," "))

i=0ve (i+=1)%4>1her kelimenin reversed olup olmadığına karar vermek için kullanılır . harf olmayan karakterler olup olmadığını belirlemek isalphaiçin bölünerek sözcüklere uygulanır split(s)(boşluklar bu noktadan önce kaldırılmıştır). atılmadıkça join, manipülasyondan sonra dizeyi geri yükler error.


1

Julia, 150 134 bayt

s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))

Ungolfed:

function f(s::AbstractString)
    if ismatch(r"[^a-z ]"i, s)
        error("Sentence must only use letters")
    else
        i = 3
        a = [(i += 3; isodd((i + 1)i ÷ 2) ? reverse(w) : w) for w = split(s)]
        return join(a, " ")
    end
end

Glen O sayesinde 16 bayt kaydedildi!


Başka bir şeyden önce, ilk koşullu mantığın tersine çevrilmesini rve sonucu olarak atanmasını önerebilir miyim ? Yani, r=ismatch(...)||error(...)- birkaç karakteri tıraş edecek ve kullanılan koşulu tersine çevirecektir r. Yine yorum yapacak, şüpheli, biraz daha fazla tasarruf
Glen O

Küçük düzeltme - ||Olumsuzlukla uğraşmak zorunda kaldım , sonra olumsuzlamanın gerekli olmadığını fark ettim. Geri döndürün &&. Ve daha da iyisi, daha iyi ?:yapmak için kullanın . s->(r=ismatch(r"[^a-z ]"i,s))?error("Sentence must only use letters"):join([(iseven(i)&&(r=!r);r?reverse(w):w)for(i,w)=enumerate(split(s))]," ")144 bayt için. Ve sanırım içeride daha iyisini yapabilirim join...
Glen O

İşte 134 bayt ile çözümünüzün aerodinamik bir versiyonu:s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))
Glen O

@GlenO Harika öneriler, teşekkürler!
Alex A.

0

Pyth, 55 bayt

?--rz0Gd"Sentence must only use letters"jd.e_W%%k4 3bcz

%%k4 3Biraz Pietu1998'den ödünç aldım. Bir bayt daha kaydetti.

Çevrimiçi deneyin: Gösteri veya Test Paketi

açıklama

?--rz0Gd"..."jd.e_W%%k4 3bcz   implicit: z = input string
   rz0                         convert z to lower-case
  -   G                        remove all letters
 -     d                       remove all spaces
?                              if there is some chars left than
        "..."                    print the string "Sentence must only ..."
                               else:
                          cz     split z by spaces or multiple spaces
               .e                map each pair (k index, b string) of ^ to: 
                 _       b          b or reversed of b, depending on
                  W%%k4 3           (k mod 4) mod 3
             jd                  join the result by spaces


0

Java, 215 bayt

Regex eğlenceli

s->{if(s.split("[^a-zA-Z ]").length>1)throw new Error("Sentence must only contains letters");else{int i=1;for(String a:s.split(" "))System.out.print((i++%2<1?new StringBuffer(a).reverse():a)+(a.isEmpty()?"":" "));}}

Çevrimiçi deneyin!


Çıktınız şu anda doğru değil. Şimdi çıktınız She slles aeS shells no the aeS shore, ancak bunun She slles aeS shells on eht aeS shoreyerine (önce normal; daha sonra 2 çift olarak dönüşümlü veya ters) olmalıdır. Bunun iki nedeni var. Artık ibir öğe boş olsa bile artarsınız ve bunun yerine i++%2<1olması gerekir i++%4>1. Burada sabit 211 baytlık bir sürüm var.
Kevin Cruijssen

@KevinCruijssen yeterince dikkatli okumadığım için aldığım şey bu
Benjamin Urquhart

0

Jöle , 39 bayt

³Ḳ¹ƇUJ2&TƲ¦K
“*[,ṛDṾȧƤ°Ġṛ©¦»
ØẠ” ṭ³eƇ⁼£

Çevrimiçi deneyin!

Outgolfer Erik'e teşekkürler. Beni birkaç ekstra bayttan ve saatler süren hayal kırıklığından kurtardı.

İşte 46 baytlık bir çözüm

Giriş geçersiz karakterler içerdiğinde aslında bir python sözdizimi hatası atar.

³Ḳ¹ƇUJ2&TƲ¦K
“çỤḷṁŀDṀẠṠGmḟĖƲƑ⁽Ḳḟ»ŒV
ØẠ” ṭ³eƇ⁼£

Çevrimiçi deneyin!


0

Japt v2.0a0 -S, 41 bayt

¸¬è\L ?`SÀZn­ Û § «e Ò5s`:UeS²S ¸ËzEc2

Dene

¸¬è\L ?`...`:UeS²S ¸ËzEc2     :Implicit input of string U
¸                             :Split on spaces
 ¬                            :Join
  è                           :Count occurrences of
   \L                         :RegEx /[^A-Z]/gi
      ?`...`:                 :If truthy return the compressed string "Sentence must only use letters", else
             Ue               :Recursively replace in U
               S²S            :  Two spaces with one
                   ¸          :Split on spaces
                    Ë         :Map each element at 0-based index E
                     z        :  Rotate clockwise by 90 degrees multiplied by
                      Ec2     :    E rounded up to the nearest multiple of 2
                              :Implicit output, joined with spaces

0

05AB1E , 36 bayt

ðKDáÊi“¸–ƒ—€É€Å™ê“.ªFë#áεN4%>2÷iR]ðý

Çevrimiçi deneyin.

Giriş yalnızca içermediğinde aşağıdaki hatayı atar [A-Za-z ]:

(RuntimeError) Cümle dönüştürülemedi Yalnızca tamsayıya harfler kullanılmalıdır.

Açıklama:

ðK                   # Remove all spaces from the (implicit) input-string
  Dá                 # Create a copy, and remove everything except for letters from this copy
    Êi               # If the copy with letters removed and the original are NOT equal:
      “¸–ƒ—€É€Å™ê“   #  Push dictionary string "sentence must only use letters"
                   #  With sentence capitalization
      F              #  And try to loop that many times, causing the error above
     ë               # Else:
      #              #  Split the (implicit) input-string on spaces
       á             #  Only keep letters (which will remove empty items caused by multiple
                     #  adjacent spaces in the input, which is shorter than `õK`)
        ε            #  Map each word to:
         N4%>2÷      #   Calculate ((index modulo-4) + 1) integer-divided by 2
                     #   (results in 0,1,1,2,0,1,1,2,0,1 for indices 0,1,2,3,4,5,6,7,8,9)
               i     #   If this is exactly 1:
                R    #    Reverse the current word
     ]               # Close the if-statement, map, and if-else statement
      ðý             # Join the modified word-list by spaces
                     # (and then output it implicitly as result)

Neden “¸–ƒ—€É€Å™ê“olduğunu anlamak için bu 05AB1E bahşişime bakın ( sözlük nasıl kullanılır? )"sentence must only use letters" .


0

PHP , 147 bayt

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))throw new Exception('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

Çevrimiçi deneyin!

Veya die()"İstisna" olarak kabul edilebilirse:

PHP , 131 bayt

foreach(explode(' ',$argn)as$a){if(!ctype_alpha($a))die('Sentence must only use letters');$o.=(++$i%4>1?strrev($a):$a).' ';}echo$o;

Çevrimiçi deneyin!

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.