プログラマーが言うように:怠け者になろう


25

ストーリー

9gagからこの投稿を見ましたか?たぶん、あなたはあなた自身の文章を作る感覚を得た。しかし、その後、30分で脚本をゴルフするだけでよいことに気づき、それに時間をかける必要はありません。

提出

以下に説明するように、プログラムは入力文字列を取得し、引用符を追加して返します。標準的な抜け穴は禁止されています。行のリストとしての出力が許可されます。出力を中断しない末尾のスペースと空の行は許可されます。

入力の規則

  • 入力には、印刷可能なASCII文字のみが含まれます。
  • 入力にはスペースを含めることができます。言葉は彼らによって決定されます。
  • スペースの後に別のスペースが続かないことが保証されています。
  • 入力がない場合や空の文字列の場合は関係ありません。

出力のルール

1つの単語が指定されている場合、プログラムは引用符で囲まれた文字列を返す必要があります。

入力文字列に2つ以上の単語がある場合、最初の入力が最初に返されますが、最初の単語は引用符で囲まれています。次に、次の行で、最初の入力を返しますが、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
我々のような、別の引用符を使用することができ''‘’または“”、ではなく""
ジュゼッペ

回答:


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再帰的に呼び出す再帰マクロ()を記録します。終了後、2つの無関係な行があり、それらはで削除され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文字のみが含まれます」、これはSpace to ~です。「入力にはスペースを含めることができます」-「空白」ではありません。
ニミ


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ありがとう、私自身も同様の改善を投稿するために戻ってきました。
ジョナサンアラン

6

JavaScript(ES6)、 43 42 41  38バイト

@mazzyのおかげで3バイト節約

非標準ですが広くサポートされているRegExp.left​Contextを使用しRegExp.rightContextます。それは多くの異なる引用符です...

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

オンラインでお試しください!


スマート!しかし、テストケースにカンマで見るThis is a significantly "longer,"...
mazzy

動作しません/(\S+)/gか?
シャギー

1
@mazzyああ、ありがとう。テストケースをコンマで読み間違えたため、実際に意図的にそのようにしました。修正されました。
アーナルド

@Shaggyスペースをキャプチャして、次の単語の左側のコンテキストに表示されないようにする必要があると思います。
アーナルド

1
@mazzyそれは確かに大丈夫だと思います。ありがとう!
アーナルド

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バイト(静的アクセス、リスト対配列、返される代わりに印刷など。ありがとう@ValueInk!)
-51バイトで怠け者で、@ KevinCruijssenに仕事を任せ
てオンラインで試す


それはあなたが必要とするいくつかのクレイジーなオーバーヘッドですjava.util.Arrays.copyOfRangejava.util.List使用する場合はsubList、配列を作成する代わりに、より短くしてSTDOUTに出力できます。これらのアイデアで193バイトを取得し、varキーワードも乱用しました。
バリューインク

@ValueInkありがとう!私も交換String.joinしてs.join、それらの余分なIDEの警告(-10バイト)のために。
ベンジャミンアーカート

1
@OlivierGrégoireありがとうございました:^)
ベンジャミン・アー

2
@OlivierGrégoireChallengeが承認され、beatられました、先生!; p 71バイト
Kevin Cruijssen

1
@KevinCruijssenいいね!私は正規表現が仕事をすることさえ考えていませんでした。よくやった;-)
オリビエグレゴワール

5

最初のコードゴルフの試みは、うまくいけばひどくなく、うまくいけばルール違反ではない

Kotlin、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バイト

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バイトのオフと先頭のスペースなし-空の配列でspread演算子を使用して配列リテラルを初期化すると、spread演算子によって生成された配列にスロットは作成されません。

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

(91バイトバージョンは最初の行に先頭スペースがあり、97バイトバージョンはそれを削除するために6バイトを要しました。)



1
f関数を定義したため、スニペットは実行されません。それ以外の場合は検証済み。よくやった!
krinistof

@krinistofが修正しました、thx!
traktor53

引用符で囲まれた単語の後の単語は、スペースではなくコンマで区切られます(Firefox、それがブラウザの問題かどうかは
わかり

1
@wastlは3バイトをゴルフしすぎており、目がぼやけているためコンマが表示されませんでした。(Shaggyのリンクのように)2番目のスプレッド演算子を戻すと、コンマが削除されます。自分自身に注意してください...次回メガネをかける
;-(

4

Pythonの37969、65のバイト

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

オンラインでお試しください!

xnorのおかげで10バイト削られました。そして今、これはErik the Outgolferソリューションによると65バイトです。プログラムはIndexErrorで終了しますが、これで問題ありません。


2
エラー終了するのはプログラムにとっては問題ありません。便利なトリック:のprint(*l)代わりにPython 3で使用できますprint(" ".join(l))
xnor

さらに良いのは、Extended Iterable Unpackingを使用することです。
xnor

2
65バイト:代わりに割り当てるのwinput().split()、それを割り当てinput()、その後、内whileループ、割り当てmw.split()次に設定回避基準問題に各反復で新しいリストを作成している、m[i]'"%s"'%m[i]print(*m)
エリック・ザ・アウトゴルファー

4

Java 8、72 71 67 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

正規表現の説明:

(?<=(^.*))(\\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
これで、多数の正規表現の答えが得られました。よくやった。
ベンジャミンアーカート

これをPythonに移植しようとしました。時々、正規表現パーサーが言語間で一貫していることを望みます。
ベンジャミンアーカート

1
@BenjaminUrquhart残念ながら、そうではありません。Javaの正規表現はC#の正規表現とは異なり、Pythonは再び異なり、Perlは再び異なります。実際、少し面倒です。
ケビンクルーイッセン


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バイトになります。
バリューインク

素晴らしい!参加する方法がもっと短いことは知っていましたが、オフィスを出ようとしていて、XDを離れる前に何かを送信したかったのです。私はそのような匿名ラムダに許可されているルールを理解していませんでした。
雪が降る

3

Perlの643の、40バイト

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

オンラインでお試しください!

考えられるすべての単語に一致し、引用符で各リストを結合します。行を逆順に出力できる場合、これは1バイト短くなります。

説明:

{                                      }  # 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~
                 \ ^\
\                   /

試して!

私はこれを「面白い」「ゴルフ」言語で「すばやく」「ゴルフ」しました。

空白をすべて見ると、おそらくそれより短くなる可能性があります。



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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.