Bu yazı ne kadar cesur?


13

önsöz

Stack Exchange işaretlemesinde, metni kalın yapmak için ** kullanırız. Örneğin, bu işaretleme:

The **quick brown fox jumps over the lazy** dog.

Şu şekilde işler:

Hızlı kahverengi tilki tembel üstünden atlar köpek.

Elbette, cesareti de kapatmak için ** kullanıyoruz. Yani daha az cevap cesur olacak. Örneğin:

The **quick** brown fox jumps over the **lazy** dog.

Şu şekilde işler:

Hızlı kahverengi tilki üstünden atlar tembel köpek.

Ancak, kalınlık kapalı değilse, kalın değil olarak görünür :

The **quick brown fox jumps over the lazy dog.

Şu şekilde işler:

** Hızlı kahverengi tilki tembel köpeğin üstünden atlar.

Metinde tek bir ters eğik çizgi varsa \, kalınlık geçerli olmaz:

The \**quick brown fox jumps over the lazy dog.**

Şu şekilde işler:

Hızlı kahverengi tilki tembel köpeğin üstünden atlar. **

Boşluğu izlemek kalın yazı ile sonuçlanır (not, kahverengiden sonraki beyaz boşluk tek bir sekmedir):

The** quick** brown fox jumps over the lazy dog.**

Şu şekilde işler:

** Hızlı ** kahverengi tilki tembel köpeğin üstünden atlar. **

Ayrıca __ için kalın harfleri de kullanabiliriz, ancak aynı anda yalnızca bir tanesinin etkin olabileceğini unutmayın. İşte daha karmaşık bir örnek:

The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.

Şu şekilde işler:

Hızlı ** kahverengi fox__ atlar over__ the__ tembel ** köpeği.

Soru:

Bir şekilde ya bir program veya fonksiyon, verilen ASCII metin yazabilirsiniz Stringargüman veya sadece özel karakterler STDIN, üzerinde **, __, \, (kaçmak için) ve sondaki boşluk kaç cesur karakter belirler. Bu değer STDOUT'a yazdırılmalı veya işlevinizden döndürülmelidir. Çok uzun dizeleri desteklemenize gerek yoktur; Dize uzunluğunun, 30KStack Exchange postası için sınır olan en fazla olmayacağı garanti edilir .

İnce baskı:

  • Bir vaka için bir istisna / başka bir hata atabilir ve diğeri için normal şekilde geri dönebilir miyim?
    • Hayır. Her iki durum için de ya açık, net, hatalı olmayan bir dönüş değeri olmalıdır. STDERR çıkışı yok sayılır.
  • Sözcükler arasındaki boşluklar kalın olarak kabul edilir mi?
    • Evet. **quick brown**içinde 11 kalın karakter var.
  • Meli \içinde \**, kalın olursa, sayılacak?
    • Hayır. ** olarak görüntülenir, bu yüzden kalın yazılmışsa yalnızca 2 karakter olacaktır.
  • Tamamen açık olun: kaç karakterle kastediyorsunuz?
    • Kalın yazılacak toplam karakter. Bu **, metni dönüştürürse oluşturulmadığı , dönüştürülmediği anlamına gelir .
    • **Birkaç şekilde kalınlaştırmanın mümkün olduğunu unutmayın , örneğin **\****-> ** .
    • Bazı metnin italik yazı tipine dönüştürülebilme olasılığını düşünmeyin. Sadece düşünmek markdown kuraldır ** = kalın *.
  • Stack Exchange'de HTML Kalın da çalışır. yani <b> </b>
    • Evet, farkındayım. Bu durumu düşünmeyin, bu normal bir metindir.
  • HTML girişleri ne olacak? örneğin &lt;-><
    • Bunlar da normal metin olarak kabul edilmelidir, HTML varlık dönüşümü yoktur.
  • Yukarıda ele almadığınız bir örnek düşündüm!
    • Kurallar işlev tam metin, Stack Borsası yayınlanan sanki bir cevap (bir yorum) dışında kod blokları özel karakterler kabul edilmez . Hem dört boşluk tipi hem de ters tırnak tipi. Metnin nasıl oluşturulması gerektiğinden emin değilseniz, test olarak bir yere bir cevap kutusuna atın, izlemeniz gereken kurallar bunlar.

Örnekler:

Giriş:

The **quick brown fox jumps over the lazy** dog.

Çıktı:

35

Giriş:

The **quick brown fox jumps over the lazy dog.

Çıktı:

0

Giriş:

The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.

Çıktı:

18

Giriş:

The __quick\____ brown fox **jumps over\** the** lazy \**dog.

Çıktı:

23

Giriş:

The****quick brown fox****jumps over **the****lazy** dog.

Çıktı:

11

Standart Loopholes yasaklandı.


18Üçüncü test örneği için doğru?
Beta Çürümesi

@BetaDecay 7 + 11. Sizce ne olmalı?
durron597

28 yaşımdayım ... Programıma bakacağım
Beta Çürüme

@BetaDecay **fox__ jumps**söz konusu cesareti sonlandırır.
durron597

1
Soru , üç karakterli kaçış dizileri olduğunu \**veya \__bulunduğunu gösteriyor gibi görünüyor , ancak StackExchange'te yalnızca iki karakterli kaçış dizileri \*veya var \_. Böylece \***a**bir yıldız işareti ve ardından kalın yazıyor a. Başka bir kaçış daha var \\ . Bunu halletmeli miyiz?
feersum

Yanıtlar:


5

rs , 107 bayt

\t/ 
(?<!\\)((\*|_){2})((?=\S)(?!\2)(\\\2|.)*?)?(?<=\S)\1/(\n)^^((^^\3))\3
\\(\*|_)/\t
[^\t\n]/
\n/_
\t_?/
(_*)/(^^\1)

Canlı demo ve test senaryoları.

Bu oldukça çılgınca bir şey.

En yeni test durumu henüz çalışmıyor. WIP ...

açıklama

\t/ 

Sekmeleri boşluklarla değiştirin. Aynı karakter sayısına sahiptirler ve sekmeler daha sonra özel bir karakter olarak kullanılır.

(?<!\\)((\*|_){2})((?=\S)(?!\2)(\\\2|.)*?)?(?<=\S)\1/(\n)^^((^^\3))\3

NKalın yazılmış tüm metinleri Nyeni satırlar ve ardından orijinal metin ile değiştirin.

\\(\*|_)/\t

Bir ayırıcıdan hemen önce gelen bir ayırıcıyla ilgili tüm olayları bir sekme ile değiştirin. Bunun amacı **a\***, 3 gibi bir karakter sayısının 2 yerine 2 olmasını sağlamaktır.

[^\t\n]/

Sekme veya yeni satır olmayan herhangi bir karakteri kaldırın.

\n/_

Tüm yeni satırları alt çizgi ile değiştirin.

\t_?/

Takip edebilecek alt çizgilerin yanı sıra (kaçan sınırlayıcıları temsil eden) sekmeleri kaldırın. Bu, kaçan bitiş sınırlayıcıları ile yukarıdaki karakter sayıları sorunu ile ilgilidir.

(_*)/(^^\1)

Alt çizgi sırasını uzunluğuyla değiştirin. Bu karakter sayısıdır.


**a****b**çıkışlar 2, 6 olmalıdır. Bkz. a **** b
durron597

1
@ durron597 Bunun nasıl çalışması gerektiği konusunda biraz kafam karıştı. Bir açıklama ekleyebilir misiniz?
kirbyfan64sos

Dediğim gibi, sadece bir cevap bölmesinde onunla oynamak. **** her zaman sadece asteriks olup, diğer metne dayalı olarak kalın harflerle yazılmış veya kalın harflerle yazılmış olmayabilir.
durron597

Yani, kirbyfan64sos @, nasıl cesur olduğu sonrası?
mbomb007

2

Python: 133 karakter

import re
f=lambda s:sum(len(x[0])-4for x in re.findall(r'(([_*])\2\S.*?\2\2+)',re.sub(r'([_*])\1\1\1','xxxx',re.sub(r'\\.','x',s))))

Bu, hem Python 2 hem de 3'te aynı şekilde çalışmalıdır. İşlev f, Yığın Taşması'nın işaretleme sistemi tarafından biçimlendirildiğinde geçirilen dizede yer alacak kalın karakter sayısını döndürür.

Ben köşe davaların çoğu doğru (şimdiye kadar yorumlarda belirtilen olanlar da dahil olmak üzere) olsun düşünüyorum, ama yine de tamamen mükemmel değil. Neden benim kod en az birkaç giriş yanlış alacak böylece (gibi yapar) kalın x***x**yapmaz anlamıyorum .*x***x**

Kodun dört ana adımı vardır. Birincisi, ters eğik çizginin ardından 'x' karakteri olan herhangi bir karakterin normal ifadesini değiştirir. İkinci adım, dört asterix veya alt çizgi içeren herhangi bir diziyi dört 'x' karakteriyle değiştirir. Üçüncü adım, findallitalik yazılacak tüm blokları bulmak için bir normal ifade kullanır . Son adım, sumaramanın içindeki sınırlayıcıları dahil etmek istemediğimizden, her bloktan 4 karakter çıkararak, bu blokların uzunluklarını toplayan bir çağrı ifadesi olan bir jeneratör ifadesidir .

İşte bazı test çıktıları:

>>> f('The **quick brown fox jumps over the lazy** dog.')
35
>>> f('The **quick brown fox jumps over the lazy dog.')
0
>>> f('The \**quick brown fox jumps over the lazy dog.**')
0
>>> f('The** quick** brown fox jumps over the lazy dog.**')
0
>>> f('The __quick\____ brown fox **jumps over\** the** lazy \**dog.')
23
>>> f('The****quick brown fox****jumps over **the****lazy** dog.')
11
>>> f('\***a**')
1
>>> f('x***x**') # this one doesn't match the Stack Overflow input box
2

x***x**Giriş kutusunda neden çalışmadığına dair hiçbir fikrim yok. Tuhaf
durron597

1

JavaScript ES6, 91 bayt

s=>(o=0,s.replace(/\\(.)\1/g,'..').replace(/(\*\*|__)(?=\S)(.*?\S)\1/g,l=>o+=l.length-4),o)

Elden önce tüm kaçışları ele alır, sonra düzenli bir ifade kullanır. Çok sayıda golf potansiyeli.

açıklama

s=>( // Function with argument s
  o=0, // Set var "o" to 0
  s.replace( // Replace...
    /\\(.)\1/g,  // Matches \ followed by two the same characters. g means "global"
    ".." // Replace with two arbitrary characters
  ).replace( // Replace again...
     /(\*\*|__) // Match ** or __, store in "group 1"
       (?=\S)   // Make sure next character isn't whitespace
       (.*?\S)\1  // Match all characters until "group 1".
                  // Make sure last character isn't whitespace
     /g, l=> // Take the match...
       o+= // Increase o by...
         l.length // the length of the match
         - 4 // minus 4 to account for ** and __
  ), o) // Return o

Bunun için **a*b*c**yanlış olduğuna inandığım 9 döndürür. Gerçek sayı 5'tir (veya italikleri hesaba katarsanız, OP'ye göre yapmamanız gerekir).
Cristian Lupascu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.