Programcıların dediği gibi: Tembel olmaya çalışın


25

Öykü

Gördünüz mü bu Yayının 9gag ? Belki kendi cümlelerinizi kurma hissine kapılıyorsunuzdur. Ama daha sonra yarım saat içinde bir senaryoyu golf oynayabileceğinizi anlarsınız ve bununla asla uğraşmak zorunda kalmazsınız.

Teslim

Programınız, aşağıda açıklandığı gibi eklenen tırnak işaretleri ile birlikte geri döneceği bir girdi dizisi alır. Standart boşluklar yasaktır. Satır listesi olarak çıktı alınmasına izin verilir. Çıkış boşluklarına ve çıktıyı kesmeyen boş satırlara izin verilir.

Giriş kuralları

  • Giriş yalnızca yazdırılabilir ASCII karakterleri içerir.
  • Giriş boşluk içerebilir. Kelimeler onlarla belirlenir.
  • Bir alanın asla başka bir alan tarafından takip edilmeyeceği garanti edilir.
  • Giriş ya da boş bir dize olması önemli değil.

Çıktı kuralları

Bir sözcük verilirse, programın tırnak işaretleri arasında dizgiyi döndürmesi gerekir.

Giriş dizgisinde 2 veya daha fazla sözcük varsa, önce ilk girişi döndürür, ancak ilk sözcük tırnak içindedir. Ardından bir sonraki satırda, ilk girişi döndürür, ancak ikinci sözcüğü tırnak içinde verir. Ve böylece kalan kelimeler için.

Genel olarak, programın girilen kelimelerde olduğu kadar çok satır döndürmesi gerekir.

Örnekler:

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"

Bu , yani en az baytlık cevap kazanıyor!


7
Çift kelimeler olacak mı?
Cehalet

10
Giriş dizesinin "karakter içermeyeceğini varsayabilir miyiz ?
Doorknob


14
Bu "sorun" "golf" için "eğlenceli" olmalıdır.
Jono 2906

3
Farklı tırnak gibi kullanabilir '', ‘’veya “”yerine ""?
Giuseppe

Yanıtlar:


10

vim, 38 bayt

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

Çevrimiçi deneyin!

Gerektirir Vim-surround eklentisini .

Girdi "karakter içermiyorsa , bu 19 baytta yapılabilir :

qqysW"Ypds"W@qq@qdk

Burada, qq ... @qq@qbir kelimeyi tırnak işaretleri ( ysW") ile çevreleyen , satırı ( Yp) çoğaltan , tırnak işaretlerini ( ds") silen ve bir sonraki kelimeye hareket eden özyinelemeli bir makroyu ( ) kaydederiz.W özyinelemeli olarak çağırmadan önce bir ) . Sona erdikten sonra, silinen iki yabancı satır vardır.dk .

Tam çözüm :s/"/<C-d>/g, bunu başlangıçta, mevcut "karakterleri yazdırılamaz bir karakterle değiştirir ve :%s/<C-d>/"/gsonunda değiştirmeyi geri alır.


2
Aslında aynı yöntemi kullanarak örnekleri yaptım: D
krinistof

8

Haskell, 65 bayt

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

Satır listesini döndürür.

Çevrimiçi deneyin!


Girdi tırnak işaretleri, yeni satırlar veya diğer çıkış karakterleri içerdiğinde bu başarısız görünüyor.
Buğday Sihirbazı


@ SriotchilismO'Zaic: düzeltildi. Gösterdiğin için teşekkürler. Kısa versiyon ile ilgili olarak: xnor bunu zaten bir cevap olarak gönderdi .
nimi

Oldukça sabit değil, çünkü kelimeler \nboşluk olarak kabul edilir, mevcut olduğunda uygunsuz davranır.
Buğday Sihirbazı

@ SriotchilismO'Zaic: “Girdi yalnızca yazdırılabilir ASCII karakterleri içeriyor” ~. "Girdi boşluklar içerebilir" - "boşluk" değil.
nimi

7

Retina 0.8.2 , 17 bayt

 
" $'¶$` "
^|$
"

Çevrimiçi deneyin! Bağlantı test paketi içerir. Açıklama:

 
" $'¶$` "

Satırı çoğaltarak ve ardından tırnak işaretleri ekleyerek her alanı genişletin.

^|$
"

İlk ve son satırları düzeltin.


7

Jöle ,  15  14 bayt

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

Çevrimiçi deneyin!

Nasıl?

Ḳ⁾""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

Kolay kaydetmek . (Buraya yorum yapmaya karar verdi, çünkü benzer bir kod gönderen ilk kişi siz oldunuz.: P)
Outgolfer Erik,

@EriktheOutgolfer teşekkürler, kendimi benzer bir gelişme göndermek için geri geldi.
Jonathan Allan

6

JavaScript (ES6),  43 42 41  38 bayt

@Mazzy sayesinde 3 bayt kaydedildi

Standart olmayan ancak yaygın olarak kullanılan RegExp.left​Contextve kullanır RegExp.rightContext. Çok farklı alıntılar var ...

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

Çevrimiçi deneyin!


Akıllı! Ama test durumundaki virgül konusuna bakınThis is a significantly "longer,"...
mazzy

Çalışmaz /(\S+)/gmıydın?
Shaggy

1
@mazzy Oh, teşekkürler. Aslında bunu bilerek yaptım çünkü test vakasını virgülle yanlış anladım. Şimdi düzeltildi.
Arnauld

@Shaggy Bir sonraki kelimenin sol bağlamında görünmemesi için alanı yakalamamız gerektiğini düşünüyorum.
Arnauld

1
@mazzy Sanırım bu gerçekten iyi. Teşekkürler!
Arnauld

6

Java, 235 183 132 bayt

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

Bir şeylerin çeşitliliği kötüye kullanarak -52 bayt (statik erişim, dizinin vs listesi, döndürmek yerine vs. teşekkürler @ValueInk yazdırmak!)
-51 tembel ve icar @KevinCruijssen beung tarafından bayt işi bana için
çevrimiçi Deneyin


İhtiyacın olan delice havai java.util.Arrays.copyOfRange. Eğer kullanmak durumunda java.util.Listkullanabileceğiniz subListkısa için, ve bir dizi bina yerine STDOUT yazdırın. Bu fikirlerle 193 bayt aldım ve ayrıca var anahtar sözcüğünü kötüye kullandım.
Değerli Mürekkep

@ValueInk teşekkürler! Ben de değiştirilmiştir String.joinile s.joinbu ekstra IDE uyarılarının (ve -10 bayt) için.
Benjamin Urquhart

1
@ OlivierGrégoire hayır teşekkür ederim: ^)
Benjamin Urquhart

2
@ OlivierGrégoire Mücadelesi kabul edildi ve dövüldü, efendim! ; p 71 bayt
Kevin Cruijssen

1
@KevinCruijssen Güzel! Regex'in işe yarayacağını bile düşünmedim. Aferin ;-)
Olivier Grégoire

5

İlk kod golf girişimi umarım korkunç değildir ve umarım kurallara aykırı değildir.

Kotlin, 105 112 147 117 bayt / karakter

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

Çevrimiçi deneyin!



4

JavaScript, 91 97 75 78 bayt

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 dizisi olarak satır listesini çıkarır. Son girişte soruda izin verilen sondaki boşluk vardır. Test kodu, konsola her girişi tanıtım amacıyla ayrı bir satırda yazar.

19 baytlık kapalı ve boş alan olmayan Shaggy sayesinde - spread operatörü bir dizi hazır bilgiyi başlatmak için boş bir dizide kullanıldığında, spread operatörü tarafından üretilen dizide hiç alan oluşturulmaz:

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

(91 baytlık sürümün ilk satırında öncü bir boşluk vardı, 97 baytlık sürümün kaldırılması 6 bayt aldı.)



1
Parçacığı, fişlevi tanımladığınız için çalışmaz. Aksi takdirde doğrulandı. Aferin!
krinistof

@krinistof tamir etti, thx!
traktor53

Alıntılanan sözcükten sonraki kelimeler boşluk yerine virgüllerle ayrılır (Firefox, tarayıcı sorunu olup olmadığından emin değil)
wastl

1
@wastl Golf 3 bayt çok fazla ve bulanık gözler yüzünden virgül görmedi. İkinci yayılma operatörünü geri koymak (Shaggy'nin bağlantısında olduğu gibi) virgülleri kaldırır.
Kendime

4

Python 3 , 79 , 69 , 65 bayt

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

Çevrimiçi deneyin!

Xnor sayesinde 10 bayt kazıldım. Ve şimdi bu Erik Bayram Çözümü çözümü uyarınca 65 bayttır. Program IndexError ile bitiyor ancak bu iyi.


2
Hatalı sonlandırma programları için iyi . Kullanışlı bir püf print(*l)noktası: yerine Python 3'ü kullanabilirsiniz print(" ".join(l)).
xnor

Daha da iyisi, Extended Iterable Unpacking'i kullanın .
xnor

2
65 byte : Yerine atama wiçin input().split()atamak, input()içinde, o zaman, whiledöngü ata mkarşı w.split()önlemek referans konularına her tekrarda yeni bir liste oluşturmak, hangi ardından set m[i]etmek '"%s"'%m[i]ve print(*m).
Outgolfer Erik,

4

Java 8, 72 71 67 62 bayt

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

Çevrimiçi deneyin.

Açıklama:

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 açıklaması:

(?<=(^.*))(\\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
Çok sayıda regex cevabının yolunu açtın. Aferin.
Benjamin Urquhart

Bunu Python'a taşımaya çalıştım. Bazen regex ayrıştırıcılarının diller arasında tutarlı olmasını diliyorum.
Benjamin Urquhart

1
@BenjaminUrquhart Ne yazık ki onlar değil .. Java regex C # regex'ten farklı, Python yine farklı, Perl yine farklı, vs. Gerçekten de biraz can sıkıcı.
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.