Як кажуть програмісти: Прагніть бути лінивим


25

Історія

Ви бачили цю публікацію з 9гаг ? Можливо, у вас з’явилося відчуття складати власні речення. Але потім ти розумієш, що за півгодини ти можеш просто розіграти сценарій, і ніколи не будеш мати справу з цим.

Подання

Ваша програма отримає рядок введення, яку вона поверне із доданими лапками, як пояснено нижче. Стандартні лазівки заборонені. Вихід у вигляді списку рядків дозволений. Дозволені пробіли та порожні рядки, які не порушують висновок.

Правила введення

  • Вхід містить лише друковані символи 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
Повторно "Прагніть бути лінивим" : Я думаю, це неправильне представлення того, що сказав Ларрі Уолл. - " Більшість людей вважають лінь синонімом шаленої картоплі або кушетки, але визначення Уолл стосується ефективності ",
Пітер Мортенсен

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) перед тим, як викликати себе рекурсивно. Після її завершення з'являються дві сторонні лінії, які видаляються за допомогою 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 вже розмістив це як відповідь .
німі

Не зовсім фіксований, оскільки слова вважають \nпробілом, він поводиться неналежно, коли він присутній.
Пшеничний майстер

@ SriotchilismO'Zaic: "Вхід містить лише друковані символи ASCII", для чого це пробіл ~. "Вхід може містити пробіли", а не "пробіли".
німі


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 байт

Збережено 3 байти завдяки @mazzy

Використовує нестандартні, але широко підтримувані RegExp.left​Contextта RegExp.rightContext. Це багато різних цитат ...

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

Спробуйте в Інтернеті!


Розумний! Але дивіться на кому в тестовому випадкуThis is a significantly "longer,"...
маззи

Не буде /(\S+)/gпрацювати?
Кудлатий

1
@mazzy О, дякую. Я насправді зробив це так цілеспрямовано, бо я неправильно читав тестовий випадок комою. Тепер виправлено.
Арнольд

@Shaggy Я думаю, нам потрібно захопити простір, щоб він не відображався в лівому контексті наступного слова.
Арнольд

1
@mazzy Я думаю, це справді добре. Спасибі!
Арнольд

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 байти, зловживаючи різними речами (статичний доступ, список проти масиву, друк замість повернення і т. Д. Дякую @ValueInk!)
-51 байт, залякавши ледачі і дозволяючи @KevinCruijssen зробити роботу для мене
Спробуйте в Інтернеті


Це якийсь божевільний наклад, який вам потрібен java.util.Arrays.copyOfRange. Якщо ви використовуєте, java.util.Listви можете використовувати subListдля коротшого та друкувати в STDOUT замість створення масиву. Я отримав 193 байти з цими ідеями, а також зловживав ключовим словом var.
Значення чорнила

@ValueInk дякую! Я також замінити String.joinз s.joinдля цих додаткових попереджень IDE (і -10 байт).
Бенджамін Уркхарт

1
@ OlivierGrégoire не дякую: ^)
Бенджамін Уркхарт

2
@ OlivierGrégoire Challenge прийнятий і побитий, сер! ; p 71 байт
Kevin Cruijssen

1
@KevinCruijssen Приємно! Я навіть не думав, що регекс зробить цю роботу. Молодці ;-)
Олів'є Грегоар

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

05AB1E , 14 байт

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

Спробуйте в Інтернеті!


+1 байт (і це працює для крайового випадку) завдяки Emigna. -1 байт дякую Кевіну!


1
На жаль, вам потрібно використовувати ð¡для обробки вхідних даних, таких як test.
Емінья


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 виправив це, thx!
traktor53

Слова після цитованого слова розділені комами замість пробілів (Firefox, не впевнений, чи це проблема браузера)
wastl

1
@wastl Golfed 3 байти занадто багато і не бачив коми через розмиті очі. Збираємо назад другий оператор поширення (як в Shaggy "s посилання) видаляє коми Примітка до себе ... надіти окуляри в наступний раз ;-(.
traktor53

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 байт згідно з рішенням Еріка Аутгольфера. Програма закінчується IndexError, але це добре.


2
Закінчення з помилкою добре для програм . Зручний трюк: print(*l)замість нього можна використовувати в Python 3 print(" ".join(l)).
xnor

Ще краще використовувати розширене розпакування .
xnor

2
65 байт : Замість того , щоб призначити wна input().split(), привласнити його input(), а потім, в whileпетлі, призначте mдо w.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

Пояснення 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
Ви тільки що проклали шлях для безлічі відповідей на регулярні висловлювання. Молодці.
Бенджамін Уркхарт

Я спробував перенести це на Python. Іноді я хочу, щоб паргери для послідовних виразів були послідовними для різних мов.
Бенджамін Уркхарт

1
@BenjaminUrquhart На жаль, вони не є. Режекс Java відрізняється від C # regex, 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 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~
                 \ ^\
\                   /

Перевірте!

Я "швидко" "гольфував" це "смішною" "гольфною" мовою.

Дивлячись на весь цей пробіл, він, ймовірно, може бути коротшим.



2

Стакс , 10 байт

▓¼MY@≈╢∞◙╗

Запустіть і налагоджуйте його

Розпакований, неозорений та прокоментований, це виглядає приблизно так.

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 байт

Оскільки функції токенізації C будуть переплутати рядок на майбутніх зчитуваннях, я замість цього обчислюю кількість і зміщення кожного слова, а потім закінчую, коли загальна кількість ітерацій зовнішньої петлі відповідає кількості слів.

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?"":"\""економить вам байт.
гастропнер

2

PowerShell , 60 40 36 байт

-20 байт, натхненний Арнольдом

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

Спробуйте в Інтернеті!

В результаті є один додатковий простір і одна порожня лінія в хвості.


Powershell, відсутність зворотної зйомки, 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
Я вважаю , що це правда - я тільки засновуючи свою заяву від коментаря Ора в тут , але це не було змінено в виклик ... так що я вважаю , ваше уявлення в порядку , як це в даний час.
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 байт завдяки Джузеппе

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-гольфу рядки читаються за допомогою 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


@Giuseppe Дякую! Як я не бачив, що мені не потрібно два дзвінки scan??
Робін Райдер

Іноді просто потрапляєш у паз для гольфу. Якщо ми можемо використовувати інші цитати , ніж ""ми можемо скоротити до 68 байт , використовуючи sQuote.
Джузеппе

2

Це мій перший гольф з кодом. сподіваємось, це не лайно.

EDIT: зменшив її до 54 байт з кращим регулярним виразом.

** EDIT 2: за пропозиціями, виправили помилку та скоротили її **

JavaScript (V8) , 46 байт

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

Спробуйте в Інтернеті!


5
Якщо вхід містить повторювані слова, наступні копії ніколи не цитуються.
рекурсивна

Розщеплення на пробіли було б коротшим.
Кудлатий

@recursive слід виправити.
r3wt

@Shaggy спасибі, я включив вашу пропозицію
r3wt

1
Досі не працює для повторюваних слів
Джо Кінг,


2

В'яз Використовуючи рекурсію, 132,130,121,111,100 99 байт

Завдяки техніці Кевіна Круїйссена в 9 байтах було знищено 9 байтів, а ще 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") []

Спробуйте невольф



1

PowerShell , 70 65 байт

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

Спробуйте в Інтернеті!

Має тестовий набір у пробі. Має 1 провідний пробіл у першому рядку та 1 пробіл на останньому рядку. Спроба рефактора.


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

Attache , 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 #) , 123 байти

Цікаво, чи можна це скоротити за допомогою регулярних виразів.

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

Спробуйте в Інтернеті!




Відповідь порту Яви - 104 :)
дата


@KevinCruijssen - Я бачив, що ви отримали цей регулярний вираз раніше :) Я зрозумів, що це зовсім інший підхід, тому я не намагався перенести його, але так, це хороше рішення!
дата
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.