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.