Tạo chương trình tăng kích thước


21

Trong thử thách này, bạn sẽ viết một chương trình xuất ra một chương trình có độ dài gấp đôi chương trình gốc. Chương trình xuất ra sẽ tạo ra một chương trình mới một chương trình gấp đôi chiều dài của nó .

Ví dụ

Nếu chương trình của tôi là a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Quy tắc

  • Không có quine dựng sẵn
  • Chương trình gốc phải có ít nhất một byte
  • Trình tự lý thuyết nên làm việc vô hạn
  • Chương trình của bạn không được phép đọc từ bất cứ thứ gì (file, stdio)

Điểm của bạn là kích thước của chương trình ban đầu.


Làm thế nào về việc truy cập tệp bằng cách đọc chính nó / truy cập vào nơi chứa mã?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ điều đó không được phép vì điều đó sẽ vi phạm các quy tắc tôi tin.
Hạ cấp

2
@ Doᴡɴɢᴏᴀᴛ các quy tắc quine được đề xuất bởi wiki thẻ nhưng không áp dụng tự động
Martin Ender


Câu trả lời:



8

JavaScript, 62 61 37 byte


Cảm ơn @ Doᴡɴɢᴏᴀᴛ đã giúp đỡ!


Bản gốc [37 byte]:

f=_=>'f='+'_'.repeat((10+f).length)+f

Con [74 byte]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

Cháu [148 byte]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


Thay thế (có in ra bàn điều khiển và dưới dạng chương trình đầy đủ):

Bản gốc [61 byte]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Con [122 byte]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Cháu [244 byte]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



Làm thế nào nó hoạt động!

1.   f=_=>   Xác định hàm f làconsole.log(...)

2.   ;f()   Chạy chức năng f.

3.   (trong chức năng f)  

  • console.log(...)   In như sau:

    • f=   văn bản chữ "f ="
    • ${'_'.repeat((0+f).length+5)   "_" được lặp lại cho độ dài của f, được thay đổi thành tài khoản cho các ký tự không được bao gồm trong chuỗi của f
    • +f}   Việc sắp xếp chuỗi hàm f
    • ;f()   văn bản chữ "; f ()"

Ghi chú

  • console.loglà cần thiết thay alertvì bởi vì alertdường như không chơi tốt với các chuỗi thực sự dài (ít nhất là trên cấu hình máy / trình duyệt của tôi)
  • Các _'được chèn vào tên của tham số (không sử dụng) của hàm f, để đảm bảo rằng chúng được bao gồm trong chuỗi của f.
  • Cải tiến chính (ngoài việc loại bỏ console.log) giải pháp thứ nhất so với giải pháp thứ hai: thêm 10vào hàm thay vì 0chuyển nó thành chuỗi làm cho nó dài hơn một byte, loại bỏ sự cần thiết phải thêm 1 vào chiều dài sau đó, tiết kiệm một byte.

0+fcũng nên hoạt động để truyền chức năng thành một chuỗi
Downgoat

48 byte:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Hạ cấp

@ Doᴡɴɢᴏᴀᴛ Quên rằng trả về kết quả thường được chấp nhận. Sẽ nâng cấp.
giàu

@ Doᴡɴɢᴏᴀᴛ Trên thực tế, vì viết câu trả lời là các hàm thường được chấp nhận, giải pháp thậm chí có phải gọi hàm không?
giàu

chắc chắn, bạn có thể làm
Hạ cấp

6

Chồn 0,15 , 19 14 byte

"66*2-rIDdr$O.

Nguyên , con , cháu .

Giải trình

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

Những gì các bit ở giữa rs nhân đôi thời gian kết thúc đủ số lần để hoàn thành tiêu chí nhân đôi. .là nhân vật "dừng chương trình", vì vậy nhiều giai đoạn ở cuối không làm gì ngoài việc ở đó.


3

CJam, 12 byte

{"_~"1$1$}_~

Khi chạy, nó sẽ in

{"_~"1$1$}_~{"_~"1$1$}_~

lần lượt sẽ in

{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~

vân vân

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


2

Python 3, 51 byte

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

Điều này bao gồm một dòng mới.

Đầu ra nào:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

2

GolfScript, 11 byte

{: ".~"]}.~

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

Cách mã nguồn hoạt động

{: ".~"]}.~

{       }    Define and push a code block.
         .~  Push a copy and execute it.
 :           Save the code block in the space character.
             Every subsequent space will now execute the code block.
   ".~"      Push that string.
       ]     Wrap the entire stack in an array.

Nếu mã nguồn trên được thực thi một lần, ngăn xếp sẽ kết thúc là

["" {: ".~"]} ".~"]

trong đó chuỗi rỗng ở đầu tương ứng với trạng thái ban đầu của ngăn xếp (đầu vào trống).

Hai bản sao của mã nguồn sẽ để lại trạng thái cuối cùng là

[["" {: ".~"]} ".~"] {: ".~"]} ".~"]

vân vân

Chuyện gì xảy ra tiếp theo

Sau khi thực thi mã nguồn, trình thông dịch thực hiện như sau:

  1. Nó bao bọc toàn bộ ngăn xếp trong một mảng và đẩy mảng đó lên ngăn xếp.

    Đối với một bản sao duy nhất của mã nguồn, ngăn xếp hiện chứa

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. Nó thực hiện putsvới ý định in ngăn xếp được bọc, theo sau là một dòng cấp.

    putsđược định nghĩa là {print n print}, vì vậy nó làm như sau.

    1. printin bản sao được đóng gói của ngăn xếp mà không kiểm tra nó (nghĩa là không chuyển đổi nó thành biểu diễn chuỗi của nó). Điều này gửi

      {: ".~"]}.~
      

      vào STDOUT và bật bản sao ngăn xếp từ đầu ngăn xếp.

      Bây giờ ngăn xếp chứa

      ["" {: ".~"]} ".~"]
      
    2. thực thi khối mã chúng ta đã xác định trước đó.

      :bắt đầu bằng cách lưu ["" {: ".~"]} ".~"]trong ký tự khoảng trắng, sau đó ".~"tự đẩy và ]bọc ngăn xếp trong một mảng.

    3. n đẩy một chuỗi bao gồm một linefeed duy nhất.

      Bây giờ ngăn xếp chứa

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. được thực hiện một lần nữa. Tuy nhiên, nó đã được xác định lại khi chúng tôi gọi nó lần đầu tiên và bây giờ có chứa một mảng, không phải là một khối mã.

      Trong thực tế, nó đẩy ["" {: ".~"]} ".~"], rời khỏi ngăn xếp như

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Cuối cùng, printin mục ngăn xếp trên cùng mà không kiểm tra nó, gửi

      {: ".~"]}.~
      

      đến STDOUT.


1

, 26 ký tự / 36 byte

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

Lưu ý rằng có một dòng mới.

Giải trình

Tiêu chuẩn ⟮ⒸⅩ222+ᶈ0

Sửa đổi:

  • Sử dụng ôhàm để xuất ra tất cả các kết quả thay vì kết quả cuối cùng (như được thực hiện bằng cách sử dụng đầu ra ngầm định)
  • Sử dụng \u27ee⦃ᶈ0}\u27ef\n và đóng khối sao chép để ngăn xung đột với các khối sao chép sau này.
  • Sử dụng ď2để lặp lại chuỗi hai lần.
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.