正如程序员所说:努力变得懒惰


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
我们可以假设输入字符串不包含"字符吗?
门把手

1
关于“力争偷懒”:我认为这是对拉里·沃尔所说的错误陈述。- 大多数人认为懒惰是懒散的或懒散的土豆的代名词,但Wall的定义是关于效率的。
Peter Mortensen

14
这个“问题”应该是“有趣”到“高尔夫”。
Jono 2906

3
我们可以用不同的报价,喜欢''‘’或者“”,而不是""
朱塞佩

Answers:


10

vim,38个字节

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

在线尝试!

需要 vim-surround插件

如果输入不包含"字符,则可以用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
_#_=[]

返回行列表。

在线尝试!


当输入包含引号,换行符或其他转义的字符时,这似乎失败。
小麦巫师


@ SriotchilismO'Zaic:固定。感谢您指出。关于较短的版本:xnor已经将此发布为答案
nimi

并不是很固定,因为单词被认为\n是空格,所以在出现时它的行为不正确。
小麦巫师

@ SriotchilismO'Zaic:“输入仅包含可打印的ASCII字符”,即空格到~。“输入内容可能包含空格”,而不是“空白”。
nimi


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)
暴民埃里克

@EriktheOutgolfer谢谢,自己回来发表了类似的改进。
乔纳森·艾伦

6

JavaScript(ES6), 43 42 41  38字节

@mazzy节省了3个字节

使用非标准但受到广泛支持的RegExp.left​ContextRegExp.rightContext。那有很多不同的引号...

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

在线尝试!


聪明!但是请看一下测试用例中的逗号This is a significantly "longer,"...
令人惊讶的

不行/(\S+)/g
毛茸茸的

1
@mazzy哦,谢谢。我实际上是故意这样做的,因为我用逗号误读了测试用例。现在已修复。
Arnauld

@Shaggy我认为我们需要捕获空间,以便它不会出现在下一个单词的左侧上下文中。
Arnauld

1
@mazzy我想这确实很好。谢谢!
Arnauld

6

Java,235183132字节

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字节滥用各种各样的事情(静态访问,列表VS阵列,打印而不是返回,等感谢@ValueInk!)
-51由beung懒惰,让@KevinCruijssen字节做的工作对我来说
在线试玩


这是您需要的一些疯狂开销java.util.Arrays.copyOfRange。如果您利用java.util.List它,可以使用subList更短的代码,并打印到STDOUT而不是构建数组。这些想法让我得到了193个字节,并且还滥用了var关键字。
价值墨水

@ValueInk谢谢!我还String.joins.join那些额外的IDE警告(和-10个字节)代替了。
本杰明·厄克特

1
@OlivierGrégoire不,谢谢您:^)
Benjamin Urquhart

2
先生,@OlivierGrégoire挑战已被接受并殴打!; p 71字节
凯文·克鲁伊森

1
@KevinCruijssen不错!我什至没有想到正则表达式可以胜任这项工作。做得好;-)
OlivierGrégoire

5

第一次打高尔夫球的尝试希望它并不可怕,并且希望它不会违反规则

科特林,105 112 147 117字节/字符

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

JavaScript, 91 97 75 78 bytes

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

Outputs a list of lines as a JavaScript array. The last entry has a trailing space as allowed in the question. The test code writes each entry to the console on a separate line for demonstration purposes.

Thanks to Shaggy for 19 bytes off and no leading spaces - when the spread operator is used on an empty array to initialize an array literal, no slots are created in the array produced by the spread operator:

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

(The 91 byte version had a leading space on the first line, the 97 byte version took 6 bytes to remove it.)



1
The snippet doesn't run because you defined the f function. Otherwise verified. Good job!
krinistof

@krinistof fixed it, thx!
traktor53

Words after the quoted word are separated by commas instead of spaces (Firefox, not sure if that's a browser issue)
wastl

1
@wastl Golfed 3 bytes too many and didn't see the commas due to blurry eyes. Putting back the second spread operator (as in Shaggy"s link) removes the commas . Note to self... put my glasses on next time ;-(
traktor53

4

Python 3, 79, 69, 65 bytes

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

Try it online!

Shaved 10 bytes thanks to xnor. And now this is 65 bytes as per Erik the Outgolfer solution. Program ends with IndexError but this is fine.


2
Terminating with error is fine for programs. A handy trick: you can use print(*l) in Python 3 in place of print(" ".join(l)).
xnor

Even better, use Extended Iterable Unpacking.
xnor

2
65 bytes: Instead of assigning w to input().split(), assign it to input(), then, in the while loop, assign m to w.split(), which will create a new list at each iteration to avoid reference issues, then set m[i] to '"%s"'%m[i] and print(*m).
Erik the Outgolfer

4

Java 8, 72 71 67 62 bytes

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

Try it online.

Explanation:

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 explanation:

(?<=(^.*))(\\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
You have just paved the way for a multitude of regex answers. Well done.
Benjamin Urquhart

I tried to port this to Python. Sometimes I wish regex parsers were consistent across languages.
Benjamin Urquhart

1
@BenjaminUrquhart Unfortunately they aren't.. Java regex is different than C# regex, Python is different again, Perl is different again, etc. Indeed a bit annoying.
Kevin Cruijssen


3

Ruby, 98 chars.

First submission ever. This can definitely be shortened. I just wanted to get an answer in quickly.

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

Try it online!


Welcome to PPCG! My suggestion would be for each index, save s.split as a variable and edit the index you want to have the quotes around it, instead of using the overly verbose each_with_index.map. Also, you can submit the anonymous lambda without naming it, and join can be replaced with a * operator. This drops your byte count to 64 bytes.
Value Ink

Fantastic! I knew there was a shorter way to do the join, but I was trying to get out of the office and wanted to submit something before leaving XD. I didn't realize the rules allowed for anonymous lambdas like that.
snowe

3

Perl 6, 43 40 bytes

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

Try it 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.

Explanation:

{                                      }  # 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

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.



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


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!


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' '
}

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



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


@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!


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


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


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.


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

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

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!




Port of Java answer - 104 :)
dana


@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.