Котирування Tex (UVa 272)


17

З огляду на рядок, замініть усі ліві подвійні лапки на дві основи, а всі праві - подвійні лапки на дві одноцитати.

Ліворуч - це лапки, які починають цитату. Праві лапки - це лапки, якими закінчується цитата. Цитати не можна вкладати. Ви можете припустити, що в рядку є парна кількість подвійних лапок.

Приклади

Вхід:

"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!"

Вихід:

``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!''

Що таке ліві подвійні лапки та праві подвійні лапки?
мій займенник monicareinstate

1
@someone Ліві подвійні лапки - це цитати, які починаються цитатою. Правильні подвійні лапки - це цитати, якими закінчується цитата.
HighlyRadioactive

Чи можна вкласти котирування?
мій займенник monicareinstate

@someone Nope. Вони не можуть.
Високорадіоактивний

3
@ LegionMammal978 "Чи можна вкласти котирування?" ... "@omeome Nope. Вони не можуть."
Джонатан Аллан

Відповіді:


18

Нечитабельна , 789 777 байт

-12 байт, використовуючи змінну X34, а не X6.

"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " """ "" "" "" "" "" "" "" "" "" "" "" "" "

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

Відображається шрифтом змінної ширини відповідно до традиційної данини назві мови.

Я навчився нечитанному для цього виклику, адже це, очевидно, найкращий інструмент для роботи. Єдині персонажі , яких припускаються в нечитабельним є 'і ", тому , звичайно , він прекрасно підходить для завдання , яка включає в себе зміну "в'' . Чи не так?

Пояснення:

'""""""'""'""" 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

(Дзвінки на X34 - це фактично дзвінки до X (X5), оскільки X5 = 34.)


1
Мова квот у виклику квот LOL
HighlyRadioactive

5

Сітківка , 13 байт

Навчання Retina швидко, тому що мені чомусь не подобається перемагати Japt і я відчуваю, що рішення C # так чи інакше використовує регулярні вирази. Я знаю, що є відповідь Retina, але я не використовував її під час створення, і я все-таки знайшов її (точно) занадто.

#2$`"
``
"
''

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


1
Чому ненависть до Япта ?! : p
Shaggy

5

JavaScript (ES9), 34 байти

Робота над цитованими блоками:

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

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


JavaScript (ES6), 38 байт

Робота над кожною подвійною цитатою окремо:

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

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


Прапор dotAll для RegExp - нова функція ECMAScript 2018 , не включена до ES6.
TSH

@tsh Хороший улов. Оновлено.
Арнольд


4

Python 3 , 65 байт

f=lambda s:s and(s[0],"`'"[s.count('"')%2]*2)[s[0]=='"']+f(s[1:])

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

-8 байтів завдяки Еріку Переможнику


Що стосується другої функції, ви можете видалити 8 байтів (вона не така вже й інша, як може здатися, я просто замінив s[0].replaceявну s[0]=='"'перевірку разом з деякими іншими модифікаціями).
Erik the Outgolfer

@EriktheOutgolfer Приємні знахідки, дякую!
Jitse

4

Japt , 12 байт

Буде 11 лише для обмеження (або, можливо, це помилка) Japt.

r'"ȲîT°g"`'

Спробуй це

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

Це дуже погано, що ви тут не можете скористатися Q: \
Олівер,

@Oliver, я можу (і спочатку це робили); Мені просто ,теж потрібно .
Shaggy

Я маю на увазі, це дуже погано, що ви його не могли просто використати Qзамість'"
Олівер,

4

TeX, 54 32 байти

Для виклику заміни котирувань TeX нам також потрібна версія TeX!

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

... є вхідним рядком, тому він не додає до кількості байтів.


1
Чому б не простіше \def"#1"{``#1''}? (або \long\defякщо ви очікуєте, що цитата перетне межу абзацу)
Phelype Oleinik

1
З тієї очевидної причини, що я про це не думав :-)
siracusa

2

Вугілля деревне , 23 байти

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Включає 8 байт, щоб уникнути громіздкого формату введення. Пояснення:

WS⊞υι

Збирайте рядки введення, поки не буде досягнуто порожнього рядка.

⪫υ¶¦

Приєднуйтесь до рядків на символах нового рядка.

⪪..."

Розділіть дані на лапки.

⭆...

Мапуйте кожну частину і об'єднуйте результати для неявного друку.

⎇κ...ι

Першу частину залиште незмінною.

⁺ײ§'`κι

Префікс відповідної цитати, подвоєний.


Я чекав рішення деревного вугілля. Приємно!
HighlyRadioactive

2

R , 40 байт

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

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

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

Хтось, ймовірно, опублікує більш коротку відповідь на основі групового звороту ... Я думаю, що ця відповідь більш характерна для R.

Пояснення scan(,"",,,'"',"")частини:

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

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

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

Дарн, очевидне рішення коротше. Замінює кожну частину, що цитується, версією на відповідні лапки.

Perl 6 , 24 байти

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

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

Замінює кожну подвійну лапочку, чергуючи два набори символів.


1

Сітківка , 15 байт

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

Спробуйте в Інтернеті! Підкреслює нудну відповідь Retina 0.8.2 на 1 байт. Пояснення:

"
""

Дублювати всі цитати.

Y`"`\`\`''

Циклічно замініть лапки парами зворотних посилань та одинарними цитатами.

16- байтова відповідь Retina 0.8.2 для повноти:

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

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




1

Лабіринт , (43?) 53 байти

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

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

Гольф-версія цієї, набагато простішої, 92-байтної програми:

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

Якщо нам не потрібно обробляти вхід, що містить нульовий байт, то 43 байти :

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


1

(GNU) sed , 38 33 30 байт

-4 , видаливши -nпрапор і неявно надрукувавшись n, -1 шляхом повторного використання попереднього /expression/, дякую @Cowsquack. -3 за допомогою неявного відгалуження до кінця.

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

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

Деякі досить основні стрибки з мітками. Це, ймовірно, може бути поле для байта або два.

: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
Btw, як правило, використовувані прапорці вказані у заголовку. Ви можете пограти в байт за допомогою codegolf.stackexchange.com/a/167295/41805 , крім того, деякі логіки розгалуження можна видалити. Тоді змушення рішення працювати без -nпрапора має заощадити трохи більше. (І звичайно, є тривіальне sed -zрішення, якого, я вважаю, ви навмисно уникали)
Kritixi Lithos,

Добре, я man sedтрохи заглибився і дістався до 30. Сміливо повідомте мені все, що я пропустив, у вас є досвід гольфу на цьому язиці. (О, -zце для мене нове, але я згоден. Я залишаюсь без цього.)
GammaFunction

Чудово виконано, я завжди радий бачити відповідь
Kritixi Lithos,


1

Haskell , 67 60 58 байт

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

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

Відповідна функція є (#0) .

Оскільки я спочатку думав, що запитання також вимагає від нас конвертувати одиничні лапки, це версія, яка обробляє обидві:

Haskell , 125 байт

(#(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

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


"\""має бути "''"(два апострофи)
siracusa

@siracusa Дякую, я припустив, оскільки ви можете використовувати "текс, ви можете використовувати його тут.
Опублікувати Rock Garf Hunter

1

QuadR , 14 байт

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

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

Просте пошук / заміна, використовуючи обгортку @ Adám для функції Eyalog APL ⎕R.

Як:

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


0

Желе , 13 байт

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

Повна програма.

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

Як?

ṣ”"µ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 байт

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

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

Пояснення:

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

Пояснення 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 ''

0

Рен , 91 байт

Fn.new{|n|
var c=1
for(i in n.split("\"")[1..-1])System.write(((c=-~c)%2==0?"``":"''")+i)
}

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

Пояснення

Fn.new{|n| // New anonymous function
var c=1    // Set the index counter as 1
for(i in n.split("\"")                                                 // For each over n splitted with quotes
                      [1..-1])                                         // Get rid of the first quote
                              System.write(                          ) // Output this to the console
                                           (
                                            (c=-~c)                    // Increment the counter
                                                   %2==0?"``"          // If that's divisible by 2, output a backquote
                                                             :"''"     // Otherwise, output a frontquote
                                                                  )+i  // Join the result with i
}

0

GolfScript ,35 34 байти

1:c;{.34={;c)2%:c'""'"``"if}""if}%

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

Пояснення

1:c;                                # Set 1 to the current item counter

    {                            }% # Map for every character in the input:
     .34=                      if   #     If the character isn't the quote,
                             ""     #         Just leave it alone
         {                  }       #     Otherwise:
          ;                         #         Remove the copy of the input
           c):c                     #         Increment the counter
                2%        if        #         If the counter isn't divisible by 2, 
                  '""'              #             Output the double-quote
                      "``"          #         Otherwise: Output the double backtick
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.