İlk kodu kopyalayarak artan boyutta bir kare oluşturun


45

Göreviniz , orijinal kaynak kodu geçerli kodun ortasına her yapıştırıldığında , yan uzunluğunu 1 birim artıran bir ASCII-art karesini (aşağıda açıklanmaktadır) basan , eşit uzunlukta bir program yazmaktır .

Bu görevi çok iyi tanımlamak benim için oldukça zor, bu yüzden size bir örnek vereceğim:

  • Diyelim ki ilk kodunuz CODEve basıldı:

    0
    
  • Ardından, CODEortasına yerleştirin : kodunuz olur COCODEDEve yazdırılmalıdır:

    00
    00
    
  • Ortasına tekrar yerleştiriniz CODE: kodunuz aşağıdaki hallerde COCOCODEDEDE yazacaktır:

    000
    000
    000
    
  • Ve bunun gibi. Cevabınız teorik olarak herhangi bir sayıda yinelemeden sonra çalışmalıdır, ancak dil performansı sınırlamaları nedeniyle, belirli bir eşiğin üzerinde makul bir şekilde çalışamayacağını anlıyorum.

Bazı kurallar:

  • Herhangi bir basılabilir ASCII'yi (32-127) kareniz için kullanılacak karakter olarak kullanabilirsiniz. Seçiminizin sabit olması gerekiyor (Her yineleme için aynı karakteri kullanmalısınız).

  • İlk çıktı karesinin kenar uzunluğu 1 olmalıdır .

  • Bir ascii sanat karesi, N satırlı ( N-1 satır beslemeleri / yeni satırlarla ayrılmış ) ve her satırda seçilen karakterin N kopyalarını içeren bir dize olarak tanımlanır .

  • Çıktınızın izleyen bir yeni satır dışında herhangi bir yabancı alan içermesine izin verilmez.

  • Girdi ve çıktı için varsayılanları kullanabilirsiniz (programlara veya işlevlere izin verilir, ancak snippet'lere izin verilmez).

  • Orta Kodunuzun kaynak kodu iki eşit olduğu iki parça öyle de bölünebilir noktası olarak tanımlanmaktadır.

  • Cevaplarınız orijinal programınızın uzunluğu ile byte olarak puanlanacaktır . En düşük bayt sayısı kazanır. Bir kravat olması durumunda, daha önce gönderilen cevap kazanır.

  • Bu programı , el ile yapmak zorunda kalmadan eklemeleri uygulamak için kullanabilirsiniz .


1
İtiraf etmeliyim ki, daha önce yayınlanan bu soru sorusundan ilham aldım . İnsanlar çok yakın olduğunu düşünüyorsa, bunu mutlu bir şekilde silerim. Ayrıca, herhangi bir hata yaptıysam özür dilerim, hala buradaki kurallarla ilgili fazla tecrübeli değilim. :)

2
PPCG'ye Hoşgeldiniz! Sandbox'ı gelecekteki zorluklarınız için kullanmanızı öneririm .
user202729

7
Siteye Hoşgeldiniz! Dupe tuzağına düşmeden ilham almak için başka bir mücadelenin mükemmel bir şekilde kullanılması :)
Shaggy

Yardımcı programınız çok satırlı programlar için çalışmıyor. Diğer sorudan değiştirilen bu versiyona ne dersiniz ?
Jo King,

1
@ user77954 Fakat benim beynim kodum python'unuzdan daha kısa :( (daha önce kimse bunu söyledi mi?)
Jo King

Yanıtlar:


41

Pyth , 2 bayt


5

Çevrimiçi deneyin! Ayrıca iki katına , üçe deneyin !

Bu nasıl çalışıyor?

\nargümanını eşzamanlı olarak döndürürken takip eden bir yeni satırla argümanını basan komuttur . Yani, bir ekleme yapmak her seferinde, değişmez tamsayı çevirmek 5 içeren bir dizi halinde N kopyalarını 5 birleştirilmiş ve lider yeni satırlar temelde böylece kare tutarak emin kez uygun sayıda basılmış olduğundan emin olun.


6
Kısa olan kutsal
frick

İyimserlik kanıtı (: P): Bayt sayıları eşit ve negatif olamayacağından, mümkün olan minimum bayt sayısı 0 bayttır. Görevi yerine getirmeyen 0 baytlık bir program var . Bu nedenle, 2 bayt en uygunudur.
Bay Xcoder

10
Herkes (özellikle HNQ seçmenleri), diğer cevaplardan da vazgeçip FGITW etkisinden kaçının.
user202729

25

JavaScript (ES6), 42 32 30 bayt

s=[this.s]+0;  console.log(s);

İkinci yineleme:

s=[this.s]+0;  s=[this.s]+0;  console.log(s);console.log(s);

Bir ekleyerek bu eserler 0için skodunun ilk yarısında çalıştırılan her zaman ve baskı skendisini ikinci yarı her çalıştırıldığında. JavaScript’in dört tuhaflığından yararlanır:

  1. Şu anki çevre ile belirtilebilir this. Bu yapmamızı sağlar this.syerine s.
  2. Bir nesnede tanımlanmamış bir özelliğe erişirken, hata atmak yerine, JavaScript döndürür undefined.
  3. Bir dizi artı bir sayı bir dize döndürür. [1,2,3] + 4 === "1,2,34"
  4. Bir diziyi dizgileştirirken undefinedboş dizgeye dönüştürülür, bunun anlamı budur [undefined] + 0 === "0".

Bir araya getirelim, bu ilk yarıyı (sıfır dizisi oluşturarak) sadece 13 baytta ifade edebileceğimiz anlamına gelir. alertBunun yerine kullanılmasına console.logizin verilirse, ikinci yarıyı kısaltarak 4 bayt daha tasarruf edebiliriz.


Tebrikler, yaptığım testleri geçti!

1
... Yaratıcı! :)
Shaggy



13

Python 2 , 22 bayt

i=0;i+=1; i
print'*'*i

Çevrimiçi deneyin!

Doubled:

i=0;i+=1; ii=0;i+=1; i
print'*'*i
print'*'*i

İkinci yarıya yeni satır karakteriyle başladığını unutmayın.


9

C (gcc) , 170 168 96 80 72 70 bayt

Çok daha kısa versiyon. Yine de önişlemcisim olmadan bir çözüm bulabilmeyi diliyorum.

i;main(n){for(;i++<n;)printf
#if 0

#endif
(" %*c",n=__LINE__/4, 10);}

Çevrimiçi deneyin!

Eski 168 bayt sürümü:

#ifndef A
#define A p(c){putchar(c);}j,n;main(i){for(
#else
#define A n++,
#endif
A



#ifndef B
#define B i=++n;i--;p(10))for(j=n;j--;)p(64);}
#else
#define B
#endif
B

Çevrimiçi deneyin!



@ user202729 ah, evet. Bir yazım hatası düzelttim ancak bir hata sundum. Dönülüyor.
gastropner

8

Python 2,30 bayt

False+=1      ;print'*'*False;

Çevrimiçi deneyin! , 2. ve 3. yineleme

Bu, Python'daki boollerin temelde ints ve Python 2'de isimlerin atandığı Falseve Trueyeniden atanabilecekleri gerçeğini kullanır .

Python 1 , 32 bayt

exit=exit+'*'  ;print exit[30:];

Çevrimiçi deneyin! , 2. ve 3. yineleme

Python 1'de yerleşik dizeler bulunur exitve quitkullanıcıyı etkileşimli kabuğun kullanıcıya nasıl çıkacağı konusunda bilgilendirmek için vardır. Varsayılan değer "Use Ctrl-D (i.e. EOF) to exit.".


1
Bunu önerecektim n=False+=1;print'*'*n;ama bunun bir Python özelliği olmadığını unutmaya devam ediyorum ...
ETHproductions

6

Kömür , 6 bayt

⊞υωLυ⸿

Çevrimiçi deneyin! Açıklama:

  ω     Predefined empty string (any variable would do here)
 υ      Predefined initially empty list
⊞       Push

υ tekrarlama sayısının uzunluğu ile sona erer.

    υ   List
   L    Length
        Implicitly print as a row of `-`s
     ⸿  Move to start of next line

6

Haskell , 68 bayt

let s@(z:n)="0\n"in case lines<$>[]of(h:t):_->(h:h:t)>>(z:h++n);_->s

Bir kez , iki kez veya üç kez çevrimiçi deneyin .

Haskell'in tembelliğinden dolayı, yukarıdaki gibi bir ifade, bu Meta sorusuna göre hiçbir argüman almayan bir işlev olarak sayılır .




5

Brain-Flak , 74 bayt

(((((()()()){}){}){}){})((()()()()()<>){})<>([]){({}[()]<(({})<>)<>>)}{}<>

Çevrimiçi deneyin!

İki katına ve üçe katlamaya çalışın .

açıklama

(((((()()()){}){}){}){}) # push 48 ("0") onto first stack
((()()()()()<>){})       # push 10 (\n) onto second stack
<>([]){({}[()]<          # a number of times equal to the height of the first stack:
  (({})<>)<>             #   copy the top of the first stack to the second stack
>)}{}<>                  # cleanup and return to second stack

Kırılma noktası, <>"itme 10" bölümünün ortasındadır . Bunu parçalamak, ilgili ikinci yarıya ulaşana kadar üçüncü istif üzerinde 5 bırakacaktır; bu noktada 10 iterek, kaldığı yerden devam edecektir.

Yazdırılabilir bir ASCII değerini (boşluk) 22 bayta itmek mümkün olsa da, bu, merkezi <>bastıktan sonra çalıştırılmasını sağlar 5. İki bayt daha ekleyerek, <>itmeye doğru tüm ilerlemenin 10üçüncü yığında olduğu şekilde hareket etmeyi başardım . Bir bonus olarak, bu aynı zamanda ortaya çıkan kareyi estetik açıdan daha hoş hale getirdi.



4

tinylisp , 112 bayt

(load library) (d N((q((x)(i x(inc x)1)))(v(h(t(t(h(t(q())))))))))(join(repeat-val(string(repeat-val 42 N))N)nl)

Çevrimiçi deneyin! Ayrıca iki kat ve beş kat .

"İlk yarıda bir dize oluşturun, ikinci yarıda yazdırın" yaklaşımı, birçok dilin alındığı yaklaşımı tinylisp'te çalışmaz, çünkü değişken değişkenler yoktur. Bunun yerine, bazı ciddi kod yuvaları yapıyoruz.

Kodun ikinci bir kopyası eklendiğinde, (q())listeye sararak içine yerleştirilir . Ardından (h(t(t(h(t(...)))))), bu listeye sonradan devam eder (d N. (v(...))değerlendirir; daha sonra bir isim (q((x)(i x(inc x)1)))varsa sonuç değerini artıran ve boş liste ise 1 döndüren isimsiz işleve aktarırız . Kodun en dıştaki iç sürümündeki son sonuç atar N. Temelde, iç içe geçme düzeylerini sayan tuhaf bir özyineleme türü kurduk.

Kodun ikinci yarısı daha Nsonra bir yıldız işareti, daha sonra Nbu tür dizelerin bir listesini oluşturur ve ardından listeyi yeni satırlarda birleştirir. Sonuç takip eden bir yeni satır ile görüntülenir.


3

R , 44 bayt

F=F+1;T=TRUE*TRUE+12;
write(strrep(1,F),"");

Çevrimiçi deneyin!

Takip eden bir yeni satırla yazdırır. T=TRUE*TRUE+12Sadece ped uzunluğu etmektir.

O iki katına deneyin ve o üç katına deneyin .


Noktalı virgülleri silerek 2 baytı ortadan kaldırabilirsiniz. Sanırım ilk satırın sonunda #: F=F+1;T=TRUE*TRUE+12#<newline> ile değiştirebileceğiniz bir boşluk varwrite(strrep(1,F),"")
Andreï Kostyrka

@ AndreïKostyrka bu ne yazık ki bile olmayan 43 byte olacaktı.
Giuseppe,

3

Julia 0.6 , 29 bayt

Tüm fikirlerim, xnor'ın akıllı python çözümünü uyarlamaktan daha uzundu.

i=0;i+=1;    i
println("0"^i)

Oluyor

i=0;i+=1;    ii=0;i+=1;    i
println("0"^i)
println("0"^i)

Çevrimiçi deneyin!


3

SNOBOL4 (CSNOBOL4) , 130 68 bayt

Şimdi yorum yapmadan! Eski algoritmanın bir açıklaması için düzenleme geçmişine bakın .

	X =X + 1
	A =ARRAY(X,DUPL(1,X));
I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

Çevrimiçi deneyin!

Deneyin bu iki katına ve üç katına

Açıklama:

	X =X + 1		;* increment X
	A =ARRAY(X,DUPL(1,X));	;* create an x-length array with 1 repeated x times for each element
I	I =I + 1		;* for i < x
	OUTPUT =A<I>	:S(I)	;* output a[i]
END

Bir ENDetiket gerektiğinden ve ilk ENDetiket dikkate alınmadığında herhangi bir şey göz ardı edildiğinden, bu zorluk için iki avantaj elde ederiz:

  • Programın ilk yarısında yapılan işlemler tekrarlar Xiçin Xtekrarlanır.
  • (tercümana), etiketler dahil , ikinci yarıdan sadece bir kopyası olacaktır .

Bu, ilk yarı için tekrarı kullandığımızı ve daha sonra çıkış Xzamanlarını tekrarlamak için daha "geleneksel" bir etiketleme yaklaşımı kullanabileceğimizi gösteriyor .

İlk yarı

	X =X + 1
	A =ARRAY(X,DUPL(1,X));

bu, tekrar zaman artırır Xkez uygun sayıda ve bir oluşturur ARRAY Adizinlere sahip 1için Xve burada her bir elemanının Adizesi 1tekrar Xkez.

Ardından, programın kaç kez tekrarlandığı önemli değildir, tercüman yalnızca şunu görür:

I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

Bu, Aendeks sınırların dışına çıkana kadar bir kerede bir elemanlarını basan tipik bir SNOBOL programıdır ve programı sonlandırır.

;genellikle bayt sayısını 68'e getiren ve kodun buraya eklenmesine izin veren yarım noktayı işaretleyen tek satırlık EVALveya CODEdeyimler için ayrılan isteğe bağlı bir satır sonlandırıcıdır .




1

Zsh , 10 bayt

s+=0
<<<$s

Çevrimiçi olarak tam bir test takımı deneyin!

... evet, bu biraz daha iyi. N kere dizeye ekle, sonra N kere bas. Dışarı Dönüşler <<<foo<<<foogayet eserleri.


Zsh , 64 bayt

Kullanılan karakter: (boşluk).

f(){printf '%*s\n' $1}
:<<'E'

E
repeat $[i=LINENO/3];f $i
exit

Çevrimiçi olarak tam bir test takımı deneyin!

Orta nokta, Eonu izleyen ikinci ve yeni satır arasındadır . Heredoc E, kodun tam ortasındaki bir satırda bir satır olduğunda sona erer .


lol @ "hafif" bir gelişme. aynı zamanda bunu ifade olabilirs+=0;<<<$s
roblogic
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.