Tanrım, sekmelerde gizlenmiş!


26

Boşluk girintisi kullanıcıları, birleştirin ! Tüm düşük sekmeli kullanıcılara karşı savaşmalıyız !

Göreviniz (kabul etmeyi seçmelisiniz), iki argüman alan bir program veya işlev yazmaktır:

  • Bir dize: Bu giriş.
  • Olumlu bir tamsayı: Sekme başına düşen boşluk sayısı.

Dizginin her satırından geçmeli ve girintiler için kullanılan her sekmeyi verilen boşluklarla değiştirmelisiniz ve girintiler için kullanılmayan her sekmeyi (örneğin, bir çizginin ortasında) bir boşlukla değiştirmelisiniz.

Bu gibi satırların \t \tabctanımsız davranış olduğuna dikkat edin ; Kötü sekme kullanıcıları tarafından programlarınızı zorlaştırmak için eklenmişlerdir.

Sekmeler Must Die Society'ne göre, kötü sekme kullanıcıları tarafından tespit edilmekten kaçınmak için programınız mümkün olduğu kadar kısa olmalıdır.

Örnek

\t Burada sekmeleri temsil etmek için kullanılır.

Giriş dizesi:

a
\t\tb\tc
d

Numara giriniz:

4

Çıktı:

a
        b c
d

Ortadaki çizgi 8 boşlukla, sekme başına 4 (girilen sayı 4 olduğundan) girintili idi.

Giriş dizesi:

\ta\t\tb

Numara giriniz:

4

Çıktı:

    a  b

NOT: Bu, sekme genişletme sorununun bir kopyası değildir ; çok farklı bir giriş formatı ve biraz farklı gereksinimler gerektirir.


1
Evet , soru açıkça ondalık sayılar istemediği sürece (ki istemez).
Martin Ender


1
Girişin yalnızca yazdırılabilir ASCII, sekmeler ve yeni satırlar içerdiğini varsayabilir miyiz?
Dennis,

2
Önerilen test durumu: \ta\t\tb, 4(önceki revizyon başarısız oldu kimse o)
Dennis

2
Whitespace'de bir cevaba ihtiyacımız var.
Kaz Wolfe

Yanıtlar:


7

CJam, 30 24 23 bayt

q{_9=NA=Seasi*' ?@?:N}/

Genellikle internete kötü amaçlı kod göndermeyi reddediyorum…

Bu, dizeyi STDIN'den ve sayıyı komut satırı argümanı olarak okuyan tam bir programdır.

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

q                        Read all input from STDIN.
 {                   }/  For each character C in the input:
  _9=                      Push 1 if C is a tab and 0 otherwise.
     NA=                   See below.
        Seasi*             Push a string of W spaces, where W is the integer from
                           the command-line arguments.
              '            Push a spaces character.
                ?          Select the string if NA= pushed a truthy value, the
                           single space otherwise.
                 @         Rotate C on top of the stack.
                  ?        Select the string of spaces or the single space if _9=
                           pushed 1, the character C otherwise.
                   :N      Save the result in N.

Ne NA=yapar:

  • İlk karakter için, Nvarsayılan değerini, yani dizeyi içerecektir "\n".

    Sonraki tüm karakterler için, Nson yinelemenin sonucunu, yani girişten gelen son karakteri, boşluk karakterini veya bir veya daha fazla boşluktan oluşan bir dizeyi içerecektir.

  • Eğer Nbir dizidirNA= (etrafında sarma) N endeksi 10'da elemanı seçer. Sonuç, boşluk ya da satır besleme karakteri olacaktır. Her ikisi de truthy.

    N bir karakter ise, NA=satır beslemesi için 1, aksi takdirde 0 tuşuna basar.

  • Yukarıdakilerden dolayı, NA=bir satır beslemeden önce gelen bir karakter ya da bir boşluk dizisinden önce gelen bir karakter (zaten değiştirilmiş olan girintiler) için ilk karakter için bir rutubet değeri itecektir.

    Diğer tüm durumlarda (boşluk karakteri ile değiştirilen NA=bir tabülatör dahil ), sahte bir değere neden olur.


6
Kötü niyetli sekmeleri kaldırarak internette bir servis yapıyor olmanız iyi bir şey. ;)
Alex A.

19

K5, 53 45 bayt

{{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}

Eylemde:

  {{,/(b+a&~b:x*&\a:9=y){$[x;x#" ";y]}'y}[x]'y}[4;(,"a";"\t\tb\tc";,"d")]
(,"a"
 "        b c"
 ,"d")

Sadece kaydın bu sorunun ahlaki olarak anlaşılabilir olduğunu göstermesini istiyorum.


11
-21346106841 için... this question is morally reprehensible.
TheNumberOne

3
Bunun, en çok oy alan cevabı bitirmesi gerekiyor, böylece insanlar dipnotu görecek.
Geobits

3 bayt yazdırmak yerine sonucu geri döndürebilirsiniz.
kirbyfan64sos 09:15

1
@ kirbyfan64sos: Çizgilere katılmaya gerek kalmaması için sonucu yazdırıyorum. Sonucu dizge listesi olarak kabul edip geri gönderebilirsem, her satır için bir tane kaydedebilir `0:ve `" \ n "\`.
JohnE

@JohnE Yapabileceğini söyleyen bir kural koymadım, bu yüzden yapabileceğini tahmin ediyorum. :)
kirbyfan64sos

8

Perl, 23 bayt

22 bayt kodu + 1 bayt komut satırı

Umarım sayısal girişin -i parametresiyle verilebileceğini varsaymak için çok arsız değildir! Aşağıdaki kodda \ t'nin gerçek sekme karakteriyle değiştirildiğinden emin olun.

s/\G\t/$"x$^I/ge;y/\t/ /

Kullanım örneği:

printf "a\n\t\tb\tc\nd" | perl -p entry.pl -i4

Veya kolaylık sağlamak için:

printf "a\n\t\tb\tc\nd" | perl -pe 's/\G\t/$"x$^I/ge;y/\t/ /' -i4

Açıklama:

-pArgümanı kullanmak, girdideki her satır için programı çalıştırır, ardından sonucu yazdırır.

Yukarıdaki örnekte, normal ifade ikame yerine geçer \G\tile " "x4(bir boşluk, dört kez tekrarlanır). \Gilk yineleme durumunda ilk eşleşmenin konumunu veya ilk yineleme değilse önceki eşleşmenin konumuyla eşleşen az bilinen bir regex yapısıdır, yani yalnızca dizenin başlangıcındaki tüm sekmeleri değiştirecek tek tek bunu yapın. y/\t/ /Sadece boşluk ile geri kalan sekme değiştirir.


2

Julia, 69 59 bayt

f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")

Ungolfed:

function f(s::String, n::Int)
    # Replace the leading indentation tabs
    r1 = replace(s, r"^\t*"m, i -> " "^endof(i)n)

    # Replace any remaining tabs between words
    r2 = replace(r1, r"\t", " ")

    # Return
    r2
end

10 bayt kurtarıldı ve Glen O!


Önde gelen girinti tırnaklarını ayrı ayrı değiştirmenin bir yararı var mı? Bana öyle geliyor ki, doğrudan "kalan sekmeler" kısmı tarafından ele alınması gerekiyor. Ayrıca, "metin arasındaki sekmeleri değiştir" bölümünüz yalnızca tek bir sekmeyle eşleşecektir, peki ya varsa "hello\t\t1"?
Glen O,

Tüm girintilerin sekmelerle yapıldığını kabul edersek ( "\t \t"durum yok ), bunu yapabilirsiniz: ki bu f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")değiştirme işlevini kullanır ve tüm girinti sekmelerini tek bir tıklamayla yakalar.
Glen O

@ GlenO Wow, bu gerçekten dahice. Çok teşekkürler!
Alex A.

Cevabımın indirildiğini fark ettim. Yanlış yaptığım bir şey var mı? Herhangi bir sorunu çözmekten mutlu olurum.
Alex A.

Ben bir sorun görmüyorum. Belki de bir dilden hoşlanmadıkları için veya böyle şeylerden hoşlanmadığı için hakaret içeren hakaretli türlerden sadece bir tanesidir? Hiçbir kusur göremiyorum.
Glen O


2

Mathematica, 42 37 bayt

Birden fazla kod tasarrufu önerisi için @ LegionMammal978'e teşekkürler. İlk parametre, #giriş metni, ikinci parametre, #2sekme başına boşluk sayısı içindir.

StringReplace[#,"\t"->" "~Table~{#2}]&

Ayrıca, değiştirebilir Table[" ",{#2}]için " "~Table~{#2}bir bayt kaydedin. Neden StringJoinboş dizginin üzerine koyuyorsun?
LegionMammal978 11:15

1

Yakut 49 bayt

def r s,t;s.gsub! /^\t/,' '*t;s.gsub!"\t",' ';end

2
Satır başında iki sekme varsa, bu işe yaramaz.
Charles,

1

JavaScript (ES6), 70

Şablon dizgileri kullanılarak, yeni satır önemli ve sayılır.

(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

Aşağıdaki pasajı Firefox'ta çalıştırmayı test edin.

F=(s,n,r=n)=>[...s].map(c=>c<`
`?` `.repeat(r):(r=c<` `?n:1,c)).join``

// TEST
out=x=>O.innerHTML+=x+'\n\n'

out('Input: "A\\n\\t\\tB\\tC\\nD" 4\nOutput:\n'+F('A\n\t\tB\tC\nD',4))

out('Input: "\\tA\\t\\tB" 4\nOutput:\n'+F('\tA\t\tB', 4))
<pre id=O></pre>


1
Vay bir aşağı oy! 'Firefox'ta Test Etme' bilgisini okuyamayan veya anlayamayan biri olabilir mi?
edc65 10:15

Dil önyargısından şüpheleniyorum. Julia ve CJam da düşüşe geçti.
Dennis,

1

CoffeeScript, 72 bayt

(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "

(En az 2 ısırık golf oynamayı denemek, ES6 çözümünü yenecek ... Takdir edilmesine yardımcı olur: D)

Kullanımı:

f=(s,n)->s.replace(/^\t+/mg,(m)->" ".repeat(m.length*n)).replace /\t/g," "
str="""
My nice\tString
\tIndent <--
\t\tDouble
""" #\t is recognized as tab by CS
alert(f(str,4))

1

Retina, 42 bayt

Tüm oluşumları .boşluk, tümü \tdeğişmez sekmelerdir (1 bayt) ve<empty> boşluktur boş bir dosyayı temsil eder. Sadece okunabilirlik için. Ayrıca tam olarak döngüyü doğru yaptığımdan da emin değilim, ama öyle düşünüyorum. Her satır kendi dosyasına yerleştirilmelidir. Her ek dosya için 1 bayt ekledim.

Giriş, giriş sonunda kendi satırında Unary olarak kabul edilir.

(1*)$
_$1
m+`(?<!^|\t)\t
.
(`1$
<empty>
)`\t
\t.
\t|_
<empty>

açıklama

_Değiştirme sırasında sınırlandırmak için Unary girişinden önce bir ek eklerim , böylece sonda olanları giriş dizesinden çıkarmam. Daha sonra, satır başında olmayan tüm sekmeleri tek boşlukla değiştiririm. Ardından, 1giriş bitene kadar her sekmeden sonra bir tane kaldırarak ve tek bir boşluk ekleyerek döngü yapıyorum. Sonunda, sekmeleri ve alt çizgileri kaldırarak temizliyorum.


1

Python, 72 68 bayt

Sekmeler değişmez sekmelerdir (1 bayt), bu yüzden r'...'gerekli değildir. Ne yazık ki, Python "sabit genişlikte" görünümlere / görünümlere ihtiyaç duyuyor, bu yüzden kullanamıyorum (?<!^|\t). Retina çözümümle hemen hemen aynı yöntemi kullanıyor.

import re
lambda s,n:re.sub('\t',' '*n,re.sub('(?<!^)(?<!\t)\t',' ',s))




0

Haskell , 75 bayt

s#m|let('\t':r)#n=(' '<$[1..n])++r#n;(x:r)#n=x:r#(m^sum[1|x<' ']);e#_=e=s#m

Çevrimiçi deneyin!Bu, girişin yorumlarda OP'nin izin verdiği şekilde yalnızca yazdırılabilir karakterlerin yanı sıra sekmeler ve yeni satırlar içerdiğini varsayar.

Açıklama:

Dış #işlev bir dize sve sayı alır mve yerel olarak tanımlanmış iç #işlevi aynı argümanlarla çağırır . Bu, m#işlev sayıyı değiştirdiği için orijinal değeri takip etmek için yapılır :

  • ('\t':r)#n=(' '<$[1..n])++r#nBir sekmeyle karşılaşırsanız, nboşluklarla değiştirin ve ndeğişmeden bırakın .
  • (x:r)#n=x:r#(m^sum[1|x<' '])Eğer xbir sekme ile karşılaşılmazsa, olduğu gibi tutunuz, ancak yeni bir satır ise norijinal numaraya ayarlayınız , başka bir deyişle. Bu yapılır : gücüne alınır hangi değerlendirir için zaman bir boşluk daha küçüktür (yani satır), aldığımız bu yüzden . Aksi takdirde ve biz var .mx1m^sum[1|x<' ']msum[1|x<' ']1xm^1 = m0m^0 = 1

0

Java 11, 134 bayt

n->s->{var r="";for(var p:s.split("\n")){for(;p.charAt(0)==9;p=p.substring(1))r+=" ".repeat(n);r+=p+"\n";}return r.replace('\t',' ');}

Çevrimiçi deneyin.
NOT: Java 11 henüz TIO'da değil " ".repeat(n);repeat(" ",n) yerine (aynı bayt sayısı ile).

Açıklama:

n->s->{                 // Method with integer & String parameters and String return-type
  var r="";             //  Result-String, starting empty
  for(var p:s.split("\n")){
                        //  Loop over the rows (split by new-lines)
    for(;p.charAt(0)==9;//   Inner loop as long as the current row starts with a tab
       p=p.substring(1))//     After every iteration: remove the first character (tab)
      r+=" ".repeat(n); //    Append `n` amount of spaces to the result-String
    r+=p+"\n";}         //   Append the rest of the row with a newline to the result
  return r.replace('\t',' ');} 
                        //   Replace any remaining tabs with a space, and return the result
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.