Jak mówią programiści: staraj się być leniwy

25

Fabuła

Widziałeś ten post z 9gag ? Może masz ochotę tworzyć własne zdania. Ale wtedy zdajesz sobie sprawę, że możesz po prostu zagrać w golfa w ciągu pół godziny i nigdy nie będziesz musiał sobie z tym poradzić.

Złożenie

Twój program otrzyma ciąg wejściowy, który zwróci z dodanymi znakami cudzysłowu, jak wyjaśniono poniżej. Standardowe luki są zabronione. Wyjście jako lista wierszy jest dozwolone. Dozwolone są końcowe spacje i puste linie, które nie przerywają wydruku.

Zasady wprowadzania

  • Dane wejściowe zawierają tylko drukowalne znaki ASCII.
  • Dane wejściowe mogą zawierać spacje. Słowa są z nimi określone.
  • Gwarantujemy, że po jednym miejscu nigdy nie będzie następnej przestrzeni.
  • Przypadek braku danych wejściowych lub pustego łańcucha nie ma znaczenia.

Reguły produkcji

Jeśli podano jedno słowo, program musi zwrócić ciąg znaków między cudzysłowami.

Jeśli ciąg wejściowy zawiera 2 lub więcej słów, najpierw zwraca początkowe wejście, ale pierwsze słowo jest w cudzysłowie. Następnie w następnym wierszu zwraca początkowe wejście, ale z drugim słowem w cudzysłowie. I tak dalej dla pozostałych słów.

Ogólnie rzecz biorąc, program musi zwrócić tyle wierszy, ile jest słów na wejściu.

Przykłady:

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"

To jest , więc wygrywa odpowiedź najmniej bajtowa!

krinistof
źródło
7
Czy będą zduplikowane słowa?
Wcielenie nieznajomości
10
Czy możemy założyć, że ciąg wejściowy nie będzie zawierał "znaków?
Klamka
1
Re „Staraj się być leniwy” : Myślę, że to fałszywe przedstawienie tego, co powiedział Larry Wall. - Większość ludzi uważa lenistwo za synonim slackera lub kanapowego ziemniaka, ale definicja Walla dotyczy wydajności.
Peter Mortensen
14
Ten „problem” powinien być „zabawny” dla „golfa”.
Jono 2906
3
Możemy stosować różne cytaty, jak '', ‘’lub “”, zamiast ""?
Giuseppe

Odpowiedzi:

10

vim, 38 bajtów

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

Wypróbuj online!

Wymaga wtyczki vim-surround .

Jeśli dane wejściowe nie zawierają "znaków, można to zrobić w 19 bajtach :

qqysW"Ypds"W@qq@qdk

W tym przypadku rejestrujemy makro rekurencyjne ( qq ... @qq@q), które otacza słowo cudzysłowami ( ysW"), powiela wiersz ( Yp), usuwa znaki cudzysłowu ( ds") i przechodzi do następnego słowa ( W) przed wywołaniem się rekurencyjnie. Po zakończeniu są dwie linie zewnętrzne, które są usuwane za pomocądk .

Pełne rozwiązanie po prostu owija to :s/"/<C-d>/gna początku, który zastępuje istniejące "znaki niedrukowalnymi, a :%s/<C-d>/"/gna końcu, co zastępuje zamianę.

Klamka
źródło
2
Przykłady
wykonałem
8

Haskell, 65 bajtów

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

Zwraca listę linii.

Wypróbuj online!

nimi
źródło
Wydaje się, że zawodzi, gdy dane wejściowe zawierają znaki cudzysłowu, znaki nowej linii lub inne znaki specjalne.
Kreator pszenicy
@ SriotchilismO'Zaic: naprawiono. Dzięki za wskazanie. Jeśli chodzi o krótszą wersję: xnor już opublikował to jako odpowiedź .
nimi
Nie do końca ustalone, ponieważ słowa uznawane \nsą za spacje, zachowują się niepoprawnie, gdy są obecne.
Wheat Wizard
@ SriotchilismO'Zaic: „Dane wejściowe zawierają tylko drukowalne znaki ASCII”, czyli spację do ~. „Dane wejściowe mogą zawierać spacje” - nie „białe znaki”.
nimi
7

Retina 0.8.2 , 17 bajtów

 
" $'¶$` "
^|$
"

Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:

 
" $'¶$` "

Rozwiń każdą spację, powielając wiersz, a następnie wstawiając cudzysłowy.

^|$
"

Napraw pierwszą i ostatnią linię.

Neil
źródło
7

Galaretka ,  15  14 bajtów

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

Wypróbuj online!

W jaki sposób?

Ḳ⁾""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
Jonathan Allan
źródło
Łatwe zapisywanie . (Postanowiłem skomentować tutaj, ponieważ jako pierwszy opublikowałeś podobny kod.: P)
Erik the Outgolfer
@EriktheOutgolfer dzięki, wróciłem, aby sam opublikować podobną poprawę.
Jonathan Allan
6

JavaScript (ES6),  43 42 41  38 bajtów

Zaoszczędzono 3 bajty dzięki @mazzy

Korzysta z niestandardowych, ale szeroko obsługiwanych RegExp.left​Contexti RegExp.rightContext. To wiele różnych cytatów ...

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

Wypróbuj online!

Arnauld
źródło
Mądry! Ale zobacz przecinek w przypadku testowymThis is a significantly "longer,"...
mazzy
Nie /(\S+)/gdziałałoby?
Kudłaty
1
@mazzy Oh, dzięki. Właściwie zrobiłem to w ten sposób celowo, ponieważ źle odczytałem przypadek testowy przecinkiem. Teraz naprawione.
Arnauld
@Shaggy Myślę, że musimy uchwycić przestrzeń, aby nie pojawiła się w lewym kontekście następnego słowa.
Arnauld
1
@mazzy Myślę, że to w porządku. Dzięki!
Arnauld
6

Java, 235 183 132 bajty

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 bajtów poprzez nadużywanie różnych rzeczy (dostęp statyczny, lista vs. tablica, drukowanie zamiast zwracania itp. Dzięki @ValueInk!)
-51 bajtów przez beung leniwy i pozwalanie @KevinCruijssen na wykonanie pracy dla mnie
Wypróbuj online

Benjamin Urquhart
źródło
To jakiś szalony koszt, którego potrzebujesz java.util.Arrays.copyOfRange. Jeśli używasz java.util.List, możesz używać go subListkrócej i drukować do STDOUT zamiast budować tablicę. Mam 193 bajty z tymi pomysłami, a także nadużywam słowa kluczowego var.
Wartość tuszu
@ValueInk dzięki! Również otrzymuje String.joinsię z s.jointych dodatkowych ostrzeżenia IDE (-10 bajtów).
Benjamin Urquhart
1
@ OlivierGrégoire nie dziękuję: ^)
Benjamin Urquhart
2
@ OlivierGrégoire Wyzwanie przyjęte i pokonane, proszę pana! ; p 71 bajtów
Kevin Cruijssen
1
@KevinCruijssen Nice! Nawet nie sądziłem, że regex wykona zadanie. Dobra robota ;-)
Olivier Grégoire
5

Mam nadzieję, że pierwsza próba golfa nie jest straszna i mam nadzieję, że nie łamie zasad

Kotlin, 105 112 147 117 bajtów / znaków

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

Wypróbuj online!

Quinn
źródło
4

05AB1E , 14 bajtów

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

Wypróbuj online!


+1 bajt (i działa w przypadku krawędzi) dzięki Emignie. -1 bajt dzięki Kevin!

Urna Magicznej Ośmiornicy
źródło
1
Niestety musisz użyć ð¡do obsługi danych wejściowych, takich jak test.
Emigna
1
-1 bajt za pomocą mapy i» .
Kevin Cruijssen
4

JavaScript, 91 97 75 78 bajtów

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'));

Wyświetla listę wierszy jako tablicę JavaScript. Ostatni wpis ma końcową spację dozwoloną w pytaniu. Kod testowy zapisuje każdy wpis do konsoli w osobnym wierszu dla celów demonstracyjnych.

Dzięki Shaggy za 19 bajtów off i brak spacji wiodących - gdy operator rozkładania jest używany do pustej tablicy do inicjalizacji literału tablicy, żadne szczeliny nie są tworzone w tablicy wytwarzanej przez operatora rozkładania:

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

(Wersja 91-bajtowa miała wiodące miejsce w pierwszym wierszu, wersja 97-bajtowa zajęła 6 bajtów).

traktor53
źródło
2
78 bajtów
Kudłaty
1
Fragment nie działa, ponieważ zdefiniowano ffunkcję. W przeciwnym razie zweryfikowane. Dobra robota!
krinistof
@krinistof naprawił to, dzięki!
traktor53
Słowa po cytowanym słowie są oddzielone przecinkami zamiast spacji (Firefox, nie jestem pewien, czy to problem z przeglądarką)
odpady
1
@wastl Grał w golfa o 3 bajty za dużo i nie widział przecinków z powodu rozmytych oczu. Odłożenie drugiego operatora rozkładania (jak w linku Kudłaty) usuwa przecinki. Uwaga do siebie ... odłóż moje okulary następnym razem ;-(
traktor53
4

Python 3 , 79 , 69 , 65 bajtów

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

Wypróbuj online!

Ogolono 10 bajtów dzięki xnor. A teraz jest to 65 bajtów według rozwiązania Erika Outgolfera. Program kończy się na IndexError, ale jest w porządku.

Андрей Ломакин
źródło
2
Zakończenie z błędem jest dobre dla programów . Przydatna sztuczka: możesz użyć print(*l)w Pythonie 3 zamiast print(" ".join(l)).
xnor
Jeszcze lepiej, użyj rozszerzonego rozpakowywania iteracyjnego .
xnor
2
65 bajtów : Zamiast przypisywać wdo input().split(), przypisz go do input(), a następnie w whilepętli przypisz mdo w.split(), co spowoduje utworzenie nowej listy przy każdej iteracji w celu uniknięcia problemów z odnośnikami, a następnie ustaw m[i]na '"%s"'%m[i]i print(*m).
Erik the Outgolfer
4

Java 8, 72 71 67 62 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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

Wyjaśnienie 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
Kevin Cruijssen
źródło
2
Właśnie utorowałeś drogę do wielu odpowiedzi wyrażeń regularnych. Dobra robota.
Benjamin Urquhart
Próbowałem przenieść to na Python. Czasami chciałbym, aby parsery wyrażeń regularnych były spójne we wszystkich językach.
Benjamin Urquhart
1
@BenjaminUrquhart Niestety nie są .. Wyrażenia regularne Java różnią się od wyrażeń regularnych w C #, Python znów się różni, Perl jest znowu inny itp. Rzeczywiście trochę denerwujące.
Kevin Cruijssen
4

Ruby z-an 53 bajtami

Flagi -ansą odczytywane w każdej linii i dzielone na $F.

$F.size.times{|i|a=$F.dup;a[i]=?"+a[i]+?";puts a*' '}

Wypróbuj online!

Wartość tuszu
źródło
3

Ruby , 98 znaków.

Pierwsze zgłoszenie w historii. Można to zdecydowanie skrócić. Chciałem tylko szybko uzyskać odpowiedź.

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

Wypróbuj online!

śnieg
źródło
Witamy w PPCG! Moja sugestia dotyczyłaby każdego indeksu, zapisania go s.splitjako zmiennej i edycji indeksu, który ma zawierać cudzysłowy, zamiast używania zbyt szczegółowych informacji each_with_index.map. Możesz także przesłać anonimową lambdę bez nazywania jej, a dołączenie można zastąpić *operatorem. Spowoduje to zmniejszenie liczby bajtów do 64 bajtów.
Wartość tuszu
Fantastyczny! Wiedziałem, że istnieje krótszy sposób na dołączenie, ale starałem się wyjść z biura i chciałem coś złożyć przed opuszczeniem XD. Nie zdawałem sobie sprawy, że reguły dopuszczają takie anonimowe lambdy.
śnieg
3

Perl 6 , 43 40 bajtów

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

Wypróbuj online!

Matches all possible words, then joins each list by quotes. This could be one byte shorter if we could output lines in reverse order.

Wyjaśnienie:

{                                      }  # 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
Jo King
źródło
3

Reflections, 229 bytes

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

Test it!

I "quickly" "golfed" this in a "funny" "golfing" language.

Looking at all that whitespace, it could probably be shorter.

wastl
źródło
3

Haskell, 64 bytes

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

Try it online!

Outputs a list of strings. Based on nimi's answer.

xnor
źródło
This answer like nimi's doesn't work properly when the input contains escaped characters like \n or ".
Wheat Wizard
2

Stax, 10 bytes

▓¼MY@≈╢∞◙╗

Run and debug it

Unpacked, ungolfed, and commented, it looks like this.

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

Run this one

recursive
źródło
2

C (gcc), 136 133 bytes

As C's tokenizing functions would mess up the string on future reads, I instead calculate the number and offsets for each word and then finish when the total number of iterations of the outer loop matches the number of words.

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));}

Try it online!

ErikF
źródło
Swapping "\""+!!(i-++j) for i-++j?"":"\"" saves you a byte.
gastropner
2

PowerShell, 60 40 36 bytes

-20 bytes inspired by Arnauld

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

Try it online!

The result has one extra space and one empty line in the tail.


Powershell, no regexp, 60 bytes

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

Try it online!

Less golfed:

$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' '
}
mazzy
źródło
Neither works if the input words contain tabs or other whitespace. From the challenge, only spaces delimit words.
AdmBorkBork
you are right, of course. But rules are: 1. The input only contains printable ASCII characters., 2. The input may contain spaces. Tabs and other whitespace is not printable ASCII, is not it? :)
mazzy
1
I suppose that's true - I was only basing my statement off of the OP's comment here, but that hasn't been edited into the challenge ... so I suppose your submission is fine as it currently is.
AdmBorkBork
2

JavaScript, 62 bytes

Thanks @Shaggy for golfing off 10 bytes

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

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

Explanation

  • The function splits the string at each space (x.split` `)
  • For each element in the resulting array perform the following function
  • Create a shallow copy of the array (s=[...a])
  • Replace the nth element in the array with itself surrounded with quotation marks (s[i]=`"${c}"`)
  • return the shallow copy joined with spaces (s.join` `)
fəˈnɛtɪk
źródło
62 bytes
Shaggy
2

Java (JDK), 104 bytes

t->{var w=t.split(" ");int i=0;for(var s:w){w[i]='"'+s+'"';System.out.println(s.join(" ",w));w[i++]=s;}}

Try it online!

Olivier Grégoire
źródło
2

R, 94 76 bytes

-18 bytes thanks to Giuseppe

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

Try it online!

Thanks to digEmAll for setting up the TIO properly. It takes in e.g. This is codegolf and outputs correctly

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

It uses a matrix format with the sentence repeated n times; then we only need to change the diagonal entries. Note that usually, in R code-golf, strings are read in with scan(,""), but any string can be used instead of the empty string as the what (or w) parameter.

Explanation of old ungolfed version:

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
Robin Ryder
źródło
76 bytes
Giuseppe
@Giuseppe Thanks! How did I not see that I didn't need two calls to scan??
Robin Ryder
Sometimes you just get into a golfing groove. If we can use other quotes than "", we can reduce to 68 bytes using sQuote.
Giuseppe
2

This is my first code golf. hopefully its not shit.

EDIT: got it down to 54 bytes with a better regular expression.

**EDIT 2: per suggestions, fixed a bug and made it shorter **

JavaScript (V8), 46 bytes

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

Try it online!

r3wt
źródło
5
If the input contains duplicate words, subsequent copies never get quoted.
recursive
Splitting on spaces would be shorter.
Shaggy
@recursive should be fixed.
r3wt
@Shaggy thanks, i incorporated your suggestion
r3wt
1
Still doesn't work for duplicate words
Jo King
2

Elm Using recursion, 132,130,121,111,100 99 bytes

Golfed down 9 bytes thanks to Kevin Cruijssen technique and another 22 bytes were cracked by ASCII-only. Turned to non-tail recursion during the golf.

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

Try it online

85 bytes after exposing String functions to the current scope

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

Ungolfed version (Using tail recursion)

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

Try ungolfed

Evgeniy Malyutin
źródło
2

Japt, 14 12 bytes

¸£¸hYQ²i1X)¸

Try it

2 bytes saved thanks to 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
Shaggy
źródło
12 bytes
Oliver
D'oh! Of course! Thanks, @Oliver.
Shaggy
1

PowerShell, 70 65 bytes

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

Try it online!

Has test suite in trial. Has 1 leading space on first row, and 1 trailing space on last row. Attempting to refactor.

KGlasier
źródło
4
This doesn't work if you have a duplicate word in the test string.
snowe
1

Charcoal, 19 bytes

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

Try it online! Link is to verbose version of code. Note: Trailing space. Explanation:

  θ                     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
Neil
źródło
1

Attache, 34 bytes

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

Try it online! Anonymous function returning a list of lines.

Explanation

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
Conor O'Brien
źródło
1

C# (Visual C# Interactive Compiler), 123 bytes

I wonder if can this be shortened with regular expressions.

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

Try it online!

my pronoun is monicareinstate
źródło
118 bytes
Innat3
110 bytes
dana
Port of Java answer - 104 :)
dana
1
@dana My port is shorter, though ;)
Kevin Cruijssen
@KevinCruijssen - I saw you got that regex earlier :) Figured that was a totally different approach so I didn't try porting it over, but yeah that is a good solution!
dana