Citazioni Tex (UVa 272)


17

Data una stringa, sostituisci tutte le virgolette doppie a sinistra in due backtick e tutte le virgolette doppie a destra in due virgolette singole.

Virgolette a sinistra indica le virgolette che iniziano una citazione. Virgolette a destra indica le virgolette che terminano una citazione. Le citazioni non possono essere nidificate. Puoi presumere che ci siano un numero pari di virgolette doppie nella stringa.

Esempi

Ingresso:

"To be or not to be," quoth the Bard, "that
is the question".
The programming contestant replied: "I must disagree.
To `C' or not to `C', that is The Question!"

Produzione:

``To be or not to be,'' quoth the Bard, ``that
is the question''.
The programming contestant replied: ``I must disagree.
To `C' or not to `C', that is The Question!''

Cosa sono le virgolette doppie a sinistra e le virgolette doppie a destra?
mio pronome è monicareinstate il

1
@someone Le virgolette doppie a sinistra sono le virgolette che iniziano una citazione. Le virgolette doppie a destra sono le virgolette che terminano una citazione.
Altamente radioattivo,

Le citazioni possono essere nidificate?
mio pronome è monicareinstate il

@someone Nope. Non possono.
Altamente radioattivo,

2
@ LegionMammal978 "È possibile annidare le virgolette?" ... "Qualcuno no. Non possono."
Jonathan Allan,

Risposte:


18

Illeggibile , 789 777 byte

-12 byte utilizzando la variabile X34 anziché X6.

' '' '' ''' "" ' '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' ''''" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '" " ' '''" " ' '''" " ' '' ' ' '' '' '''' ' ' '''' ' ' '''' '''" " ' '''" "' "" ' '''" "" "" "" ' ''' "" "' '' '' ' ' '''' '' ''" ' '' "' '' '' '' '' '' ' '' ''' "" "" "" ' ''' "" ' ''' "" " ' '' '' '' ' ' '''' '''" "" " ' '' '' "" ' ''' "" ' '' ' ' '' '' '' ' ' '' ' ' '' '''' '' '''' '' '' '''' "'"" ' '''" "" ' '' ''' "" "" "" ' ''' "" ' ''' "" " ' '' '' '' '''" "" "" "" ' ''' "" ' ''' "" " ' '' '' '''" " ' '''" "" ' '' '' '' ''' "" "" "" " ' '' ' ''' "" "' '' '' '' ''" ' '' '' '' ' ' '''' "' '' "'" ' '' '' ''"' ''"'" ' '' '' '' '' "' '' '' '' ' ' '' '' '' ' ' '''' '''' '' ' ' '' '' '''' "" "" "" ' ''' "" " ' '' '' '' '''" "" '"' '' '' '' ' ' '''' ' ' '''' "'" "" ' '' ''' "" "" "" ' '' '' '' ' ' '''' ''' "" "' ' ' '''' ' ' ''''"'"" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" '" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" "' "" ' '''" "' '' '' '' ' ' '''' ' ' ''''"' '' "

Provalo online!

Visualizzato in caratteri a larghezza variabile, per il tradizionale tributo al nome della lingua.

Ho imparato illeggibile per questa sfida, perché è ovviamente lo strumento migliore per il lavoro. I soli caratteri consentiti in illeggibile sono 'e ", quindi sicuramente è perfettamente adatto ad una sfida che comporta la modifica "in ''. No?

Spiegazione:

'""""""'""'""" assign to X2
'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""" 34 (double quote sign)
'""""""'""'""'""'""'""" assign to X5
'""'""'""'""'""'"""""""'""'""" X2+5 (apostrophe sign)
'"""""'""'""""""'"""'"""""""""" while (1+ (assign to X1 a value read from stdin, or -1 if stdin is empty) != 0)
 '"""" do 2 things
 '""""""'""'""'""'""" assign to X4
 '"""""""'""'""" the value of X2
 AND
 '"""" do 2 things
 '""""""'""'""'""" assign to X3
 '"""""""'""" the value of X1
 AND
 '"""" do 2 things
 '"""""'"""""""'""'""'""'""" while(X4 != 0)
  '"""" do 2 things
  '""""""'""'""'""'""" assign to X4
  '""""""""'"""""""'""'""'""'""" X4-1
  AND
  '""""""'""'""'""" assign to X3
  '""""""""'"""""""'""'""'""" X3-1
 end while
 AND
 '"""""""""'"""""""'""'""'""" if(X3 != 0)
  '"'"""""""'""" print X1
 else
  '" print the output of
  '"""""""""'"""""""'"""""""'""'""" if(X34 !=0)
   '"""" do 2 things
   '""""""'"""""""'""'"""'""""""""'""" assign X34=0
   AND
   '"'"""""""'""'""'""'""'""" print X5
  else
   '"""" do 2 things
   '""""""'"""""""'""'"""'""" assign X34=1
   AND
   '"'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'""'"""""""'""'""'""'""'""" print X5+57
 end if
end while

(Le chiamate a X34 sono in realtà chiamate a X (X5), poiché X5 = 34.)


1
Un linguaggio quoty in una sfida quoty LOL
HighlyRadioactive

5

Retina , 13 byte

Imparare rapidamente Retina perché per qualche motivo non mi piace vincere Japt e sento che una soluzione C # userebbe comunque espressioni regolari. So che c'è una risposta Retina, ma non l'ho usata durante la creazione e l'ho trovata (esattamente) comunque.

#2$`"
``
"
''

Provalo online!


1
Perché l'odio per Japt ?! : p
Shaggy,

5

JavaScript (ES9), 34 byte

Lavorando su blocchi tra virgolette:

s=>s.replace(/"(.*?)"/gs,"``$1''")

Provalo online!


JavaScript (ES6), 38 byte

Lavorando su ogni doppia virgoletta separatamente:

s=>s.replace(/"/g,_=>(c="'`"[s^=1])+c)

Provalo online!


dotAll flag per RegExp è la nuova funzionalità di ECMAScript 2018 , non inclusa in ES6.
TSH

@tsh Buona cattura. Aggiornato.
Arnauld,



4

Japt , 12 byte

Sarebbe 11 solo per una limitazione di (o forse è un bug in) Japt.

r'"ȲîT°g"`'

Provalo

r'"ȲîT°g"`'     :Implicit input of string
r'"              :Replace double quotes
   È             :Pass each match through a function
    ²            :  Duplicate
     î           :  Replace each character with
      T°         :    Postfix increment T (initially 0)
        g"`'     :    Index into "`'" with wrapping

Peccato che non puoi usare Qqui: \
Oliver il

@Oliver, posso (e l'ho fatto inizialmente); Ne avrei solo bisogno ,.
Shaggy,

Voglio dire, è un peccato che non potresti semplicemente usare Qal posto di'"
Oliver

4

TeX, 54 32 byte

Per una sfida di sostituzione delle citazioni TeX abbiamo ovviamente bisogno anche di una versione TeX!

\catcode`"13\def"#1"{``#1''}...\bye

... è la stringa di input, quindi non si aggiunge al conteggio dei byte.


1
Perché non il più semplice \def"#1"{``#1''}? (o \long\defse ti aspetti che una citazione
superi

1
Per l'ovvia ragione che non ci avevo pensato :-)
siracusa

2

Carbone , 23 byte

WS⊞υι⭆⪪⪫υ¶¦"⎇κ⁺ײ§'`κιι

Provalo online! Il collegamento è alla versione dettagliata del codice. Include 8 byte per evitare un ingombrante formato di input. Spiegazione:

WS⊞υι

Raccogliere le righe di input fino a quando non viene raggiunta una riga vuota.

⪫υ¶¦

Unisci le linee sui personaggi di nuova riga.

⪪..."

Dividi l'input tra virgolette.

⭆...

Mappare su ogni parte e concatenare i risultati per la stampa implicita.

⎇κ...ι

Lascia invariata la prima parte.

⁺ײ§'`κι

Prefisso la citazione appropriata, raddoppiata.


Stavo aspettando una soluzione di carbone. Bello!
Altamente radioattivo,

2

R , 40 byte

cat(scan(,"",,,'"',""),sep=c("``","''"))

Provalo online!

Legge l'input della stringa, separando in ciascuno di essi " , dando un vettore di stringhe. Quindi incolla quelle stringhe, alternandole tra i doppi backtick e i doppi apostrofi come separatori, riciclandoli secondo necessità.

Qualcuno probabilmente pubblicherà una risposta R più breve basata su una regex ... Tuttavia, questa risposta è più tipica di R, penso.

Spiegazione della scan(,"",,,'"',"")parte:

scan(, # empty first parameter: read from STDIN
  "",  # type of input is a string
  ,    # default 3rd parameter nmax
  ,    # default 4th parameter n
  '"', # separate on character "
  "")  # do not treat any characters as quotations marks (necessary to handle ' in the input)

2

Perl 6 , 23 byte

{S:g/\"(.*?)\"/``$0''/}

Provalo online!

Accidenti, la soluzione ovvia è più breve. Sostituisce ogni porzione quotata con una versione con le virgolette appropriate.

Perl 6 , 24 byte

{S:g{\"}=<`` ''>[$++%2]}

Provalo online!

Sostituisce ogni virgoletta doppia, alternando le due serie di caratteri.


1

Retina , 15 byte

"
""
Y`"`\`\`''

Provalo online! Taglia la noiosa risposta Retina 0.8.2 di 1 byte. Spiegazione:

"
""

Duplica tutte le virgolette.

Y`"`\`\`''

Sostituisci ciclicamente le virgolette con coppie di backtick e virgolette singole.

Per noiosa risposta Retina 0.8.2 a 16 byte per completezza:

s`"(.*?)"
``$1''

Provalo online!




1

Labyrinth , (43?) 53 byte

396"
 } "",)@
  ~"  (
 "~ 3_:
""" 4
" .;-
=   ;
..::;

Provalo online!

Una versione giocata a golf di questo programma, molto più semplice, a 92 byte:

3 """
9 " ",)@
}96 " (
    " :_34-;;
    "     ; :
   """"""". :
   "        .
   """"""""=.

Se non abbiamo bisogno di gestire input contenenti zero byte, quindi 43 byte :

39}9
@  6
`,""
`  "
: ."=..
_ ;   "
34-;;::


1

(GNU) sed , 38 33 30 byte

-4 rimuovendo la -nbandiera e stampando implicitamente su n, -1 riutilizzando il precedente /expression/, grazie @Cowsquack. -3 usando implicitamente branch-to-end.

:a
s/"/``/;T
:b
s//''/;ta
n;bb

Provalo online! Provalo online! Provalo online!

Qualche salto di etichetta piuttosto semplice. Questo può probabilmente essere golfato da un byte o due.

:a          # label a
s/"/``/;T   # replace " -> ``. If unsuccessful, move to next line
:b          # label b
s//''/;ta   # replace " (implicit) -> ''. If successful, jump to a (w/o reading new line)
n;bb        # read in the next line, but jump to label b. 

1
A proposito, in genere i flag utilizzati sono specificati nell'intestazione. Puoi golfare un byte usando codegolf.stackexchange.com/a/167295/41805 , inoltre è possibile rimuovere parte della logica di branching. Quindi far funzionare la soluzione senza il -nflag dovrebbe risparmiare un po 'di più. (E ovviamente c'è la banale sed -zsoluzione che presumo tu abbia intenzionalmente evitato)
Kritixi Lithos

Bene, sono tornato man sedper un po 'e sono arrivato a 30. Sentiti libero di farmi sapere tutto ciò che mi mancava, hai l'esperienza di golf in questo lang. (Oh, -zè nuovo per me, ma sono d'accordo. Starò senza di essa.)
Funzione gamma

Ben fatto, sono sempre felice di vedere una risposta sed
Kritixi Lithos,

1

05AB1E , 15 byte

'"¡ā¨„'`sè2×.ιJ

Provalo online!

Nessuna regex in 05AB1E, quindi ci dividiamo ", facciamo un elenco di alternati ``e ''quindi interlacciamo i due.


1
Ok, sembra che non debba correggere e ripristinare la mia risposta. ;)
Kevin Cruijssen il

1

Haskell , 67 60 58 byte

(#0)
('"':x)#n=["``","''"]!!n++x#(1-n)
(a:b)#n=a:b#n
x#n=x

Provalo online!

La funzione rilevante è (#0) .

Dal momento che inizialmente pensavo che la domanda ci richiedesse anche di convertire le virgolette singole qui è una versione che gestisce entrambi:

Haskell , 125 byte

(#(1<0,1<0))
('"':x)#(m,n)=last("``":["\""|m])++x#(not m,n)
('\'':x)#(m,n)=last('`':['\''|n]):x#(m,not n)
(a:x)#n=a:x#n
x#n=x

Provalo online!


"\""dovrebbe essere "''"(due apostrofi)
siracusa

@siracusa Grazie, ho pensato che dato che puoi usare "in tex potresti usarlo qui.
Post Rock Garf Hunter,

1

QuadR , 14 byte

"(.*?)"
``\1''

Provalo online!

Trova / sostituisci semplicemente usando il wrapper di @Adám per gli APL di Dyalog ⎕R funzione eplace di .

Come:

"(.*?)"  PCRE, finding anything between two double quotes and assigning it to group 1
``\1''   Transformation string, replacing the match with ``group_1''.


0

Gelatina , 13 byte

ṣ”"µJḊ⁾`'ṁḤż@

Un programma completo.

Provalo online!

Come?

ṣ”"µJḊ⁾`'ṁḤż@ - Main Link: list of characters, T   e.g. ..."hi" - she "said"...
 ”"           - character '"'                           '"'
ṣ             - split (T) at ('"')                      ["...","hi"," - she ","said","..."]
   µ          - (call that X) start a new monadic chain
    J         - range of length (of X)                  [1,2,3,4,5]
     Ḋ        - dequeue                                 [2,3,4,5]
      ⁾`'     - list of characters                      ["`","'"]
         ṁ    - mould like                              ["`","'","`","'"]
          Ḥ   - double                                  ["``","''","``","''"]
           ż@ - (with reversed @rguments) zip (with X)  [["...","``"],["hi","''"],[" - she ","``"],["said","''"],["..."]]
              - implicit (smashing) print               ...``hi'' - she ``said''...




0

Java 8, 40 byte

s->s.replaceAll("\"([^\"]+)\"","``$1''")

Provalo online.

Spiegazione:

s->                             // Method with String as both parameter and return-type
  s.replaceAll("\"([^\"]+)\"",  //  Replace all these matches,
               "``$1''")        //  with this replacement 

Spiegazione Regex:

 "([^"]+)"                      // MATCH:
 "                             "//  A literal "
   [^"]+                       "//  Followed by 1 or more non-" characters
  (     )                       //  (captured in capture group 1)
         "                     "//  Followed by a literal " again

``$1''                          // REPLACEMENT:
``                              //  Literal ``
  $1                            //  Followed by the match of capture group 1
    ''                          //  Followed by a literal ''
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.