Tạo một hình vuông có kích thước tăng dần bằng cách sao chép mã ban đầu


45

Nhiệm vụ của bạn là viết một chương trình có độ dài chẵn , in hình vuông nghệ thuật ASCII (được mô tả bên dưới), làm tăng độ dài cạnh của nó thêm 1 đơn vị mỗi lần mã nguồn gốc được dán ở giữa mã hiện tại.

Tôi khá khó khăn để xác định nhiệm vụ này rất tốt, vì vậy tôi sẽ cho bạn một ví dụ:

  • Giả sử mã ban đầu của bạn là CODEvà nó được in:

    0
    
  • Sau đó, chèn CODEvào giữa: mã của bạn trở thành COCODEDEvà nó sẽ in:

    00
    00
    
  • Chèn lại CODEở giữa: mã của bạn trở thành COCOCODEDEDE và nên in:

    000
    000
    000
    
  • Và như vậy. Về mặt lý thuyết, câu trả lời của bạn sẽ hoạt động sau bất kỳ số lần lặp nào, nhưng tôi hiểu nếu, do giới hạn hiệu suất ngôn ngữ, nó không thể chạy hợp lý trên một ngưỡng nhất định.

Một số quy tắc:

  • Bạn có thể sử dụng bất kỳ ASCII có thể in (32-127) làm ký tự để sử dụng cho hình vuông của mình. Sự lựa chọn của bạn cần phải là hằng số (Bạn nên sử dụng cùng một ký tự cho mỗi lần lặp).

  • Hình vuông đầu ra ban đầu phải có độ dài cạnh 1 .

  • Một hình vuông nghệ thuật ascii được định nghĩa là một chuỗi có N dòng (được phân tách bằng các dòng / dòng mới N-1 ) và với mỗi dòng chứa N bản sao của ký tự được chọn.

  • Đầu ra của bạn không được phép chứa bất kỳ khoảng trắng bên ngoài nào, ngoài dòng mới.

  • Bạn có thể sử dụng mặc định cho đầu vào và đầu ra (chương trình hoặc chức năng được cho phép, nhưng đoạn mã thì không).

  • Phần giữa mã của bạn được định nghĩa là điểm mà mã nguồn có thể được chia thành hai phần sao cho hai phần bằng nhau.

  • Câu trả lời của bạn sẽ được tính theo độ dài của chương trình ban đầu của bạn , tính bằng byte. Số byte thấp nhất sẽ thắng. Trong trường hợp có hòa, câu trả lời đã được gửi trước đó sẽ thắng.

  • Bạn có thể sử dụng chương trình này để áp dụng các phần chèn thêm mà không cần phải làm điều đó bằng tay.


1
Tôi phải thừa nhận tôi đã được truyền cảm hứng bởi câu hỏi này được đăng trước đó . Nếu mọi người nghĩ rằng nó quá gần, tôi sẽ vui vẻ xóa cái này. Cũng xin lỗi nếu tôi mắc lỗi, tôi vẫn chưa quá kinh nghiệm với các quy tắc ở đây. :)

2
Chào mừng đến với PPCG! Tôi đề nghị sử dụng Sandbox cho những thách thức trong tương lai của bạn.
dùng202729

7
Chào mừng đến với trang web! Sử dụng tuyệt vời một thử thách khác để lấy cảm hứng mà không rơi vào bẫy dupe :)
Shaggy

Chương trình trợ giúp của bạn không hoạt động cho các chương trình có nhiều dòng. Làm thế nào về phiên bản sửa đổi này từ câu hỏi khác?
Jo King

1
@ user77954 Nhưng mã não của tôi ngắn hơn con trăn của bạn :( (có ai từng nói điều đó trước đây chưa?)
Jo King

Câu trả lời:


41

Bình thường , 2 byte


5

Hãy thử trực tuyến! Cũng thử gấp đôi , tăng gấp ba !

Làm thế nào mà làm việc?

\nlà lệnh in đối số của nó bằng một dòng mới, đồng thời trả về nó . Vì vậy, mỗi lần bạn thực hiện chèn, bạn biến số nguyên 5 thành một số chứa N bản sao của 5 chữ số và các dòng mới hàng đầu về cơ bản đảm bảo rằng nó được in số lần thích hợp, do đó giữ cho số vuông.


6
Holy frick ngắn thôi ...
Sản phẩm ETH

Bằng chứng về sự tối ưu (: P): Vì số byte phải là số chẵn và không thể âm, nên số byte tối thiểu có thể là 0 byte. Có chính xác 1 chương trình 0 byte, không hoàn thành nhiệm vụ. Do đó, 2 byte là tối ưu.
Ông Xcoder

10
Mọi người (đặc biệt là cử tri HNQ), cũng đưa ra các câu trả lời khác và tránh hiệu ứng FGITW.
dùng202729

25

JavaScript (ES6), 42 32 30 byte

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

Lặp lại thứ hai:

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

Điều này hoạt động bằng cách nối thêm 0vào smỗi lần nửa mã đầu tiên được chạy và stự in mỗi lần nửa thứ hai được chạy. Tận dụng lợi thế của bốn quirks JavaScript:

  1. Môi trường hiện tại có thể được đề cập đến với this. Điều này cho phép chúng tôi làm this.sthay thế s.
  2. Khi truy cập một thuộc tính chưa được xác định trên một đối tượng, thay vì ném lỗi, JavaScript sẽ trả về undefined.
  3. Một mảng cộng với một số trả về một chuỗi. [1,2,3] + 4 === "1,2,34"
  4. Khi undefinedxâu chuỗi một mảng, được chuyển đổi thành chuỗi rỗng, có nghĩa là [undefined] + 0 === "0".

Đặt cùng nhau, điều này có nghĩa là chúng ta có thể biểu thị nửa đầu (tạo ra một chuỗi số không) chỉ trong 13 byte. Nếu sử dụng alertthay vì console.logđược cho phép, chúng ta có thể tiết kiệm thêm 4 byte bằng cách rút ngắn nửa thứ hai.


Xin chúc mừng, vượt qua các bài kiểm tra tôi đã thực hiện!

1
... Khéo léo! :)
Shaggy




9

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

Phiên bản ngắn hơn nhiều. Vẫn ước tôi có thể tìm ra giải pháp mà không cần tiền xử lý.

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

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

Hãy thử trực tuyến!

Phiên bản 168 byte cũ:

#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

Hãy thử trực tuyến!



@ user202729 ah, vâng. Nghĩ rằng tôi đã sửa một lỗi đánh máy nhưng đã giới thiệu một lỗi. Hoàn nguyên.
dạ dày 4/2/18

8

Python 2 , 30 byte

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

Hãy thử trực tuyến! , Thứ 2 Lặp lại và 3

Điều này sử dụng thực tế là các bool trong Python về cơ bản là int và tên FalseTrueđược gán lại trong Python 2.

Python 1 , 32 byte

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

Hãy thử trực tuyến! , Thứ 2 Lặp lại và 3

Trong Python 1, các chuỗi dựng sẵn exitquittồn tại để thông báo cho người dùng về vỏ tương tác làm thế nào để thoát nó. Giá trị mặc định là "Use Ctrl-D (i.e. EOF) to exit.".


1
Tôi định đề xuất n=False+=1;print'*'*n;, nhưng tôi cứ quên rằng đó không phải là một tính năng của Python ...
ETHproductions 2/218

6

Than , 6 byte

⊞υωLυ⸿

Hãy thử trực tuyến! Giải trình:

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

υ kết thúc với một chiều dài của số lần lặp lại.

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




5

Brain-Flak , 74 byte

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

Hãy thử trực tuyến!

Hãy thử gấp đôităng gấp ba .

Giải trình

(((((()()()){}){}){}){}) # 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

Điểm dừng ở giữa <> phần "đẩy 10". Phá vỡ điều này sẽ để lại một số 5 trên ngăn xếp thứ ba cho đến khi chúng ta đạt được nửa thứ hai tương ứng, tại thời điểm đó, việc đẩy 10 sẽ tiếp tục ngay tại nơi nó rời đi.

Mặc dù có thể đẩy giá trị ASCII (khoảng trắng) có thể in thành 22 byte, nhưng điều này sẽ làm cho trung tâm <>được thực thi sau khi đẩy 5. Bằng cách thêm hai byte nữa, tôi có thể di chuyển <>sao cho tất cả tiến trình hướng tới việc đẩy 10lên ngăn xếp thứ ba. Như một phần thưởng, điều này cũng làm cho hình vuông kết quả có tính thẩm mỹ hơn.



4

tinylisp , 112 byte

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

Hãy thử trực tuyến! Cũng tăng gấp đôinăm lần .

Phương pháp "xây dựng một chuỗi trong nửa đầu, in nó trong nửa sau" mà rất nhiều ngôn ngữ đang sử dụng sẽ không hoạt động trong tinylisp, vì không có biến nào có thể thay đổi. Thay vào đó, chúng tôi làm một số mã lồng nhau nghiêm trọng.

Khi một bản sao thứ hai của mã được chèn vào, nó sẽ được đặt bên trong (q()), nó sẽ bọc nó trong một danh sách. Sau đó (h(t(t(h(t(...))))))khoan vào danh sách đó đến phần sau (d N. (v(...))đánh giá nó; sau đó chúng ta chuyển nó vào hàm không tên (q((x)(i x(inc x)1))), làm tăng giá trị kết quả nếu đó là số và trả về 1 nếu đó là danh sách trống. Kết quả cuối cùng trong phiên bản lồng nhau ngoài cùng của mã được gán cho N. Về bản chất, chúng tôi đã thiết lập một loại đệ quy kỳ lạ, đếm số cấp độ lồng nhau.

Nửa sau của mã sau đó tạo ra một chuỗi các Ndấu sao, sau đó là một danh sách các Nchuỗi như vậy, sau đó tham gia danh sách trên các dòng mới. Kết quả được hiển thị với một dòng mới.


3

R , 44 byte

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

Hãy thử trực tuyến!

In với một dòng mới. Chỉ T=TRUE*TRUE+12là để đệm chiều dài.

Hãy thử tăng gấp đôithử gấp ba lần .


Bạn có thể loại bỏ 2 byte bằng cách xóa dấu chấm phẩy. Tôi cho rằng có một khoảng trắng ở cuối dòng đầu tiên, bạn có thể thay thế bằng một #: F=F+1;T=TRUE*TRUE+12#<newline>write(strrep(1,F),"")
Andreï Kostyrka

@ AndreïKostyrka sẽ là 43 byte, thậm chí không may.
Giuseppe

3

Julia 0,6 , 29 byte

Tất cả các ý tưởng của tôi dài hơn việc điều chỉnh giải pháp trăn thông minh của xnor.

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

Trở thành

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

Hãy thử trực tuyến!


3

SNOBOL4 (CSNOBOL4) , 130 68 byte

Bây giờ không có ý kiến! Xem lịch sử chỉnh sửa để được giải thích về thuật toán cũ.

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

Hãy thử trực tuyến!

Thử nó gấp đôităng gấp ba

Giải trình:

	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

Bởi vì một END nhãn là bắt buộc và bất cứ điều gì sau khi ENDnhãn đầu tiên bị bỏ qua, chúng tôi nhận được hai lợi thế cho thử thách này:

  • các hoạt động trong nửa đầu của chương trình được lặp lại X lần cho các Xlần lặp lại
  • sẽ có (cho người phiên dịch) chỉ tồn tại một bản sao của nửa sau, bao gồm cả nhãn .

Điều này cho thấy rằng chúng tôi sử dụng sự lặp lại trong nửa đầu và sau đó chúng tôi có thể sử dụng phương pháp ghi nhãn "thông thường" hơn để lặp lại Xthời gian đầu ra .

Nửa đầu là

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

mà khi được lặp lại, sẽ tăng Xsố lần thích hợp và tạo một ARRAY Achỉ số từ 1đến Xvà trong đó mỗi phần tử Alà chuỗi được 1lặp lạiX lần.

Sau đó, bất kể chương trình được lặp lại bao nhiêu lần, trình thông dịch chỉ nhìn thấy:

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

đó là một chương trình SNOBOL điển hình in ra các yếu tố của A một lần cho đến khi chỉ mục vượt ra khỏi giới hạn, sau đó chấm dứt chương trình.

;là một bộ kết thúc dòng tùy chọn thường được dành riêng cho một dòng EVALhoặc các CODEcâu lệnh khá gọn gàng đưa số byte đến 68 và đánh dấu điểm giữa chừng, cho phép mã được nối vào đó.




1

Zsh , 10 byte

s+=0
<<<$s

Hãy thử một bộ thử nghiệm đầy đủ trực tuyến!

... Vâng, điều này tốt hơn một chút. Nối vào chuỗi N lần, sau đó in N lần. Hóa ra <<<foo<<<foohoạt động tốt.


Zsh , 64 byte

Nhân vật được sử dụng: (không gian).

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

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

Hãy thử một bộ thử nghiệm đầy đủ trực tuyến!

Điểm giữa nằm giữa dòng thứ hai Evà dòng mới theo sau nó. Một di truyền sẽ kết thúc khi có Emột dòng trên chính nó, xảy ra ngay giữa mã.


lol @ "cải thiện" nhẹ. cũng có thể diễn đạt nó nhưs+=0;<<<$s
roblogic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.