โค้ดกอล์ฟ: Forwards sdrawkcaB sdrawkcaB Forwards sdrawkcaB


14

งาน

  • ผู้ใช้ป้อนประโยค - คำเท่านั้น การป้อนข้อมูลใด ๆ นอกเหนือจากตัวอักษรหรือช่องว่างรวมถึงจำนวนเต็มและเครื่องหมายวรรคตอนควรมีข้อยกเว้น: "ประโยคต้องใช้ตัวอักษรเท่านั้น"
  • เอาต์พุตมีรูปแบบโดยที่บางคำกลับด้านและคำอื่น ๆ เป็นเรื่องปกติ
  • รูปแบบเริ่มต้นเป็นคำปกติคำสองคำถัดไปจะกลับรายการจากนั้นคำสองคำถัดไปเป็นปกติและรูปแบบจะดำเนินต่อไป
  • ตัวอย่างของคำที่ควรเป็นปกติและคำที่ตรงกันข้ามอยู่ด้านล่าง:

ปกติ - กลับด้าน - ย้อนกลับ - ปกติ - ธรรมดา - กลับด้าน - ย้อนกลับ - ปกติ ...

ตัวอย่างการป้อนข้อมูล

เธอขายเปลือกหอยบนชายฝั่งทะเล

ตัวอย่างผลลัพธ์

เธอ slles aeS shells บน eht aeS shore

กฎเพิ่มเติม

  • หากมีการใช้ตัวอักษรพิมพ์ใหญ่พวกเขาควรจะยังคงอยู่ในตัวอักษรที่พวกเขาโพสต์เดิม
  • ช่องว่างหลาย ๆ อันที่ถูกโพสต์บนอินพุตควรถูกลดขนาดเป็นหนึ่งช่องว่าง ยกตัวอย่างเช่นProgramming Puzzles and Code Golfจะกลายเป็นProgramming selzzuP dna Code Golf

รหัสที่สั้นที่สุดชนะ !!

แฮปปี้รหัส ...


8
ภาษาการเขียนโปรแกรมหลายภาษาไม่มีข้อยกเว้น
Doorknob

15
@nimi ดูเหมือนว่าไม่จำเป็นเลยที่จะจำกัดความท้าทายของภาษาย่อย ๆ ด้วยเหตุผลเล็ก ๆ น้อย ๆ
Doorknob

10
ความท้าทายที่ดีเป็นอย่างอื่นถูกทำลายโดยกฎAny input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".มันหมายถึงการใช้งานที่สองที่ไม่เกี่ยวข้องกับความท้าทายในการย้อนกลับของคำตัดภาษาที่ไม่มีข้อยกเว้นออกและต้องใช้การเข้ารหัสหรือการบีบอัดสายยาวที่ใช้เวลานาน จำนวนไบต์
xnor

2
@Belfield ใช่ฉันเห็นการผูกของคุณ ฉันเดาว่าตอนนี้คุณไม่สามารถทำอะไรได้เลย ในอนาคตลองโพสต์ในSandboxเพื่อรับข้อเสนอแนะก่อนโพสต์
xnor

3
@Belfield ความท้าทายที่ดีนั้นยากกว่าคำตอบที่ดี ฉันมีความสุขกับเรื่องนี้แล้วและต่อไปจะดีกว่า
edc65

คำตอบ:


15

TeaScript , 55 ไบต์58 60 69 76 78 80 87 89

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

นี่มันสุดยอดมากสั้นผมมีความสุขมากกับมัน

อักขระสุดท้าย ~ 20 ตัวอาจดูเหมือนพูดไม่ชัด แต่นั่นเป็น "ประโยคจะต้องใช้ตัวอักษร" เท่านั้น ตัวละครทุกตัวมีรหัสถ่านต่ำกว่า 256 ดังนั้นแต่ละตัวจึงเป็นหนึ่งไบต์

คำอธิบาย

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

ขอบคุณสำหรับการโพสต์การทดสอบ - ดีมาก ทุกคนอยู่ในเรือลำเดียวกันเมื่อเกิดข้อผิดพลาด - ไม่มีการเล่นกอล์ฟบรรทัดนั้น
Belfield

แปลกตอนนี้ใช้งานได้ใน Firefox แต่ฉันก็ใช้ Firefox ก่อนหน้านี้
Jakube

คำตอบที่ดีที่สุดจนถึงตอนนี้!
Belfield

อะไร? คุณเอาชนะ Pyth ได้หรือไม่! ด้วยภาษาที่ใช้ JS?!? เป็นไปได้ยังไง?!?!
ETHproductions

2
@ETHproductions คุณสามารถชนะได้ตราบใดที่ Dennis ไม่แข่งขัน: p
Downgoat

4

Haskell, 141 ไบต์

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"

เกือบ 2/3 ของรหัสสำหรับการตรวจสอบข้อผิดพลาด ดูเหมือนจะเป็นความท้าทายครั้งแรกของโลกแห่งความจริง

งานที่ทำโดย unwords$zipWith($)(cycle[id,reverse,reverse,id])$words xแยกอินพุตเป็นรายการคำบีบอัดมันด้วยรายการการวนรอบของฟังก์ชัน[id,reverse,reverse,id,id,reverse...]และรวมผลลัพธ์ด้วยการเว้นวรรคกลับเป็นสตริงเดี่ยว

ขอบคุณ @Christian Irwan เป็นเวลา 2 ไบต์


"ประโยคต้องมีเพียงตัวอักษรผู้ใช้" สามารถเปลี่ยนเป็น "ประโยคต้องใช้ตัวอักษร" - ข้อผิดพลาดของฉันไม่ดี!
Belfield

@Belfield: แก้ไข
nimi

ทำไมทำไม่ได้r=reverse?
Akangka

@ChristianIrwan: ขอบคุณ! (ในเวอร์ชั่นก่อนหน้านี้ฉันมีฟังก์ชั่น pointfree โดยไม่มีชื่อดังนั้นให้ใช้สองครั้งreverseและr=reverseมีความยาวเท่ากันเนื่องจากการขาดหายไปf=ตรวจสอบอีกครั้งเมื่อย้ายไปที่ไม่ใช่ 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')))


เมื่อมีการขึ้นบรรทัดใหม่ในอินพุตเอาต์พุตจะเกิดข้อผิดพลาดจากตัวอย่างที่ฉันไม่คิดว่าน่าจะเกิดขึ้น
Downgoat

1
@ Vɪʜᴀɴเป็นเรื่องยากตัวอย่างคือเกี่ยวกับหลายช่องว่าง แต่แล้วไม่มีช่องว่างหลาย - เพียงแค่ขึ้นบรรทัดใหม่ 1 ฉันคิดว่ามันแก้ไขโดยตัวแก้ไข SO ถ้าเราต้องจัดการบรรทัดใหม่และพื้นที่ทั่วไปอื่น ๆ จำนวนไบต์จะเพิ่มขึ้น 2
edc65

2

เรติน่า 103 ไบต์

\s+

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

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

ควรมีพื้นที่เดียวในบรรทัดที่สองซึ่ง SE ดูเหมือนว่าจะกลืน เรียกใช้รหัสจากไฟล์เดียวกับ-sธง

Retina ไม่มีแนวคิดของข้อยกเว้นดังนั้นการส่งออกจะถูกแทนที่ด้วยSentence must only use lettersหากมีตัวอักษรที่ไม่ใช่ตัวอักษรที่ไม่ใช่ช่องว่างในการป้อนข้อมูล



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 ตัวอักษรขอบคุณMego !!


ใช่นิมเกรงว่าจะมีประเด็น ...
Belfield

ยิงฉันคิดถึงสิ่งนั้น ฉันจะแก้ไขมัน
Moose

@Mego, re.search จะคืนค่า None (ซึ่งไม่สามารถใช้เป็นดัชนี) หากไม่พบผลลัพธ์และการเพิ่ม "! = None" เป็นจริงหนึ่งไบต์ยาวกว่าวิธีดั้งเดิมของฉัน ฉันบันทึก 3 ไบต์ด้วยการรวมสองบรรทัดสุดท้าย ขอบคุณ!
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 \ 

อักขระตัวสุดท้ายของโปรแกรมนี้คือช่องว่าง

อินพุตถูกนำมาจากบรรทัดคำสั่ง:

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

Pyth, 72

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

ไม่ได้คำตอบ Pyth อื่น ๆ แต่ฉันใช้เวลาในการเขียนไปแล้ว มันเป็นพื้นการแปลของฉันคำตอบหลาม

ลองออนไลน์


1

Julia, 109 ไบต์

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ถูกใช้เพื่อตัดสินใจว่าแต่ละคำได้รับreversed หรือไม่ isalphaนำไปใช้กับคำหลังจากถูกแยกโดยใช้split(s)เพื่อพิจารณาว่ามีอักขระที่ไม่ใช่ตัวอักษรหรือไม่ (ช่องว่างถูกลบโดยจุดนี้) joinเรียกคืนสตริงหลังจากการจัดการยกเว้นว่าerrorจะถูกโยนทิ้ง


1

จูเลีย, 150 134 ไบต์

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

บันทึก 16 ไบต์ด้วย Glen O!


ก่อนอื่นฉันจะแนะนำให้ย้อนกลับตรรกะของเงื่อนไขเริ่มต้นและกำหนดrให้เป็นผลลัพธ์หรือไม่? นั่นคือr=ismatch(...)||error(...)- rจะโกนตัวอักษรไม่กี่และกลับมีเงื่อนไขที่ใช้ จะแสดงความคิดเห็นอีกครั้งด้วยฉันสงสัยว่าบางออมทรัพย์เพิ่มเติม
เกลน O

การแก้ไขเล็กน้อย - ฉันต้อง||จัดการกับการปฏิเสธแล้วก็ตระหนักว่าการปฏิเสธนั้นไม่จำเป็น &&ย้อนกลับมันกลับไป และดียิ่งขึ้นใช้?:แทนเพื่อทำได้ดียิ่งขึ้น 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 ไบต์ และฉันคิดว่าฉันสามารถทำได้ดีกว่าภายในjoin...
เกลน O

นี่คือโซลูชันของคุณที่มีความคล่องตัวโดยมีขนาด 134 ไบต์: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 ข้อเสนอแนะที่น่ากลัวขอบคุณ!
Alex A.

0

Pyth, 55 ไบต์

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

ยืม%%k4 3เล็กน้อยจาก Pietu1998 บันทึกหนึ่งไบต์เพิ่มเติม

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย

?--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 ไบต์

Regex เป็นเรื่องสนุก

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

ลองออนไลน์!


ปัจจุบันผลลัพธ์ของคุณไม่ถูกต้อง ตอนนี้คุณส่งออกShe slles aeS shells no the aeS shoreแต่ควรจะShe slles aeS shells on eht aeS shoreแทน (ปกติแรกแล้วสลับคู่ที่ 2 กลับรายการหรือไม่) สองประเด็นทำให้เกิดสิ่งนี้ ตอนนี้คุณเพิ่มขึ้นiแม้ว่ารายการจะว่างเปล่าและi++%2<1ควรจะเป็นi++%4>1แทน นี่คงที่211 ไบต์รุ่น
Kevin Cruijssen

@KevinCruijssen นี่คือสิ่งที่ฉันได้รับจากการอ่านอย่างไม่เพียงพอ
Benjamin Urquhart

0

เยลลี่ 39 ไบต์

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

ลองออนไลน์!

ขอบคุณ Erik the Outgolfer เขาช่วยให้ฉันรอดพ้นจากความวุ่นวายไม่กี่ไบต์และจากความยุ่งยากหลายชั่วโมง

นี่คือวิธีแก้ปัญหา 46 ไบต์

จริงๆแล้วมันจะโยนข้อผิดพลาดทางไวยากรณ์ของหลามเมื่ออินพุตมีอักขระที่ไม่ถูกต้อง

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

ลองออนไลน์!


0

Japt v2.0a0 -S, 41 ไบต์

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

ลองมัน

¸¬è\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 ไบต์

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

ลองออนไลน์

โยนข้อผิดพลาดต่อไปนี้เมื่ออินพุตไม่เพียงมี[A-Za-z ]:

(RuntimeError) ไม่สามารถแปลงประโยคได้ต้องใช้ตัวอักษรเป็นจำนวนเต็มเท่านั้น

คำอธิบาย:

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

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการใช้พจนานุกรม? )จะเข้าใจว่าทำไมเป็น“¸–ƒ—€É€Å™ê“"sentence must only use letters"


0

PHP , 147 ไบต์

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;

ลองออนไลน์!

หรือถ้าdie()ยอมรับได้ว่าเป็น "ข้อยกเว้น":

PHP , 131 ไบต์

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

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.