Code Golf: Chuyển tiếp sdrawkcaB sdrawkcaB Chuyển tiếp sdrawkcaB Chuyển tiếp sdrawkcaB


14

Bài tập

  • Người dùng nhập một câu - chỉ từ. Bất kỳ đầu vào nào ngoài chữ cái hoặc dấu cách, bao gồm số nguyên và dấu chấm câu, sẽ ném một ngoại lệ: "Câu chỉ phải sử dụng chữ cái".
  • Đầu ra có một mẫu, trong đó một số từ bị đảo ngược và các từ khác là bình thường.
  • Mẫu bắt đầu như một từ bình thường, hai từ tiếp theo được đảo ngược, sau đó hai từ tiếp theo là bình thường và mẫu tiếp tục.
  • Một ví dụ về nơi các từ nên bình thường và nơi các từ đảo ngược là dưới đây:

Bình thường - Đảo ngược - Đảo ngược - Bình thường - Bình thường - Đảo ngược - Đảo ngược - Bình thường ...

Ví dụ đầu vào

Cô bán vỏ sò trên bờ biển

Ví dụ đầu ra

Cô bắn đạn aeS trên bờ eht aeS

Quy tắc bổ sung

  • Nếu chữ in hoa được sử dụng, chúng sẽ vẫn còn trên chữ cái ban đầu được đăng.
  • Bất kỳ nhiều không gian ban đầu được đăng trên đầu vào nên được giảm xuống một không gian. Ví dụ Programming Puzzles and Code Golftrở thànhProgramming selzzuP dna Code Golf

Thắng mã ngắn nhất !!

Chúc mừng mã hóa ...


8
Nhiều ngôn ngữ lập trình không có ngoại lệ.
Doorknob

15
@nimi Có vẻ như hoàn toàn không cần thiết để hạn chế một thách thức đối với một tập hợp nhỏ các ngôn ngữ vì một lý do tầm thường như vậy.
tay nắm cửa

10
Thách thức tốt này bị phá hủy bởi quy tắc Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".Điều đó có nghĩa là thực hiện một nhiệm vụ phụ hoàn toàn không liên quan đến thách thức đảo ngược các từ, loại bỏ các ngôn ngữ không có ngoại lệ và yêu cầu mã hóa cứng hoặc nén một chuỗi dài chiếm nhiều số byte.
xnor

2
@Belfield Vâng, tôi thấy ràng buộc của bạn. Tôi đoán bây giờ bạn không thể làm gì. Trong tương lai, hãy thử đăng bài trong Sandbox để nhận phản hồi trước khi đăng.
xnor

3
@Belfield một thử thách tốt khó hơn nhiều so với một câu trả lời hay. Dù sao thì tôi cũng thích cái này và lần sau sẽ tốt hơn.
edc65

Câu trả lời:


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`

Điều này là rất ngắn, tôi rất hài lòng với nó.

~ 20 ký tự cuối cùng có vẻ như vô nghĩa nhưng đó là "Câu chỉ phải sử dụng chữ cái" được mã hóa. Tất cả các ký tự có mã char dưới 256, vì vậy mỗi ký tự là một byte

Giải trình

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

Cảm ơn đã đăng bài kiểm tra - rất tốt đẹp. Mọi người đều ở trong cùng một chiếc thuyền khi gặp lỗi - không chơi gôn trên đường đó
Belfield

Thật kỳ lạ, bây giờ nó hoạt động trong Firefox. Nhưng tôi cũng đã sử dụng Firefox trước đó.
Jakube

Câu trả lời tốt nhất cho đến nay!
Tháp chuông

Gì? Bạn đánh bại Pyth?! Với ngôn ngữ dựa trên JS?!? Làm sao nó có thể xảy ra?!?!
Sản xuất ETH

2
@ETHproductions Bạn luôn có thể giành chiến thắng miễn là Dennis không thi đấu: 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"

Gần 2/3 mã là để kiểm tra lỗi. Có vẻ là thách thức thế giới thực đầu tiên.

Công việc được thực hiện bằng cách unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xphân tách đầu vào thành một danh sách các từ, nén nó với danh sách các hàm theo chu kỳ [id,reverse,reverse,id,id,reverse...]và nối kết quả với khoảng trắng trở lại thành một chuỗi.

Cảm ơn @Christian Irwan cho 2 byte.


"Câu chỉ phải có chữ người dùng" có thể được thay đổi thành "Câu chỉ phải sử dụng chữ cái" - lỗi của tôi là lỗi!
Tháp chuông

@Belfield: cố định
Tên mẫu

Tại sao không r=reverse?
Akangka

@ChristianIrwan: Cảm ơn! (Trong phiên bản đầu tiên, tôi có chức năng pointfree không có tên, vì vậy sử dụng hai lần reverser=reversecó cùng độ dài, vì bị thiếu f=. Không kiểm tra lại khi chuyển sang không có 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')))


Khi có một dòng mới trong đầu vào, nó sẽ xuất hiện một lỗi, từ ví dụ tôi không nghĩ rằng điều này sẽ xảy ra
Downgoat

1
@ Vɪʜᴀɴ thật khó khăn, Ví dụ là về nhiều khoảng trắng, nhưng sau đó không có nhiều khoảng trắng - chỉ có 1 dòng mới. Tôi nghĩ rằng nó đã được biên tập bởi SO biên tập. NẾU chúng ta phải quản lý các dòng mới và không gian chung khác, số byte tăng thêm 2
edc65

2

Võng mạc , 103 byte

\s+

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

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

Cần có một khoảng trống trên dòng thứ hai, mà SE dường như đang nuốt. Chạy mã từ một tệp duy nhất với -scờ.

Retina không có khái niệm về các trường hợp ngoại lệ, vì vậy đầu ra chỉ được thay thế bằng Sentence must only use lettersnếu có các ký tự không phải là khoảng trắng trong đầu vào.



2

Con trăn, 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],

Đã xóa 15 ký tự, cảm ơn Mego !!


Phải, sợ nimi có một điểm ...
Belfield

Bắn, tôi đã bỏ lỡ điều đó. Tôi sẽ sửa lại nó.
Moose

@Mego, re.search trả về Không có (không thể được sử dụng làm chỉ mục) nếu kết quả không được tìm thấy và thêm "! = Không" thực sự dài hơn một byte so với phương thức ban đầu của tôi. Tôi đã lưu 3 byte bằng cách hợp nhất hai dòng cuối cùng. Cảm ơn!
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 \ 

Nhân vật cuối cùng của chương trình này là một không gian.

Đầu vào được lấy từ dòng lệnh:

$ ./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

Bình thường, 72

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

Không đánh bại câu trả lời Pyth khác, nhưng tôi đã đầu tư thời gian để viết nó. Về cơ bản, đây là bản dịch câu trả lời Python của tôi .

Dùng thử trực tuyến


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=0(i+=1)%4>1được sử dụng để quyết định xem mỗi từ có được reversed hay không. isalphaáp dụng cho các từ sau khi được phân tách bằng cách sử dụng split(s)để xác định xem có các ký tự không có chữ cái hay không (khoảng trắng đã bị xóa vào thời điểm này). joinKhôi phục chuỗi sau khi thao tác, trừ khi errorđược ném.


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

Ung dung:

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

Đã lưu 16 byte nhờ Glen O!


Trước bất cứ điều gì khác, tôi có thể đề nghị đảo ngược logic của điều kiện ban đầu và gán rcho kết quả của nó không? Đó là, r=ismatch(...)||error(...)- sẽ cạo sạch một vài ký tự và đảo ngược điều kiện sử dụng r. Tôi sẽ bình luận lại với, tôi nghi ngờ, một số khoản tiết kiệm hơn
Glen O

Sửa chữa nhỏ - Tôi đã ||phải đối phó với sự phủ định, sau đó nhận ra rằng sự phủ định là không cần thiết. Đảo ngược nó trở lại &&. Và thậm chí tốt hơn, sử dụng ?:thay vì để làm điều đó thậm chí còn tốt hơ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))]," ")cho 144 byte. Và tôi nghĩ rằng tôi có thể làm tốt hơn bên trong join...
Glen O

Đây là phiên bản hợp lý của giải pháp của bạn, với 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 Gợi ý tuyệt vời, cảm ơn!
Alex A.

0

Bình thường, 55 byte

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

Mượn %%k4 3bit từ Pietu1998. Đã lưu thêm một byte.

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình

?--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 byte

Regex rất vui

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

Hãy thử trực tuyến!


Đầu ra của bạn hiện không chính xác. Bây giờ bạn xuất ra She slles aeS shells no the aeS shore, nhưng nó nên She slles aeS shells on eht aeS shorethay thế (đầu tiên là bình thường; sau đó xen kẽ theo cặp 2 đảo ngược hoặc không). Hai vấn đề gây ra điều này. Bây giờ bạn tăng ingay cả khi một mục trống, và i++%2<1nên i++%4>1thay thế. Đây là một phiên bản 211 byte cố định .
Kevin Cruijssen

@KevinCruijssen đây là những gì tôi nhận được vì không đọc kỹ
Benjamin Urquhart

0

Thạch , 39 byte

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

Hãy thử trực tuyến!

Cảm ơn Erik the Outgolfer. Anh ấy đã cứu tôi khỏi một vài byte thêm và từ nhiều giờ thất vọng.

Đây là một giải pháp 46 byte

Nó thực sự ném một lỗi cú pháp python khi đầu vào chứa các ký tự không hợp lệ.

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

Hãy thử trực tuyến!


0

Japt v2.0a0 -S, 41 byte

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

Thử nó

¸¬è\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 byte

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

Hãy thử trực tuyến.

Ném lỗi sau khi đầu vào không chỉ chứa [A-Za-z ]:

(RuntimeError) Không thể chuyển đổi Câu chỉ phải sử dụng chữ cái thành số nguyên.

Giải trình:

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

Xem mẹo 05AB1E này của tôi (phần Làm thế nào để sử dụng từ điển? ) Để hiểu tại sao “¸–ƒ—€É€Å™ê“"sentence must only use letters".


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;

Hãy thử trực tuyến!

Hoặc nếu die() được chấp nhận là "Ngoại lệ":

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;

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.