/ * Satır numarası yorumları oluştur * /


12

Göreviniz, bir dizeyi girdi olarak alacak bir program (veya işlev) yazmak ve aşağıdaki satırları karşılayan her satırın başına metin eklemektir:

  • Eklenen metin satır numarasını içermelidir. 0- veya 1 tabanlı indeksleme kullanabilirsiniz.
  • Metin sizin dilinizde bir yorum olmalıdır. Bir yorum, programın durumunda hiçbir değişiklik yapmayan sözdizimsel olarak geçerli bir kod parçası olarak tanımlanır. Yorumun kaldırılması programda hiçbir değişiklik yapmamalıdır.
  • Yorum yalnızca sonunda yeni satırlar içerebilir.
  • Yalnızca boşluk ve yorum içeren satırlar için satır numaraları girmeniz gerekmez.

Özellikler

  • Girişin kendi dilinizde geçerli bir program olacağını varsayabilirsiniz.
  • Python gibi girintiye duyarlı dillerde, tüm girintilerden sonra satır numarası açıklamasını yerleştirebilirsiniz. Girinti karakteriniz olarak sekmeleri veya boşlukları seçebilirsiniz, ancak yayınınızda belirtmeniz gerekir.
  • Koddaki her ifadenin en fazla 1 satır alacağını varsayabilirsiniz; yani çok satırlı dizgiler veya ters eğik çizgi-devamsızlık.

Test Durumları

Python:

#0
a = int(input())
#1
while a:
    #2
    print(a)

C: (Dürüst olmak gerekirse, bunun derlendiğine şaşırdım)

/*0 */#include <stdio.h>
/*1 */int main()
/*2 */{
/*3 */    char c;
/*4 */    c = getchar();
/*5 */    do
/*6 */    {
/*7 */        putchar(c);
/*8 */    }
/*9 */    while (c);
/*10*/}

Bu , bu yüzden en kısa cevap (bayt cinsinden) kazanır.


7
Yorumları dile bağımlı yapmak işleri karmaşık hale getirir. Python için zaten özel bir kural oluşturmanız gerekiyordu. Çok satırlı yorumları olmayan diğer tüm diller ne olacak? Hiç yorumu olmayan diller hakkında. Yan etkiler olmadan yorumların yerleştirilemediği çok satırlı dizeler ne olacak?
Dennis

4
Eğlenceli gerçek: "yorumu kaldırmak programda hiçbir değişiklik yapmamalıdır" derhal herhangi bir Python cevabını diskalifiye eder, çünkü kod - yorumlar dahil - çalışma zamanında tanınabilir. Ben bir üretim sisteminde oyunda gördüm: AssertionErroryığın izleme foo.pybir dosya adından gelmesi beklenen ancak aynı zamanda bağlamda bir çizgi yorum olarak görünebilir ifade içermiyorsa bir yükseltmek .
wchargin

2
" Yorum yalnızca sonunda satırlar içerebilir " C " test durumu " ile tutarsız .
Peter Taylor

2
Peki ya yorumları olmayan langs?
NoOneIsHere

4
Düzenleme tutarsızlığı düzeltmez.
Peter Taylor

Yanıtlar:


5

Pyke, 7 bayt

o\Kz++r

Burada deneyin!

o       -  o++
 \K     -  "K"
   z    -  input()
    ++  - sum(^)
      r - while no errors: GOTO start

Tamsayı yorum tamsayı karakter Kve daha sonra çizgi olarak ilan ediyorum . Yeni satır opcode'unun içeri girmesini ve fazladan bir şey yazdırmasını durdurmak için fazladan bir bayt kullanılır.


16

Perl, 8 + 1 = 9 bayt

say"#$."

İle koş -p(1 byte ceza). (PPCG kurallarına aşina olmayan kişilere dikkat edin; ayrıca Perl sözdiziminin modern bir sürümünü kullanarak belirtmeniz gerekir -M5.010, ancak dil sürümlerini seçme seçeneklerinin ücretsiz olduğuna ve bir bayt cezasına çarpışmadığına karar verdik, bu yüzden bundan bahsetmedim bu yayının orijinal sürümü.)

-pprogramı örtük bir döngüye yerleştirir; temel olarak, programın her satırı ayrı ayrı işleyen bir filtre haline gelmesine neden olur (yani, tüm program ilk satırda, sonra ikinci, daha sonra üçüncü vb. Perl ayrıca, $.kaç giriş satırı okunduğunu kaydeden , çağrılan bir satır numarasını da takip eder . Yani programın yaptığı tek şey -pbir girdi satırı okumak; çıkış a #, geçerli satır numarası ( $.) ve bir satırsonu ( sayvarsayılan olarak bir satırsonu ekler, bu da bu durumda yardımcı olur ve daha sık görülenlerden daha kısadır print); ve daha sonra -pokuduğu orijinal kod satırının (genellikle-pgirdi üzerinde bir tür işlem yapardı, ancak yapmadığımız için çıktı değişmedi). Perl'deki yorumlar #yeni bir satıra gider ( #programın kendisi bir dize hazır bilgisi içinde olduğu için bir yorum başlatmaz), bu yüzden temelde yaptığımız şey dosyaya işlerken yorum satırları yazma fırsatını kullanmaktır , rahatsız etmeden "doğal" okuma ve yazma döngüsü -p.


Bunun nasıl çalıştığını açıklayabilir misiniz?
Adam

Elbette. İlgili Perl dil özelliklerinin çalışmasını öğretici bir tarzda açıkladım, çünkü dilin gücünü gerçekten fazla kullanmayan çok temel bir Perl programı. Herkesin bir -pdöngü veya otomatik olarak güncellenen bir satır numarasının nasıl çalıştığını bilmediğini hatırlamalıyım .

Bunun say"$.;"da işe yarayacağını unutmayın , çünkü soru "Koddaki her ifadenin en fazla 1 satır alacağını varsayabilirsiniz".
msh210

Bu aslında bir yorum değil; yararlı bir şey yapmasa da, AST'de sona erer (ve Perl'un optimizatörü biraz berbat olduğu için, aslında programın yavaşlamasına neden olacağını düşünüyorum, gerçekten yorum yapmak istemeyeceğiniz bir şey).

Kural için çalışmıyor Yalnızca boşluk ve yorum içeren satırlar için satır numaraları koymak zorunda değilsiniz.
Denis Ibaev

9

Javascript, 43 39 bayt

a=>a.replace(/^/gm,_=>`/*${++b}*/`,b=0)

4 bayt tasarruf için ETH ve Conor'a teşekkürler.


41 bayt: a => (b = 0, a.replace (/ ^ / gm, _ => /*${++b}*/)) (biçimlendirme dizesi kullanın)
Conor O'Brien

1
39 bayt:a=>a.replace(/^/gm,_=>`/*${++b}*/`,b=0)
ETHproductions 21:16


3

Toplu, 91 bayt

@set n=
@for /f "delims= tokens=*" %%a in (%1) do @set/an+=1&call echo @rem %%n%%&echo %%a

Toplu işin EOF'a kadar STDIN'i okuma yolu yoktur, bunun yerine dosya adının komut satırı parametresi olarak geçirilmesi gerekir.


3

Lua, 80 75 Bayt

Dilin kötüye kullanılmasıyla bayt tasarrufu sağlandı.

x=1print("--[[1]]"..(...):gsub("\n",load('x=x+1return"\\n--[["..x.."]]"')))

Yeterince basit başlangıç ​​cevabı.

Kurtulmamış, +

x=1                                                     -- Assign x to 1...
print(                                                  -- Print...
      "--[[1]]"                                         -- The first line number comment...
      ..                                                -- With...
      (...):gsub(                                       -- The input, replacing all...
                 "\n",                                  -- Newlines...
                    load                                -- with a string compiled function...
                    (' \
                    x=x+1                               --Increment x by one... \
                    return"\\n--[["..x.."]]"            -- And return the new linecomment. \
                    ')
                 )
      )

Lua bilmiyorum, ama her zaman aynı uzunlukta yorumlar üreteceğinden emin misin? Örneğin, bir program son yorumdan 10 satır uzunluğundaysa , boşluklarla doğru şekilde doldurmadıkça --[[10]]1 karakter daha uzun olacaktır --[[9]].
Esolanging Fruit

1
Oh, bu kuralı fark etmedim. Görünüşe göre ... Biraz gereksiz ...
ATaco

1
Evet. Belki kaldıracağım ... [EDIT]: kaldırıldı.
Esolanging Fruit

3

Gema, 16 15 karakter

*\n=\!@line\n$0

Gema'da ile başlayan yalnızca satır yorumları vardır !.

Örnek çalışma:

bash-4.3$ cat l33t.gema 
e=3
g=9
i=1
o=0
t=7

bash-4.3$ gema -f l33t.gema <<< 'Hello World!'
H3ll0 W0rld!

bash-4.3$ gema '*\n=\!@line\n$0' < l33t.gema > l33t-nr.gema

bash-4.3$ cat l33t-nr.gema
!1
e=3
!2
g=9
!3
i=1
!4
o=0
!5
t=7

bash-4.3$ gema -f l33t-nr.gema <<< 'Hello World!'
H3ll0 W0rld!

Aşağıdakiler, Adám'ın satır numarasını yok sayılan kod türüne eklemek mümkün olup olmadığı sorusunu yanıtlamak içindir .

Gema kodu esas olarak, bir koleksiyon gelen = için dönüşüm kuralları veya şablon = eylem Gema açısından. Hiç bir şeyle hiç eşleşmeyecek bir şablon tanımlamanın bir yolunu görmüyorum , bu tek başına bir yol gibi görünmüyor.

Gema, 18 karakter

*\n=c:\=@line\;:$0

Dönüşümleri e=3içine c:=1;:e=3.

Neyse ki Gema'da alanlar , bir tür isim alanları var. Yukarıdaki kod, hiçbir zaman kullanmadığımız c ad alanındaki kukla kuralları tanımlar. Maalesef, söz konusu alan adı satır sonuna kadar yürürlükte kaldığından, açıkça varsayılan alan adına geri dönmemiz gerekiyor.

Gema, 18 karakter

*\n=@line\=\$0\;$0

Dönüşümleri e=3içine 1=$0;e=3.

Daha az karmaşık bir alternatif, yok sayılan kod yerine efeksiz kod kullanmaktır. Yani tam olarak eşleşenleri geri koymak istiyorum.


Ancak bir dize ekleyip çevresinde yok sayılan bir kod bulamadınız mı?
Adam

Akım yerine bir çeşit e=3dönüşüm mü demek istediniz ? Evet, 19 karakter uzunluğunda bir çözüm olurdu. if (false) { 1 }; e=3!1␤e=3
manatwork

2

Qbasic, 91 89 bayt

OPEN"I",1,"i"
OPEN"O",2,"o"
DO UNTIL EOF(1)
i=i+1
INPUT#1,a$
PRINT#2,STR$(i)+"'"+a$
LOOP

Giriş:

CLS
PRINT "Hello!"
a$="Welcome"
INPUT "Type your name: ", b$
PRINT a$; ", "; b$
END

Çıktı:

 1'CLS
 2'PRINT "Hello!"
 3'a$="Welcome"
 4'INPUT "Type your name: ", b$
 5'PRINT a$; ", "; b$
 6'END

1
QBasic kullandığımdan bu yana bir süre geçti, ancak program metnini satır numaralarından ziyade bir yorum yapmıyor mu? Yoksa bir şeyi yanlış mı hatırlıyorum?

Giriş için teşekkürler! Aslında, 'sadece ondan sonra gelenleri yorumlar.
anonymous2

4
Evet, bu yüzden programı yorumlara dönüştürüyor. Yalnızca satır numaraları eklemek yerine, anlamı hiçbir şey yapmayan bir programa dönüştürür. (Dürüst olmak gerekirse, BASIC lehçesindeki bir girişin gerçek satır numaraları eklemek ve zaten sayıları varsa programı yeniden numaralandırmak güzel olurdu, ancak muhtemelen gerçekten gerekli değildir.)

2

BASH (+ GNU sed) 27 bayt

sed 'i#
='|sed 'N;s/\n//;N'

İlk bölüm ( i# \n =) neredeyse GNU sed'de çalışır (4 bayt için), ancak #.


2

awk ( 19 13 bayt)

19 bayt : Bu her kod satırının üstüne "#" + satır numarasını ekler

{print"#"NR"\n"$0}

13 bayt : İki 13 baytlık çözüm için @manatwork'e teşekkür ederiz

As 1eylem varsayılan print $0:

{print"#"NR}1

Veya $0içeriği değiştirerek

$0="#"NR RS$0

{print"#"NR}1veya $0="#"NR RS$0?
manatwork

@manatwork Bu alt noktaları keşfetmek için çok utanıyorum ve minnettarım
Adam

2

Kotlin genişletme işlevi, 69 60 bayt

fun String.a()=lines().mapIndexed{i,s->"/*$i*/$s"}.joinToString("\n")

fun String.a(){lines().mapIndexed{i,s->println("/*$i*/$s")}}

Örnek kullanım:

fun main(args: Array<String>) {
  //language=kotlin
  val code = """fun main(args: Array<String>) {
  println("Hello world!")
}"""
  code.a()
}

Çıktı:

/*0*/fun main(args: Array<String>) {
/*1*/  println("Hello world!")
/*2*/}

1

CJam, 21 Bayt

CJam'da hiç tecrübeli değilim, ama bunun bir yorumu olduğunu biliyordum :)

qN%ee{"e#"o(oNo(oNo}/

Açıklama çok yakında.


oNonTIO ile değiştirilebilir .
Esolanging Fruit

1

Mathematica, 58 bayt

i = 1; StringReplace[#, StartOfLine :> "(*" <> ToString@i++ <> "*)"] &

1

jq, 31 karakter

(27 karakter + 4 karakter komut satırı seçeneği.)

"#\(input_line_number)\n"+.

Jq içinde ile başlayan sadece satır yorumları vardır #.

Örnek çalışma:

bash-4.3$ cat l33t.jq 
gsub("e";"3")|
gsub("g";"9")|
gsub("i";"1")|
gsub("o";"0")|
gsub("t";"7")

bash-4.3$ jq -Rr -f l33t.jq <<< 'Hello World!'
H3ll0 W0rld!

bash-4.3$ jq -Rr '"#\(input_line_number)\n"+.' l33t.jq > l33t-nr.jq

bash-4.3$ cat l33t-nr.jq 
#1
gsub("e";"3")|
#2
gsub("g";"9")|
#3
gsub("i";"1")|
#4
gsub("o";"0")|
#5
gsub("t";"7")

bash-4.3$ jq -Rr -f l33t-nr.jq <<< 'Hello World!'
H3ll0 W0rld!

Sevgili Perl ve Ruby kodlayıcıları, lütfen jq'leri gözlemleyin input_line_number. Şükran olmak, ifade etmek için herhangi bir özel duygu $.?
manatwork

1

GolfScript, 23 Bayt

n/0:i;{"#"i):i+n+\+}%n*

"#" İle başlayan yalnızca satır yorumları var.

Açık ve açık:

           # the input is pushed on the stack automatically
n          # n is a predefined variable for "\n"
/          # splits the input string with the previously pushed "\n" as delimiter
0:i;       # i = 0
{          # A code block: It is used for map here (going through the input)
    "#"    # push a "#" onto the stack
    i):i  # save i + 1 in i, the value is again not popped from the stack
    +      # implicitly converts the number i to a string and concatenates "#" with it
    n      # newline
    +      # add a newline (# introduces a *line* comment)
    \      # switch the top to elements (-> yields the comment as the bottom, and the line as the top element on the stack)
    +      # concatenate them
}          # end of the code block
%          # map
n          # newline
*          # join the list with newlines between them
           # outputs are done implicitly

Bunun daha da basitleştirilebileceğinden eminim, özellikle de i de muhtemelen dışarıda bırakılabilir.

Burada test edebilirsiniz: https://golfscript.apphb.com/ Bu site giriş eklemeyi desteklemediğinden, kodun önüne çift tırnak işareti içine alınmış bir dize koymanız gerekir. '\n'yeni bir satır olacak. Başka kaçış dizileri de olduğunu unutmayın. '\\'Emin değilseniz kullanıcı .


1

C # 6, 66 61 bayt

CSharpie sayesinde

(666, devils code ^^) artık ...

Bu, "C stili yorumlar" kullanan tüm diller için geçerlidir (C, C ++, C #, Java, ....)

Dizeyi satırlara böler, her satırı diziniyle birlikte ekler ve düzenlenen satırları yeni satır karakterleriyle tekrar birleştirir.

s=>string.Join("\n",s.Split('\n').Select((l,i)=>$"/*{i}*/"+l));

eski versiyon:

s=>string.Join("\n",s.Split('\n').Select((l,i)=>$"/*{i,3}*/{l}"));

1
Teknik olarak 64 beri op sıfır ile herhangi bir dolgu bahsetmedi. Ayrıca wirting ile 1 bayt daha kaydedebilirsiniz: $ "/ * {i} * /" + l. (L parametresini enterpolasyondan
çıkarma

Haklısın ^^ ama bu benim "kötü skorum" hehe'yi yok ediyor
Stefan

0

Python 2, 82 bayt

Yalnızca boşluk girintisi için çalışır

for i,l in enumerate(input().split('\n')):print l.split(l.lstrip())[0]+'#%d\n'%i+l

56 bayt için girintisiz sürüm

for x in enumerate(input().split('\n')):print'#%d\n%s'%x
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.