Kode Golf: Maju sdrawkcaB sdrawkcaB Maju ke depan sdrawkcaB

14

Tugas

  • Pengguna memasukkan kalimat - kata saja. Input apa pun selain huruf atau spasi, termasuk bilangan bulat dan tanda baca, harus memberikan pengecualian: "Kalimat hanya boleh menggunakan huruf".
  • Outputnya memiliki pola, di mana beberapa kata dibalik dan kata-kata lain normal.
  • Pola dimulai sebagai kata normal, dua kata berikutnya dibalik, kemudian dua kata berikutnya normal dan pola berlanjut.
  • Contoh di mana kata-kata harus normal dan di mana kata-kata terbalik adalah di bawah ini:

Normal - Terbalik - Terbalik - Normal - Normal - Terbalik - Terbalik - Normal ...

Contoh Input

Dia menjual kerang laut di tepi laut

Contoh Keluaran

Dia melempar peluru ke pantai

Aturan tambahan

  • Jika huruf kapital digunakan, mereka harus tetap pada huruf yang semula diposting.
  • Beberapa ruang yang awalnya diposting pada input harus dikurangi menjadi satu ruang. Misalnya Programming Puzzles and Code GolfmenjadiProgramming selzzuP dna Code Golf

Kode Terpendek Menang !!

Selamat coding ...

Belfield
sumber
8
Banyak bahasa pemrograman tidak memiliki pengecualian.
Gagang Pintu
15
@nimi Tampaknya sama sekali tidak perlu untuk membatasi tantangan ke subset kecil bahasa karena alasan sepele.
Gagang Pintu
10
Tantangan yang dinyatakan baik ini dihancurkan oleh aturan. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Ini berarti menerapkan tugas sekunder yang sama sekali tidak terkait dengan tantangan membalikkan kata, memotong bahasa yang tidak memiliki pengecualian, dan membutuhkan hardcoding atau mengompresi string panjang yang memakan banyak waktu. jumlah byte.
xnor
2
@ Bellfield Ya, saya melihat ikatan Anda. Saya kira tidak ada yang bisa Anda lakukan sekarang. Di masa mendatang, coba posting di Sandbox untuk mendapatkan umpan balik sebelum memposting.
xnor
3
@Belfield tantangan yang baik jauh lebih sulit daripada jawaban yang bagus. Saya menikmati yang satu ini, dan selanjutnya akan lebih baik.
edc65

Jawaban:

15

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

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

Ini sangat singkat, saya sangat senang dengannya.

Terakhir ~ 20 karakter mungkin tampak seperti omong kosong tapi itu "Kalimat harus hanya menggunakan huruf" yang disandikan. Semua karakter memiliki kode char di bawah 256 sehingga masing-masing satu byte

Penjelasan

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
Downgoat
sumber
Terima kasih telah memposting tes - sangat bagus. Setiap orang berada di kapal yang sama ketika datang ke kesalahan - tidak ada golf garis itu
Belfield
Aneh, sekarang berfungsi di Firefox. Tapi saya juga menggunakan Firefox sebelumnya.
Jakube
Jawaban terbaik sejauh ini!
Belfield
Apa? Anda mengalahkan Pyth ?! Dengan bahasa berbasis JS?!? Bagaimana itu mungkin?!?!
ETHproduk
2
@ETHproductions Anda selalu dapat menang selama Dennis tidak bersaing: p
Downgoat
4

Haskell, 141 byte

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"

Hampir 2/3 dari kode ini untuk pengecekan kesalahan. Tampaknya menjadi tantangan dunia nyata pertama.

Pekerjaan dilakukan dengan unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xmembagi input menjadi daftar kata, menutupnya dengan daftar fungsi bersepeda [id,reverse,reverse,id,id,reverse...]dan menggabungkan hasilnya dengan spasi kembali ke string tunggal.

Terima kasih kepada @Christian Irwan untuk 2 byte.

nimi
sumber
"Kalimat harus hanya huruf pengguna" dapat diubah menjadi "Kalimat hanya boleh menggunakan huruf" - kesalahan saya karena kesalahan!
Belfield
@Elfield: diperbaiki
nimi
Kenapa tidak r=reverse?
Akangka
@ChristianIrwan: Terima kasih! (Dalam versi awal saya memiliki fungsi pointfree tanpa nama, jadi menggunakan dua kali reversedan r=reversememiliki panjang yang sama, karena hilang f=. Tidak memeriksa lagi ketika pindah ke non pointfree).
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')))

edc65
sumber
Ketika ada baris baru di input, itu menghasilkan kesalahan, dari contoh saya tidak berpikir ini seharusnya terjadi
Downgoat
1
@ Vɪʜᴀɴ itu rumit, Contohnya adalah tentang beberapa spasi, tetapi kemudian tidak ada banyak spasi - hanya 1 baris baru. Saya pikir itu hancur oleh editor SO. JIKA kita harus mengelola baris baru dan ruang generik lainnya, jumlah byte bertambah 2
edc65
2

Retina , 103 byte

\s+

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

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

Seharusnya ada satu spasi di baris kedua, yang sepertinya ditelan SE. Jalankan kode dari satu file dengan -sbendera.

Retina tidak memiliki konsep pengecualian sehingga output hanya digantikan oleh Sentence must only use lettersjika ada karakter non-spasi putih dalam input.

Martin Ender
sumber
2

Pyth, 61 byte

?.A}R+G\ rz0jd.e_W%%k4 3bfTczd"Sentence must only use letters

Cobalah online.

PurkkaKoodari
sumber
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],

Menghapus 15 karakter, terima kasih Mego !!

Moose
sumber
Ya, takut nimi ada benarnya ...
Belfield
Tembak, aku merindukan itu. Saya akan merevisinya.
Moose
@Mego, re.search mengembalikan Tidak Ada (yang tidak dapat digunakan sebagai indeks) jika hasilnya tidak ditemukan, dan menambahkan "! = Tidak Ada" sebenarnya satu byte lebih panjang dari metode asli saya. Saya menyimpan 3 byte dengan menggabungkan dua baris terakhir. Terima kasih!
Moose
1

Bash + coreutils, 108

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

Karakter terakhir dari program ini adalah spasi.

Input diambil dari baris perintah:

$ ./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
$ 
Trauma Digital
sumber
1

Pyth, 72

=zflTc?:z"[^A-Za-z ]"0"Sentence tsum ylno use letters"zdjd.e?%/hk2 2_bbz

Tidak mengalahkan jawaban Pyth yang lain, tetapi saya sudah menginvestasikan waktu untuk menuliskannya. Ini pada dasarnya adalah terjemahan dari jawaban Python saya .

Cobalah online

Moose
sumber
1

Julia, 109 byte

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

i=0dan (i+=1)%4>1digunakan untuk memutuskan apakah setiap kata mendapat reversed atau tidak. isalphaberlaku untuk kata-kata setelah dipisah menggunakan split(s)untuk menentukan apakah ada karakter yang bukan huruf (spasi telah dihapus pada titik ini). joinmengembalikan string setelah manipulasi, kecuali jika errordilemparkan.

Glen O
sumber
1

Julia, 150 134 byte

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)]," "))

Tidak Disatukan:

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

Disimpan 16 byte berkat Glen O!

Alex A.
sumber
Sebelum hal lain, dapatkah saya menyarankan membalikkan logika persyaratan awal dan menugaskan runtuk hasilnya? Artinya, r=ismatch(...)||error(...)- akan memangkas beberapa karakter, dan membalikkan kondisi yang menggunakan r. Akan berkomentar lagi dengan, saya kira, beberapa penghematan lagi
Glen O
Koreksi kecil - Saya harus ||berurusan dengan negasi, kemudian menyadari bahwa negasi tidak perlu. Balikkan kembali ke &&. Dan bahkan lebih baik, gunakan ?:saja untuk melakukannya dengan lebih baik. 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))]," ")untuk 144 byte. Dan saya pikir saya bisa melakukan yang lebih baik di dalam join...
Glen O
Berikut ini adalah versi efisien dari solusi Anda, dengan 134 byte: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 Saran yang luar biasa, terima kasih!
Alex A.
0

Pyth, 55 byte

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

Meminjam %%k4 3bit dari Pietu1998. Disimpan satu byte tambahan.

Cobalah online: Demonstrasi atau Test Suite

Penjelasan

?--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
Jakube
sumber
0

Perl 5 -ap , 80 byte

map$_=++$i%4>1?reverse:$_,@F;$_=/[^a-z ]/i?"Sentence must use only letters":"@F"

Cobalah online!

Xcali
sumber
0

Java, 215 byte

Regex itu menyenangkan

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()?"":" "));}}

Cobalah online!

Benjamin Urquhart
sumber
Output Anda saat ini tidak benar. Anda sekarang menghasilkan She slles aeS shells no the aeS shore, tetapi itu seharusnya menjadi She slles aeS shells on eht aeS shore(normal pertama; kemudian bergantian berpasangan dari 2 terbalik atau tidak). Dua masalah menyebabkan ini. Anda sekarang meningkat ibahkan jika suatu item kosong, dan i++%2<1seharusnya i++%4>1sebaliknya. Di sini versi 211 byte tetap .
Kevin Cruijssen
@KevinCruijssen inilah yang saya dapat karena tidak cukup membaca
Benjamin Urquhart
0

Jelly , 39 byte

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

Cobalah online!

Terima kasih kepada Erik the Outgolfer. Dia menyelamatkan saya dari beberapa byte tambahan dan dari banyak jam frustrasi.

Berikut adalah solusi 46 byte

Ini sebenarnya melempar kesalahan sintaksis python ketika input berisi karakter yang tidak valid.

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

Cobalah online!

Zylviij
sumber
0

Japt v2.0a0 -S, 41 byte

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

Cobalah

¸¬è\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
Shaggy
sumber
0

05AB1E , 36 byte

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

Cobalah online.

Melempar kesalahan berikut saat input tidak hanya mengandung [A-Za-z ]:

(RuntimeError) Tidak dapat mengonversi Kalimat hanya boleh menggunakan huruf ke integer.

Penjelasan:

ð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)

Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa “¸–ƒ—€É€Å™ê“adalah "sentence must only use letters".

Kevin Cruijssen
sumber
0

PHP , 147 byte

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;

Cobalah online!

Atau jika die()dapat diterima sebagai "Pengecualian":

PHP , 131 byte

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

Cobalah online!

640KB
sumber