ดังที่โปรแกรมเมอร์เขียนไว้ว่า: พยายามอย่างเกียจคร้าน


25

เรื่องราว

คุณเห็นโพสต์นี้จาก9gagหรือไม่? บางทีคุณอาจมีความรู้สึกที่จะสร้างประโยคของคุณเอง แต่คุณก็รู้ว่าคุณสามารถเล่นสคริปต์ได้ภายในครึ่งชั่วโมงและคุณจะไม่ต้องจัดการกับเรื่องนั้น

การส่ง

โปรแกรมของคุณจะได้รับสตริงอินพุตซึ่งจะส่งคืนพร้อมเครื่องหมายคำพูดเพิ่มตามที่อธิบายไว้ด้านล่าง ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม อนุญาตให้ใช้เอาต์พุตเป็นรายการบรรทัด อนุญาตช่องว่างต่อท้ายและบรรทัดว่างที่ไม่ทำลายเอาต์พุต

กฎของการป้อนข้อมูล

  • อินพุตมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น
  • อินพุตอาจมีช่องว่าง คำจะถูกกำหนดด้วยพวกเขา
  • รับประกันได้ว่าพื้นที่จะไม่ถูกตามด้วยพื้นที่อื่น
  • กรณีที่ไม่มีอินพุตหรือสตริงว่างไม่สำคัญ

กฎของการส่งออก

หากได้รับหนึ่งคำโปรแกรมจะต้องส่งคืนสตริงระหว่างเครื่องหมายคำพูด

หากสตริงอินพุตมี 2 คำหรือมากกว่าคำสั่งนั้นจะส่งคืนอินพุตเริ่มแรก แต่คำแรกนั้นอยู่ในเครื่องหมายคำพูด จากนั้นในบรรทัดถัดไปจะส่งคืนอินพุตเริ่มต้น แต่ด้วยคำที่สองในเครื่องหมายคำพูด และสำหรับคำที่เหลือ

โดยทั่วไปโปรแกรมจะต้องส่งคืนบรรทัดมากเท่าที่มีคำในอินพุต

ตัวอย่าง:

test -> "test"

This is codegolf -> "This" is codegolf
                    This "is" codegolf
                    This is "codegolf"

This is a significantly longer, but not the longest testcase -> "This" is a significantly longer, but not the longest testcase
                                                                This "is" a significantly longer, but not the longest testcase
                                                                This is "a" significantly longer, but not the longest testcase
                                                                This is a "significantly" longer, but not the longest testcase
                                                                This is a significantly "longer," but not the longest testcase
                                                                This is a significantly longer, "but" not the longest testcase
                                                                This is a significantly longer, but "not" the longest testcase
                                                                This is a significantly longer, but not "the" longest testcase
                                                                This is a significantly longer, but not the "longest" testcase
                                                                This is a significantly longer, but not the longest "testcase"

Here is an another one -> "Here" is an another one
                          Here "is" an another one
                          Here is "an" another one
                          Here is an "another" one
                          Here is an another "one"

นี่คือดังนั้นคำตอบอย่างน้อยไบต์ก็ชนะ!


7
จะมีคำซ้ำหรือไม่
ศูนย์รวมแห่งความไม่รู้

10
เราสามารถสมมติว่าสตริงอินพุตจะไม่มี"ตัวอักษรได้หรือไม่?
ลูกบิดประตู


14
"ปัญหา" นี้ควร "สนุก" เป็น "กอล์ฟ"
Jono 2906

3
เราสามารถใช้คำพูดที่แตกต่างกันเช่น'', ‘’หรือ“”มากกว่า""?
Giuseppe

คำตอบ:


10

เป็นกลุ่ม, 38 ไบต์

:s/"/<C-d>/g
qqysW"Ypds"W@qq@qdk:%s/<C-d>/"/g

ลองออนไลน์!

ต้องใช้ปลั๊กอินเป็นกลุ่ม-เซอร์ราวด์

หากอินพุตไม่มี"อักขระสามารถทำได้ใน19 ไบต์ :

qqysW"Ypds"W@qq@qdk

ที่นี่เราบันทึกแมโครซ้ำ ( qq ... @qq@q) ที่ล้อมรอบคำด้วยเครื่องหมายอัญประกาศ ( ysW") ทำซ้ำบรรทัด ( Yp) ลบเครื่องหมายอัญประกาศ ( ds") และย้ายไปยังคำถัดไป ( W) ก่อนที่จะเรียกตัวเองซ้ำ dkหลังจากที่มันสิ้นสุดลงมีสองสายภายนอกซึ่งจะถูกลบออกด้วย

โซลูชันเต็มรูปแบบจะหุ้มสิ่งนี้:s/"/<C-d>/gไว้ที่จุดเริ่มต้นซึ่งจะแทนที่"อักขระที่มีอยู่ด้วยอักขระที่ไม่สามารถพิมพ์ได้และ:%s/<C-d>/"/gในตอนท้ายซึ่งจะยกเลิกการแทนที่


2
ฉันทำตัวอย่างด้วยวิธีเดียวกันจริง ๆ : D
krinistof

8

Haskell, 65 ไบต์

([]#).words
a#(b:c)=unwords(a++('"':b++"\""):c):(a++[b])#c
_#_=[]

ส่งคืนรายการบรรทัด

ลองออนไลน์!


สิ่งนี้ดูเหมือนจะล้มเหลวเมื่ออินพุตมีเครื่องหมายอัญประกาศขึ้นบรรทัดใหม่หรือตัวอักษรอื่นที่ใช้ Escape
ข้าวสาลี Wizard


@ SriotchilismO'Zaic: แก้ไขแล้ว ขอบคุณสำหรับการชี้ให้เห็น เกี่ยวกับรุ่นที่สั้นกว่า: xnor ได้โพสต์คำตอบนี้แล้ว
nimi

ไม่ได้รับการแก้ไขค่อนข้างมากเนื่องจากคำต่าง ๆ คิดว่า\nเป็นช่องว่างมันจะทำงานไม่ถูกต้องเมื่อมีอยู่
ข้าวสาลี Wizard

@ SriotchilismO'Zaic: "การป้อนข้อมูลมีเพียงตัวอักขระ ASCII" ~ซึ่งเป็นพื้นที่ที่จะ "ข้อมูลที่ป้อนอาจมีช่องว่าง" - ไม่ใช่ "ช่องว่าง"
nimi

7

เรติน่า 0.8.2 , 17 ไบต์

 
" $'¶$` "
^|$
"

ลองออนไลน์! การเชื่อมโยงรวมถึงชุดทดสอบ คำอธิบาย:

 
" $'¶$` "

ขยายแต่ละช่องว่างด้วยการทำซ้ำบรรทัดแล้วใส่เครื่องหมายคำพูด

^|$
"

แก้ไขบรรทัดแรกและบรรทัดสุดท้าย


7

เยลลี่ ,  15  14 ไบต์

Ḳ⁾""j$€⁹¦K¥ⱮJ$

ลองออนไลน์!

อย่างไร?

Ḳ⁾""j$€⁹¦K¥ⱮJ$ - Link: list of characters, S
Ḳ              - split (S) at spaces -> A
             $ - last two links as a monad:
           Ɱ   -   map...
            J  -   ...across: range of length -> I = [1,2,...len(A)]
          ¥    -   ...doing: last two links as a dyad: i.e. f(A, i) for i in I
      € ¦      -     sparse application...
       ⁹       -     ...to indices: chain's right argument, i
     $         -     ...action: last two links as a monad:
 ⁾""           -       literal list of characters = ['"', '"']
    j          -       join (with A[i]) -> (e.g. with ['i','s']) ['"','i','s','"']
         K     -     join with spaces

ง่ายประหยัด (ตัดสินใจที่จะแสดงความคิดเห็นที่นี่เพราะคุณเป็นคนแรกที่โพสต์โค้ดที่คล้ายกัน: P)
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณกลับมาโพสต์การปรับปรุงที่คล้ายกันด้วยตัวเอง
Jonathan Allan

6

JavaScript (ES6),  43 42 41  38 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ @mazzy

ใช้ไม่ได้มาตรฐาน แต่การสนับสนุนอย่างกว้างขวางและRegExp.left​Context RegExp.rightContextนั่นเป็นคำพูดที่แตกต่างกันมากมาย ...

s=>s.replace(/(\S+) ?/g,`$\`"$1" $'
`)

ลองออนไลน์!


ฉลาด! แต่ดูเครื่องหมายจุลภาคในกรณีทดสอบThis is a significantly "longer,"...
mazzy

จะไม่/(\S+)/gทำงานเหรอ
Shaggy

1
@ mazzy โอ้ขอบคุณ ที่จริงฉันทำอย่างนั้นในจุดประสงค์เพราะฉันอ่านข้อผิดพลาดด้วยเครื่องหมายจุลภาค แก้ไขแล้ว
Arnauld

@Shaggy ฉันคิดว่าเราต้องจับช่องว่างเพื่อไม่ให้ปรากฏในบริบทด้านซ้ายของคำถัดไป
Arnauld

1
@ mazzy ฉันเดาว่าไม่เป็นไร ขอบคุณ!
Arnauld

6

Java, 235 183 132 ไบต์

s->{String a[]=s.split(" "),r="",t;for(int l=a.length,i=0,j;i<l;i++,r+="\n")for(j=0;j<l;)r+=(t=i==j?"\"":"")+a[j++]+t+" ";return r;}

-52 bytes โดยใช้สิ่งต่าง ๆ (การเข้าถึงแบบคงที่, รายการ vs array, พิมพ์แทนการส่งกลับ, ฯลฯ ขอบคุณ @ValueInk!)
-51 bytes โดย beung สันหลังยาวและให้ @KevinCruijssen ทำงานให้ฉัน
ลองออนไลน์


java.util.Arrays.copyOfRangeนั่นคือค่าใช้จ่ายบางบ้าที่คุณต้องการสำหรับ หากคุณใช้งานjava.util.Listคุณสามารถใช้งานsubListให้สั้นลงและพิมพ์ไปที่ STDOUT แทนที่จะสร้างอาร์เรย์ ฉันมีความคิด 193 ไบต์กับความคิดเหล่านั้นและยังใช้คำหลัก var ด้วย
หมึกมูลค่า

@ValueInk ขอบคุณ! ฉันยังแทนที่String.joinด้วยs.joinสำหรับคำเตือน IDE พิเศษเหล่านั้น (และ -10 ไบต์)
Benjamin Urquhart

1
@ OlivierGrégoireไม่ขอบคุณ: ^)
Benjamin Urquhart

2
@ OlivierGrégoire Challenge ยอมรับและพ่ายแพ้แล้ว! ; p 71 bytes
Kevin Cruijssen

1
@KevinCruijssen ดีมาก! ฉันไม่ได้คิดว่า regex จะทำงานได้ ทำได้ดีมาก ;-)
Olivier Grégoire

5

ความพยายามครั้งแรกของรหัสกอล์ฟหวังว่ามันจะไม่แย่และหวังว่ามันจะไม่ผิดกฎ

Kotlin, 105 112 147 117 bytes / chars

fun main(a:Array<String>){val q=a[0].split(" ")
q.forEach{println(q.fold(""){i,n->i+if(it==n)"\"$n\" " else n+" "})}}

ลองออนไลน์!


4

05AB1E , 14 ไบต์

ð¡©ε®y…"ÿ"Nǝ}»

ลองออนไลน์!


+1 ไบต์ (และใช้ได้กับเคสขอบ) ด้วย Emigna -1 ไบต์ต้องขอบคุณเควิน!


1
แต่น่าเสียดายที่คุณจำเป็นต้องใช้ในการป้อนจับเช่นð¡ test
Emigna

1
-1 »ไบต์โดยใช้แผนที่และ
Kevin Cruijssen

4

JavaScript, 91 97 75 78 ไบต์

f= 

t=>t.split` `.map((c,i,a)=>[...a.slice(0,i),`"${c}"`,...a.slice(i+1)].join` `)

// and test
console.log(f("Hello folks and world").join('\n'));

แสดงรายการบรรทัดเป็นอาร์เรย์ JavaScript รายการสุดท้ายมีช่องว่างต่อท้ายตามที่อนุญาตในคำถาม รหัสทดสอบจะเขียนแต่ละรายการไปยังคอนโซลในบรรทัดแยกต่างหากเพื่อวัตถุประสงค์ในการสาธิต

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

let empty = [];
let array = [...empty, value]
//  produces an array of length 1 containing value 

(เวอร์ชัน 91 ไบต์มีพื้นที่นำหน้าในบรรทัดแรกส่วนเวอร์ชัน 97 ไบต์ใช้เวลา 6 ไบต์ในการลบออก)



1
ตัวอย่างไม่ทำงานเพราะคุณกำหนดfฟังก์ชั่น ผ่านการตรวจสอบแล้ว เยี่ยมมาก!
krinistof

@ krinistof แก้ไขมันขอบคุณ!
traktor53

คำหลังจากคำที่ยกมาถูกคั่นด้วยเครื่องหมายจุลภาคแทนที่จะเว้นวรรค (Firefox ไม่แน่ใจว่าเป็นปัญหาของเบราว์เซอร์หรือไม่)
ทำลาย

1
@wastl Golfed 3 ไบต์มากเกินไปและไม่เห็นเครื่องหมายจุลภาคเนื่องจากตามัว การนำตัวดำเนินการส
เปร

4

Python 3 , 79 , 69 , 65 ไบต์

w,i=input(),0
while~i:m=w.split();m[i]='"%s"'%m[i];print(*m);i+=1

ลองออนไลน์!

ลดขนาด 10 ไบต์ด้วย xnor และตอนนี้นี่คือ 65 ไบต์ตาม Erik ทางออก Outgolfer โปรแกรมลงท้ายด้วย IndexError แต่ก็ใช้ได้


2
ยกเลิกด้วยข้อผิดพลาดเป็นเรื่องปกติสำหรับโปรแกรม เคล็ดลับที่มีประโยชน์: คุณสามารถใช้print(*l)ในหลาม 3 print(" ".join(l))ในสถานที่ของ
xnor

ยิ่งไปกว่านั้นใช้ขยาย Iterable เอาออก
xnor

2
65 ไบต์ : แทนที่จะกำหนดwให้input().split(), กำหนดให้กับinput(), ในwhileลูป, มอบหมายmให้w.split(), ซึ่งจะสร้างรายการใหม่ในแต่ละการวนซ้ำเพื่อหลีกเลี่ยงปัญหาการอ้างอิง, จากนั้นตั้งค่าm[i]เป็น'"%s"'%m[i]และprint(*m).
Erik the Outgolfer

4

Java 8, 72 71 67 62 62 ไบต์

s->s.replaceAll("(?<=(^.*))(\\S+) ?(?=(.*$))","$1\"$2\" $3\n")

ลองออนไลน์

คำอธิบาย:

s->                    // Method with String as both parameter and return-type
  s.replaceAll("...",  //  Replace all matches in this regex
               "...")  //  With this
                       //  And then return the result

คำอธิบาย Regex:

(?<=(^.*))(\\S+) ?(?=(.*$))   # === MATCH ===
(?<=     )                    # A positive look-behind to:
     ^.*                      #  The optional leading portion of the string
    (   )                     #  (which is captured in capture group 1)
           \\S+               # Followed by one or more non-space characters,
                              # so the next word in line
          (    )              # (which is captured in capture group 2)
                 ?            # Followed by an optional space
                  (?=     )   # Followed by a positive look-ahead to:
                      .*$     #  The trailing optional portion of the string
                     (   )    #  (which is captured in capture group 3)

$1\"$2\" $3\n                 # === REPLACEMENT ===
$1                            # The match of capture group 1
                              # (the leading portion)
    $2                        # Followed by the match of capture group 2
                              # (the current word in the 'iteration'),
  \"  \"                      # surrounded by quotation marks
                              # Followed by a space character
         $3                   # Followed by the match of capture group 3
                              # (the trailing portion)
           \n                 # Followed by a trailing newline

2
คุณเพิ่งปูทางไปสู่คำตอบมากมายของ regex ทำได้ดี.
Benjamin Urquhart

ฉันพยายามที่จะย้ายพอร์ตนี้ไปยัง Python บางครั้งฉันต้องการให้โปรแกรมแยกวิเคราะห์ regex มีความสอดคล้องกันในทุกภาษา
Benjamin Urquhart

1
@BenjaminUrquhart แต่น่าเสียดายที่พวกเขาไม่ได้ .. Java regex นั้นแตกต่างจาก C # regex, Python แตกต่างกันอีกครั้ง Perl ต่างกันอีกครั้งแน่นอนน่ารำคาญนิดหน่อย
Kevin Cruijssen


3

ทับทิม 98 ตัวอักษร

ส่งครั้งแรกเลยทีเดียว สิ่งนี้สามารถสั้นลงได้อย่างแน่นอน ฉันแค่อยากได้คำตอบอย่างรวดเร็ว

a=->s{s.split.each_index{|i|puts s.split.each_with_index.map{|a,j|i==j ? "\"#{a}\"":a}.join(" ")}}

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG! คำแนะนำของฉันจะเป็นสำหรับแต่ละดัชนีบันทึกs.splitเป็นตัวแปรและแก้ไขดัชนีที่คุณต้องการที่จะมีคำพูดรอบ ๆ each_with_index.mapแทนการใช้มากเกินไปอย่างละเอียด นอกจากนี้คุณสามารถส่งแลมบ์ดานิรนามโดยไม่ต้องตั้งชื่อและเข้าร่วมสามารถถูกแทนที่ด้วย*โอเปอเรเตอร์ สิ่งนี้จะลดจำนวนไบต์ของคุณเป็น 64 ไบต์
หมึกมูลค่า

Fantastic! ฉันรู้ว่ามีวิธีที่สั้นกว่าในการเข้าร่วม แต่ฉันพยายามออกจากสำนักงานและต้องการส่งบางอย่างก่อนออกจาก XD ฉันไม่ได้ตระหนักถึงกฎที่อนุญาตสำหรับลูกแกะนิรนามเช่นนั้น
snowe

3

Perl 6 , 43 40 ไบต์

{m:ex/^(.*?<<)(\S+)(>>.*)$/>>.join('"')}

ลองออนไลน์!

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

คำอธิบาย:

{                                      }  # Anonymous code block
 m:ex/^                  $/               # Match all strings
       (.*?)         (.*)                 # Match before and after sections
            <<(\S+)>>                     # And the actual word (with no spaces)
                           >>.join('"')   # And join each line by "s

3

รีเฟลคชั่น , 229 ไบต์

  _1 +\ /\/(3\  /(0\
/+_:   # \#_: v1=2#_ \
\     /_+/:3; / 1/\:1)
/v(3(2/ \3)(3 ;\#@ \ /
   /:#_(0\:_ / (0*  /0  \
 0 >~    <>~   <0 \  *#_/
 \       /     /\/ v/ 
   \=2#_1/\2#_>  (0~
                 \ ^\
\                   /

ทดสอบ!

ฉัน "เร็ว" "กอล์ฟ" สิ่งนี้ในภาษา "ตลก" "การเล่นกอล์ฟ"

เมื่อมองจากที่ว่างทั้งหมดมันอาจจะสั้นลง


3

Haskell , 64 ไบต์

map unwords.g.words
g(h:t)=(('"':h++"\""):t):map(h:)(g t)
g _=[]

ลองออนไลน์!

ส่งออกรายการของสตริง ขึ้นอยู่กับคำตอบของ Nimi


คำตอบเหมือน Nimi นี้ไม่สามารถทำงานได้อย่างถูกต้องเมื่อมีการป้อนข้อมูลประกอบด้วยอักขระหนีชอบหรือ\n "
ข้าวสาลี Wizard

2

Stax , 10 ไบต์

▓¼MY@≈╢∞◙╗

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

jY      split on spaces and store in y register
m       for each word, run the rest of the program and implicitly output
  '"|S  surround with double quotes
  yia&  start with register y, and replace the ith element, where i is the iteration index
  J     join with spaces

เรียกใช้อันนี้


2

C (gcc) , 136 133 ไบต์

ในขณะที่ฟังก์ชั่น tokenizing ของ C จะทำให้สตริงในการอ่านในอนาคตฉันแทนการคำนวณจำนวนและ offsets สำหรับแต่ละคำแล้วจบเมื่อจำนวนการวนซ้ำทั้งหมดของลูปด้านนอกตรงกับจำนวนคำ

i,j=1;f(s,c,t)char*s,*c,*t;{for(i=0;i++<j;puts(""))for(j=0,c=t=s;t;t=c+!!c)printf("%3$s%.*s%s ",(c=index(t,32))-t,t,"\""+!!(i-++j));}

ลองออนไลน์!


การแลกเปลี่ยน"\""+!!(i-++j)เพื่อi-++j?"":"\""ช่วยให้คุณประหยัดไบต์
Gastropner

2

PowerShell , 60 40 36 ไบต์

-20 ไบต์แรงบันดาลใจจากArnauld

$args-replace'(\S+) ?','$`"$1" $''
'

ลองออนไลน์!

ผลลัพธ์มีช่องว่างเพิ่มหนึ่งช่องและบรรทัดว่างหนึ่งบรรทัดที่หาง


PowerShell ไม่มี regexp, 60 ไบต์

($w=-split$args)|%{$p=++$c
"$($w|%{$q='"'*!--$p
"$q$_$q"})"}

ลองออนไลน์!

หักกอล์ฟ:

$words=-split $args                     # split by whitespaces
$words|%{
    $position=++$counter
    $array=$words|%{
        $quotation='"'*!--$position     # empty string or quotation char
        "$quotation$_$quotation"
    }
    "$($array)"                         # equivalent to $array-join' '
}

ไม่สามารถใช้งานได้หากคำที่ป้อนมีแท็บหรือช่องว่างอื่น ๆ จากการท้าทายให้เว้นวรรคคั่นคำเท่านั้น
AdmBorkBork

คุณพูดถูก แต่กฎคือ: 1. The input only contains printable ASCII characters., 2 The input may contain spaces. แท็บและช่องว่างอื่น ๆ ไม่ใช่ ASCII ที่พิมพ์ได้ใช่มั้ย :)
mazzy

1
ฉันคิดว่ามันเป็นความจริง - ฉันเพียง แต่ใช้ถ้อยแถลงของฉันจากความคิดเห็นของ OP ที่นี่แต่นั่นไม่ได้รับการแก้ไขในความท้าทาย ... ดังนั้นฉันคิดว่าการส่งของคุณเป็นไปอย่างราบรื่นเหมือนที่เป็นอยู่ในปัจจุบัน
AdmBorkBork

2

JavaScript, 62 ไบต์

ขอบคุณ @Shaggy สำหรับการเล่นกอล์ฟ 10 ไบต์

f=
x=>x.split` `.map((c,i,a)=>(s=[...a],s[i]=`"${c}"`,s.join` `))

console.log(f("Hello folks and world").join('\n'));

คำอธิบาย

  • ฟังก์ชั่นแยกสตริงที่แต่ละช่องว่าง (x.split``)
  • สำหรับแต่ละองค์ประกอบในอาร์เรย์ผลลัพธ์ให้ทำหน้าที่ดังต่อไปนี้
  • สร้างสำเนาตื้นของอาร์เรย์ (s = [... a])
  • แทนที่องค์ประกอบที่ n ในอาร์เรย์ด้วยตัวเองล้อมรอบด้วยเครื่องหมายคำพูด (s [i] = `" $ {c} "`)
  • คืนสำเนาตื้นเข้าร่วมกับช่องว่าง (s.join``)



2

R , 94 76 ไบต์

-18 ไบต์ขอบคุณ Giuseppe

m=matrix(s<-scan(,a<-'"'),n<-length(s),n);diag(m)=paste0(a,s,a);write(m,1,n)

ลองออนไลน์!

ขอบคุณ digEmAll สำหรับการตั้งค่า TIO อย่างถูกต้อง มันใช้เวลาในเช่นThis is codegolfและส่งออกอย่างถูกต้อง

"This" is codegolf 
 This "is" codegolf 
 This is "codegolf" 

มันใช้รูปแบบเมทริกซ์ที่มีประโยคซ้ำหลายnครั้ง ถ้าอย่างนั้นเราแค่ต้องเปลี่ยนรายการในแนวทแยง โปรดทราบว่าโดยปกติใน R code-golf จะอ่านสตริงด้วยscan(,"")แต่สามารถใช้สตริงใด ๆ แทนสตริงว่างเป็นพารามิเตอร์what(หรือw)

คำอธิบายของเวอร์ชันที่ไม่ได้รับการปรับปรุง:

s <- scan(t=scan(,''),w=t)    # read in input and separate by spaces
n <- length(s)                # number of words
m = matrix(s, n, n)           # fill a matrix, one word per entry, each column corresponds to the whole sentence. The sentence is repeated n times.
diag(m) = paste0('"', s, '"') # replace diagonal entries with the corresponding word surrounded by quotes
cat(rbind(m,"\n"))        # add a \n at the end of each column, then print column-wise


@iuseppe ขอบคุณ! ฉันไม่เห็นว่าฉันไม่ต้องการสองสายเพื่อscan?
Robin Ryder

บางครั้งคุณก็เข้าไปในสนามกอล์ฟ ถ้าเราสามารถใช้คำพูดอื่นที่ไม่ใช่""เราสามารถลด68 ไบต์sQuoteใช้
Giuseppe

2

นี่คือรหัสกอล์ฟครั้งแรกของฉัน หวังว่ามันจะไม่อึ

แก้ไข: ทำให้ได้ถึง 54 ไบต์ด้วยนิพจน์ปกติที่ดีกว่า

** แก้ไข 2: ตามคำแนะนำแก้ไขข้อบกพร่องและทำให้สั้นลง **

JavaScript (V8) , 46 ไบต์

t=>t.split(' ').map(v=>t.replace(v,'"'+v+'"'))

ลองออนไลน์!


5
หากข้อมูลที่ป้อนมีคำซ้ำซ้อนสำเนาที่ตามมาจะไม่ได้รับการยกมา
เรียกซ้ำ

การแยกช่องว่างจะสั้นกว่า
Shaggy

@recursive ควรได้รับการแก้ไข
r3wt

@Shaggy ขอบคุณฉันรวมข้อเสนอแนะของคุณ
r3wt

1
ยังคงใช้งานไม่ได้สำหรับคำที่ซ้ำกัน
Jo King

2

C # (Visual C # Interactive Compiler)พร้อม/u:System.Text.RegularExpressions.Regexแฟล็กขนาด59 40 ไบต์

s=>Replace(s,"(\\S+) ?","$`\"$1\" $'\n")

คำตอบพอร์ตของJava 8ของฉันดังนั้นให้ดูที่คำอธิบาย
-19 ไบต์โดยการย้ายregexของ@Arnauldตั้งแต่$`และ$'รองรับใน C # .NET

ลองออนไลน์


2

Elmใช้การเรียกซ้ำ, 132,130,121,111,100 99 ไบต์

แข็งแรงเล่นกอล์ฟลดลง 9 ไบต์ต้องขอบคุณเควิน Cruijssenเทคนิคและอีก 22 ไบต์แตกโดยASCII เท่านั้น หันไปหาแบบไม่หางซ้ำระหว่างการเล่นกอล์ฟ

f b a=case a of
 c::r->String.join" "(b++("\""++c++"\"")::r)::f(b++[c])r
 _->[]
u=f[]<<String.words

ลองออนไลน์

85 ไบต์หลังจากแสดงStringฟังก์ชันไปยังขอบเขตปัจจุบัน

f b a=case a of
 c::r->join" "(b++("""++c++""")::r)::f(b++[c])r
 _->[]
u=f[]<<words

เวอร์ชันที่ไม่ถูกปรับแต่ง (ใช้การเรียกซ้ำหาง)

push : List a -> a -> List a
push list el =
    list ++ [ el ]

zip : (List a -> a -> List a -> b) -> List a -> List a -> List b -> List b
zip transform before after mapped =
    case after of
        [] ->
            mapped

        current :: rest ->
            transform before current rest
                |> push mapped
                |> zip transform (push before current) rest

wrap : appendable -> appendable -> appendable
wrap v str =
    v ++ str ++ v

cb : List String -> String -> List String -> String
cb before current rest =
    before ++ wrap "\"" current :: rest
        |> String.join " "

result : List String
result =
    zip cb [] (String.words "This is code golf") []

ลอง ungolfed


2

Japt , 14 12 ไบต์

¸£¸hYQ²i1X)¸

ลองมัน

บันทึก 2 ไบต์ด้วย Oliver

¸£¸hYQ²i1X)¸     :Implicit input of string
¸                :Split on spaces
 £               :Map each X at index Y
  ¸              :  Split input on spaces
   hY            :  Set the element at index Y to
     Q           :    Quotation mark
      ²          :    Repeat twice
       i1X       :    Insert X at 0-based index 1


D'โอ้! แน่นอน! ขอบคุณ @Oliver
Shaggy

1

PowerShell , 70 65 ไบต์

param($a)$a.Split()|%{$a-replace[regex]"( |^)$_( |$)"," ""$_"" "}

ลองออนไลน์!

มีชุดทดสอบในการทดลอง มี 1 ช่องว่างนำหน้าในแถวแรกและ 1 ช่องว่างท้ายแถวสุดท้าย พยายาม refactor


4
สิ่งนี้ไม่ทำงานหากคุณมีคำที่ซ้ำกันในสตริงทดสอบ
หิมะ

1

ถ่านขนาด 19 ไบต์

E⪪θ ⪫E⪪θ ⎇⁼κμ⪫""λλ 

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด หมายเหตุ: พื้นที่ต่อท้าย คำอธิบาย:

  θ                     Input string
 ⪪                      Split on literal space
E                       Map over words
       θ                Input string
      ⪪                 Split on literal space
     E                  Map over words
            μ           Inner index
          ⁼             Equals
           κ            Outer index
         ⎇             If true then
               ""       Literal string `""`
              ⪫         Joined i.e. wrapping
                 λ      Current word
                  λ     Otherwise current word
    ⪫                  Joined with literal space
                        Implicitly print each result on its own line

1

ทูต 34 ไบต์

Join&sp=>{On&_&Repr=>Iota@_}@Split

ลองออนไลน์! ฟังก์ชั่นไม่ระบุชื่อส่งคืนรายการของบรรทัด

คำอธิบาย

Join&sp=>{On&_&Repr=>Iota@_}@Split
                             Split      Splits the input on whitespace
         {         =>Iota@_}            Over each number K, 0 to #words - 1
          On  &Repr                     Apply the Repr (quoting) function
            &_                          on the Kth element in the input
Join&sp=>                               then rejoin the words of each inner sentence

1

C # (Visual C # Interactive Compiler) , 123 ไบต์

ฉันสงสัยว่าสิ่งนี้จะสั้นลงด้วยการแสดงออกปกติ

s=>(r=s.Split(' ')).Select((a,i)=>(string.Join(" ",r.Take(i))+" \""+a+"\" "+string.Join(" ",r.Skip(i+1))).Trim());string[]r

ลองออนไลน์!




พอร์ตของ Java ตอบ - 104 :)
dana


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