Como dizem os programadores: Esforce-se para ser preguiçoso


25

História

Você já viu este post do 9gag ? Talvez você tenha a sensação de fazer suas próprias frases. Mas então você percebe que poderá jogar um script em meia hora e nunca terá que lidar com isso.

A submissão

Seu programa receberá uma string de entrada que retornará com aspas adicionais, conforme explicado abaixo. As brechas padrão são proibidas. A saída como uma lista de linhas é permitida. Espaços à direita e linhas vazias que não interrompem a saída são permitidos.

As regras de entrada

  • A entrada contém apenas caracteres ASCII imprimíveis.
  • A entrada pode conter espaços. As palavras são determinadas com eles.
  • É garantido que um espaço nunca será seguido por outro espaço.
  • O caso de nenhuma entrada ou sequência vazia não importa.

As regras de saída

Se uma palavra for dada, o programa deverá retornar a string entre aspas.

Se a sequência de entrada tiver 2 ou mais palavras, ela retornará primeiro a entrada inicial, mas a primeira palavra estará entre aspas. Em seguida, na próxima linha, ele retorna a entrada inicial, mas com a segunda palavra entre aspas. E assim por diante pelas palavras restantes.

Em geral, o programa deve retornar quantas linhas houver palavras na entrada.

Exemplos:

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"

Isso é , então a resposta de menos byte vence!


7
Haverá palavras duplicadas?
— Modalidade de ignorância

10
Podemos assumir que a string de entrada não conterá "caracteres?
— Maçaneta

1
Re "Esforce-se para ser preguiçoso" : acho que isso é uma deturpação do que Larry Wall disse. - " A maioria das pessoas vê a preguiça como sinônimo de slacker ou couch potato, mas a definição de Wall é sobre eficiência. "
— Peter Mortensen

14
Este "problema" deve ser "divertido" para "golfe".
— Jono 2906

3
Podemos usar citações diferentes, como '', ‘’, ou “”, ao invés de ""?
— Giuseppe

Respostas:


10

vim, 38 bytes

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

Experimente online!

Requer o plug-in vim-surround .

Se a entrada não contiver "caracteres, isso poderá ser feito em 19 bytes :

qqysW"Ypds"W@qq@qdk

Aqui, registramos uma macro recursiva ( qq ... @qq@q) que envolve uma palavra entre aspas ( ysW"), duplica a linha ( Yp), exclui as aspas ( ds") e passa para a próxima palavra ( W) antes de se chamar recursivamente. Após o término, há duas linhas estranhas, que são excluídas com dk.

A solução completa simplesmente encapsula isso :s/"/<C-d>/gno início, que substitui os "caracteres existentes por um caractere não imprimível, e :%s/<C-d>/"/gno final, que desfaz a substituição.


2
Na verdade, eu fiz os exemplos com o mesmo método: D
— krinistof de

8

Haskell, 65 bytes

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

Retorna uma lista de linhas.

Experimente online!


Isso parece falhar quando a entrada contém aspas, novas linhas ou outros caracteres de escape.
— Wheat Wizard


@ SriotchilismO'Zaic: fixo. Obrigado por apontar. Em relação à versão mais curta: o xnor já postou isso como resposta .
— nimi

Não é bem fixo, uma vez que as palavras consideram \nespaços em branco, elas se comportam de maneira inadequada quando estão presentes.
— Wheat Wizard

@ SriotchilismO'Zaic: "A entrada contém apenas caracteres ASCII imprimíveis", que é o espaço para ~. "A entrada pode conter espaços" - não "espaços em branco".
— nimi

7

Retina 0.8.2 , 17 bytes

 
" $'¶$` "
^|$
"

Experimente online! O link inclui o conjunto de testes. Explicação:

 
" $'¶$` "

Expanda cada espaço duplicando a linha e inserindo aspas.

^|$
"

Corrija a primeira e a última linha.


7

Geléia ,  15  14 bytes

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

Experimente online!

Quão?

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

Fácil salvar . (Decidiu comentar aqui porque você foi o primeiro a postar código semelhante.: P)
— Erik the Outgolfer

@EriktheOutgolfer obrigado, voltei a postar uma melhoria semelhante.
— Jonathan Allan

6

JavaScript (ES6),  43 42 41  38 bytes

Guardado 3 bytes graças a @mazzy

Usa o não-padrão, mas é amplamente suportado RegExp.left​Contexte RegExp.rightContext. São muitas citações diferentes ...

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

Experimente online!


Inteligente! Mas veja na vírgula no caso de testeThis is a significantly "longer,"...
— mazzy

Não /(\S+)/gfuncionaria?
— Shaggy

1
@mazzy Oh, obrigado. Na verdade, fiz isso de propósito porque interpretei mal o caso de teste com uma vírgula. Agora consertado.
— Arnauld

@ Shagy Acho que precisamos capturar o espaço para que ele não apareça no contexto esquerdo da próxima palavra.
— Arnauld

1
@mazzy Acho que está tudo bem mesmo. Obrigado!
— Arnauld

6

Java, 235 183 132 bytes

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 bytes por abusar de uma variedade de coisas (acesso estática, lista vs matriz, imprimir ao invés de retornar, etc. @ValueInk Thanks!)
-51 bytes por Beung @KevinCruijssen preguiçosos e deixar fazer o trabalho para me
Tente-lo online


Essa é uma sobrecarga louca que você precisa para o java.util.Arrays.copyOfRange. Se você utilizar, java.util.Listpoderá usar subListpor menos tempo e imprimir em STDOUT, em vez de criar uma matriz. Eu tenho 193 bytes com essas idéias e também abusando da palavra-chave var.
— Value Ink

@ValueInk thanks! Também substituída String.joincom s.joinpara os avisos IDE extras (e -10 bytes).
— Benjamin Urquhart

1
@ OlivierGrégoire não, obrigado: ^)
— Benjamin Urquhart

2
@ OlivierGrégoire Desafio aceito e vencido, senhor! ; p 71 bytes
— Kevin Cruijssen

1
@KevinCruijssen Nice! Eu nem pensei que regex faria o trabalho. Bem feito ;-)
— Olivier Grégoire

5

Primeira tentativa de golfe com código, espero que não seja terrível e espero que não seja quebra de regra

Kotlin, 105 112 147 117 bytes / caracteres

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

Experimente online!



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

Produz uma lista de linhas como uma matriz JavaScript. A última entrada possui um espaço à direita, conforme permitido na pergunta. O código de teste grava cada entrada no console em uma linha separada para fins de demonstração.

Graças a Shaggy por 19 bytes de folga e sem espaços à esquerda - quando o operador de propagação é usado em uma matriz vazia para inicializar uma literal de matriz, nenhum slot é criado na matriz produzida pelo operador de propagação:

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

(A versão de 91 bytes tinha um espaço à esquerda na primeira linha, a versão de 97 bytes levou 6 bytes para removê-la.)



1
O trecho não é executado porque você definiu a ffunção. Caso contrário, verificado. Bom trabalho!
— krinistof

@krinistof corrigiu, thx!
— traktor53

As palavras após a palavra citada são separadas por vírgulas em vez de espaços (Firefox, não tenho certeza se isso é um problema do navegador)
— wastl

1
@wastl Jogou 3 bytes a mais e não viu as vírgulas devido a olhos embaçados. Recolocar o segundo operador de propagação (como no link de Shaggy) remove as vírgulas. Nota para si mesmo ... coloque meus óculos na próxima vez
— ;-(

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

Experimente online!

Raspou 10 bytes graças ao xnor. E agora são 65 bytes, conforme Erik, a solução Outgolfer. Programa termina com IndexError, mas isso é bom.


2
Terminar com erro é bom para os programas . Um truque útil: você pode usar print(*l)no Python 3 no lugar de print(" ".join(l)).
— xnor


2
65 bytes : em vez de atribuir wa input().split(), atribua-o a input(), em seguida, no whileloop, atribua ma w.split(), o que criará uma nova lista a cada iteração para evitar problemas de referência, depois defina m[i]como '"%s"'%m[i]e print(*m).
— Erik the Outgolfer

4

Java 8, 72 71 67 62 bytes

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

Experimente online.

Explicação:

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

Explicação 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
Você acabou de abrir o caminho para uma infinidade de respostas regex. Bem feito.
— Benjamin Urquhart

Eu tentei portar isso para Python. Às vezes, desejo que os analisadores de expressões regulares sejam consistentes entre os idiomas.
— Benjamin Urquhart

1
@BenjaminUrquhart Infelizmente, eles não são .. Java regex é diferente de C # regex, Python é diferente novamente, Perl é diferente novamente, etc. De fato, um pouco chato.
— Kevin Cruijssen


3

Rubi , 98 caracteres.

Primeira submissão de todos os tempos. Definitivamente, isso pode ser reduzido. Eu só queria obter uma resposta rapidamente.

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

Experimente online!


Bem-vindo ao PPCG! Minha sugestão seria para cada índice, salve s.splitcomo uma variável e edite o índice que você deseja que as aspas contornem, em vez de usar a excessivamente detalhada each_with_index.map. Além disso, você pode enviar o lambda anônimo sem nomeá-lo e a junção pode ser substituída por um *operador. Isso reduz sua contagem de bytes para 64 bytes.
— Value Ink

Fantástico! Eu sabia que havia uma maneira mais curta de participar, mas estava tentando sair do escritório e queria enviar algo antes de sair do XD. Não sabia que as regras permitiam lambdas anônimas assim.
— snowe

3

Perl 6 , 43 40 bytes

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

Experimente online!

Corresponde a todas as palavras possíveis e junta-se a cada lista entre aspas. Isso poderia ser um byte mais curto se pudéssemos produzir linhas na ordem inversa.

Explicação:

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

Reflexões , 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~
                 \ ^\
\                   /

Teste-o!

Eu "rapidamente" "joguei" isso em uma linguagem "engraçada" de "jogar golfe".

Olhando para todo esse espaço em branco, provavelmente poderia ser mais curto.



2

Stax , 10 bytes

▓¼MY@≈╢∞◙╗

Execute e depure

Descompactado, não jogado e comentado, parece com isso.

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

Execute este


2

C (gcc) , 136 133 bytes

Como as funções de tokenização de C atrapalhariam a string em futuras leituras, em vez disso, calculo o número e as compensações de cada palavra e termino quando o número total de iterações do loop externo corresponder ao número de palavras.

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

Experimente online!


Trocar "\""+!!(i-++j)por i-++j?"":"\""você economiza um byte.
— gastropner

2

PowerShell , 60 40 36 bytes

-20 bytes inspirados em Arnauld

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

Experimente online!

O resultado tem um espaço extra e uma linha vazia na cauda.


PowerShell, sem regexp, 60 bytes

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

Experimente online!

Menos golfe:

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

Nem funciona se as palavras de entrada contiverem guias ou outro espaço em branco. A partir do desafio, apenas espaços delimitam palavras.
— AdmBorkBork

você está certo, é claro. Mas as regras são: 1. The input only contains printable ASCII characters., 2 The input may contain spaces.. Guias e outros espaços em branco não são imprimíveis em ASCII, não é? :)
— mazzy

1
Suponho que isso seja verdade - eu estava apenas baseando minha declaração no comentário do OP aqui , mas isso não foi editado no desafio ... então, suponho que sua submissão seja boa como atualmente.
— AdmBorkBork

2

JavaScript, 62 bytes

Obrigado @Shaggy por jogar fora 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'));

Explicação

  • A função divide a string em cada espaço (x.split` `)
  • Para cada elemento na matriz resultante, execute a seguinte função
  • Crie uma cópia superficial da matriz (s = [... a])
  • Substitua o enésimo elemento da matriz por ele mesmo, entre aspas (s [i] = `" $ {c} "`)
  • retornar a cópia rasa unida a espaços (s.join ``)



2

R , 94 76 bytes

-18 bytes graças a Giuseppe

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

Experimente online!

Agradecemos ao digEmAll por configurar o TIO corretamente. Recebe, por exemplo, This is codegolfe sai corretamente

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

Ele usa um formato de matriz com a frase repetida nvezes; só precisamos alterar as entradas diagonais. Observe que geralmente, no código-golfe R, as strings são lidas com scan(,""), mas qualquer string pode ser usada em vez da string vazia como parâmetro what(ou w).

Explicação da versão antiga não destruída:

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! Como eu não vi que não precisava de duas chamadas para scan??
— Robin Ryder

Às vezes você apenas entra em um ritmo de golfe. Se pudermos usar outras aspas que não "", podemos reduzir para 68 bytes usando sQuote.
— Giuseppe

2

Este é o meu primeiro código de golfe. espero que não seja uma merda.

EDIT: reduziu para 54 bytes com uma melhor expressão regular.

** EDIÇÃO 2: por sugestões, corrigido um erro e diminuído **

JavaScript (V8) , 46 bytes

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

Experimente online!


5
Se a entrada contiver palavras duplicadas, as cópias subsequentes nunca serão citadas.
— recursivo

A divisão em espaços seria mais curta.
— Shaggy

@recursive deve ser corrigido.
— r3wt

@ Shaggy obrigado, incorporei sua sugestão
— r3wt

1
Ainda não funciona para palavras duplicadas
— Jo King


2

Elm Usando recursão, 132.130.121.111.100 99 bytes

Golpeou 9 bytes graças à técnica de Kevin Cruijssen e outros 22 bytes foram quebrados pelo ASCII-only . Transformado em recursão não-cauda durante o golfe.

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

Experimente online

85 bytes após a exposição String funções ao escopo atual

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

Versão não destruída (Usando recursão da cauda)

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

Tente sem golfe


2

Japonês , 14 12 bytes

¸£¸hYQ²i1X)¸

Tente

2 bytes salvos graças a 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! Claro! Obrigado, @ Oliver.
— Shaggy

1

PowerShell , 70 65 bytes

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

Experimente online!

Possui suíte de teste em avaliação. Possui 1 espaço à esquerda na primeira linha e 1 à direita na última linha. Tentativa de refatorar.


4
Isso não funciona se você tiver uma palavra duplicada na sequência de teste.
— snowe

1

Carvão , 19 bytes

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

Experimente online! Link é a versão detalhada do código. Nota: Espaço à direita. Explicação:

  θ                     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

Anexo , 34 bytes

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

Experimente online! Função anônima retornando uma lista de linhas.

Explicação

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 # (compilador interativo do Visual C #) , 123 bytes

Gostaria de saber se isso pode ser abreviado com expressões regulares.

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

Experimente online!




Port of Java answer - 104 :)
— dana


@KevinCruijssen - Eu vi que você conseguiu esse regex mais cedo :) Achei que era uma abordagem totalmente diferente, então não tentei abordá-la, mas sim, essa é uma boa solução!
— dana
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.