Satu Program Lagi dan Saya Keluar!


21

Diberikan tingkat penyatuan bilangan bulat positif ndan string skarakter ascii yang dapat dicetak ( untuk ~, menghasilkan program yang, ketika dijalankan dalam bahasa yang sama, mengeluarkan program yang menghasilkan program ... yang menghasilkan string s.

Sebanyak nprogram harus dibuat, yang semuanya harus dijalankan dalam bahasa yang sama dengan jawaban Anda.

Catatan: Anda dapat menampilkan program atau fungsi - apa pun yang diizinkan secara default sebagai kiriman.

Anda dapat memasukkan sdengan karakter yang lolos, bagaimana suatu program atau fungsi dalam bahasa Anda biasanya akan memasukkan string.


Contoh

Misalnya, diberikan n=1dan s="recursion", program Python 2 mungkin menampilkan:

print "recursion"

Menjalankan ini akan menghasilkan:

recursion

Diberi n=2dan s = "PPCG", sebuah program Python 2 mungkin menampilkan:

print "print \"PPCG\" "

Menjalankan output ini:

print "PPCG"

Menjalankan output ini:

PPCG

Terkait (+ inspirasi judul): Satu lagi LUL dan saya keluar

Juga Terkait (di kotak pasir - sekarang dihapus, tetapi masih dapat dilihat dengan reputasi yang cukup): Rekursi Kode Sumber

Uji Kasus

Pastikan kode Anda berfungsi untuk kasus uji berikut (satu per baris):

n s
2 PPCG
4 Robert'); DROP TABLE Students;--
17 Deep
2 Spaces In Here
3 "Don't forget quotes!"
5 'Backt`cks might be a h`tch'
6 5%s
8 [Brackets]<Are>(Great){Usually}
3 !"#$%&'()*+,-./ 0123456789:;<=>?@ABCDEFGHIJKLMN
6 OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
7 THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
3 the quick brown fox jumps over the lazy dog
code-golf  recursion  code-golf  kolmogorov-complexity  board-game  code-golf  number-theory  polynomials  code-golf  code-golf  array-manipulation  polyglot  alphabet  answer-chaining  code-golf  sequence  math  atomic-code-golf  abstract-algebra  proof-golf  code-golf  internet  code-golf  internet  code-golf  ascii-art  kolmogorov-complexity  code-golf  math  ascii-art  number  integer  code-golf  decision-problem  binary-matrix  code-golf  number  sequence  number-theory  code-golf  math  decision-problem  matrix  abstract-algebra  code-golf  string  keyboard  code-golf  fractal  code-golf  math  sequence  combinatorics  hello-world  vim  code-golf  sequence  code-golf  graphical-output  image-processing  code-golf  decision-problem  matrix  linear-algebra  code-golf  ascii-art  code-golf  math  code-golf  ascii-art  graphical-output  code-golf  string  code-golf  string  substitution  code-golf  string  ascii-art  code-golf  arithmetic  code-golf  number  array-manipulation  decision-problem  code-golf  kolmogorov-complexity  code-generation  fractal  code-golf  ascii-art  kolmogorov-complexity  code-golf  ascii-art  code-golf  string  array-manipulation  code-golf  music  code-golf  array-manipulation  code-golf  internet  stack-exchange-api  math  fastest-algorithm  code-golf  binary  bitwise  code-golf  date  code-golf  string  code-golf  sequence  integer  code-golf  arithmetic  number-theory  code-golf  string  random 

1
Sedang membaca tantangan dan seperti "hei, itu terlihat sangat akrab ..", dan kemudian perhatikan Anda " Juga Terkait (di kotak pasir): Sumber Kode Inspirasi " untuk pertanyaan Sandbox saya. :) Saya akan meninggalkan pertanyaan saya di sana untuk saat ini, tetapi akan menghapusnya setelah beberapa minggu. Pada dasarnya Anda sama, kecuali dengan penambahan parameter integer.
Kevin Cruijssen

1
Seperti yang disarankan di sini , apakah dibolehkan mengembalikan fungsi anonim alih-alih program?
Arnauld

1
Apakah "bilangan bulat positif" termasuk 0?
Felix Palmen

1
Apakah Anda memilih program karena suatu alasan? Standarnya adalah fungsi atau program? Apakah diizinkan memiliki fungsi mencetak fungsi?
Kevin Cruijssen

1
@StewieGriffin karena melarikan diri dalam sub-ekspresi atau program bersarang mungkin bermasalah (dan seseorang meminta kasus uji penawaran di kotak pasir).
fireflame241

Jawaban:


19

Jelly , 2 byte

Ṿ¡

Cobalah online!

Ṿ¡  Main link; left argument (text) is x, right argument (repetitions) is y
 ¡  Repeat y times:
Ṿ   Uneval x; produce code that outputs x

hehe builtin


Ini rusak, "hai" menghasilkan hai, bukan "hai"
Tahg

10
@Tahg Jelly input secara otomatis dievaluasi sebagai kode Python jika tidak menimbulkan kesalahan. Jika ya, maka itu hanya string. Anda harus melakukan '"hi"'untuk melihat hasil yang diharapkan
HyperNeutrino

19

JavaScript (ES6), 47 44 byte

Disimpan 3 byte berkat @HermanLauenstein

Mengambil input dalam sintaks currying (n)(s).

n=>g=s=>`alert(atob("${btoa(--n?g(s):s)}"))`

Contoh

f(2)('PPCG')

Akan menampilkan:

'alert(atob("YWxlcnQoYXRvYigiVUZCRFJ3PT0iKSk="))'

Yang akan dicetak:

'alert(atob("UFBDRw=="))'

Yang akan dicetak:

'PPCG'

Demo

Contoh yang lebih kompleks di mana alert()telah ditimpa sehingga hasil antara dicetak ke konsol dan dieksekusi secara otomatis.


Versi alternatif, 40 byte

Disarankan oleh @Shaggy

Yang ini mengembalikan fungsi anonim daripada program lengkap.

n=>g=s=>`_=>atob("${btoa(--n?g(s):s)}")`

Bisakah Anda mengembalikan fungsi anonim, alih-alih menggunakan alert? 41 byte
Shaggy

@ Shaggy saya tidak begitu tahu. Saya sudah bertanya pada OP.
Arnauld

Jika tidak, mungkin Anda bisa mendapatkan IIFE sebagai ganti 45 byte.
Shaggy

-3 byte menggunakan currying: n=>g=s=>BTalert(atob("${btoa(--n?g(s):s)}"))BT(ganti BT dengan backticks)
Herman L

@HermanLauenstein Terima kasih! :)
Arnauld

10

sh + coreutils, 31 byte

yes exec sed 1d \$0|sed $1q;cat

Dibawa nsebagai parameter baris perintah dan spada STDIN.


8
Kode ini mengatakan: "Ya, Anda pasti harus mengeksekusi saya."
RedClover

Bisakah Anda menambahkan penjelasan? Saya mengalami kesulitan mengatasinya
JoshRagem

1
@JoshRagem yesberulang kali mencetak baris perintahnya, yaitu exec sed 1d $0( $adalah shell metacharacter sehingga harus dikutip). sed $1qberhenti mencetak setelah garis $1(yaitu n). catkemudian salin string input. File yang dihasilkan adalah shskrip yang memberitahu shell untuk mengganti dirinya dengan salinan sedparameter 1ddan nama file skrip. sedkemudian lewati baris pertama file dan output sisanya. Setiap skrip memiliki satu exec sed 1d $0awalan yang lebih sedikit , sampai setelah neksekusi hanya input asli yang dicetak.
Neil


5

Haskell, 17 byte

Pada saat saya menulis ini, ini adalah jawaban terpendek untuk bahasa non-golf-spesifik .

Ini adalah fungsi yang mengambil sdan ndalam urutan itu, dan mengembalikan hasil atau kode sumber ekspresi yang, ketika dievaluasi, mengembalikan kode sumber berikutnya.

(!!).iterate show

Argumen mengapa ini penting:

  1. Solusi diizinkan menjadi fungsi.
  2. Keluarannya diizinkan menjadi fungsi.
  3. Fungsi-fungsi itu tidak memiliki parameter.
  4. Dalam Haskell, karena malas dan semuanya-curried, definisi yang paling alami - untuk tujuan pemrograman praktis - definisi fungsi 0-parameter sama dengan hasilnya; alternatif terdekat, fungsi 1-parameter yang mengabaikan parameter, konyol.

Jika fdiberikan PPCGdan 2sebagai parameternya, hasilnya adalah teks "\"PPCG\""(fungsi pertama yang dihasilkan), yang ketika dievaluasi mengembalikan teks "PPCG"(funtion kedua yang dihasilkan), dan ketika dievaluasi kembaliPPCG .

Terima kasih kepada nimi karena menyarankan pemendekan.


Ada pertanyaan Meta yang relevan tentang masalah fungsi tanpa argumen di Haskell, meskipun belum menerima banyak perhatian dan masih memiliki pertanyaan terbuka: codegolf.meta.stackexchange.com/q/12924/56433
Laikoni

3

APL (Dyalog) , 24 23 byte

-1 terima kasih kepada ngn.

Ini adalah program lengkap yang meminta sdan kemudian untuk ndan mencetak ke STDOUT.

''''{⍺,⍨⍺,⍵/⍨1+⍵=⍺}⍣⎕⊢⍞

Cobalah online!(kasus 17 Jauh dihilangkan karena melebihi batas output TIO - bekerja offline)

meminta s

 hasilkan itu (untuk memisahkan dan )

''''{}⍣⎕ Meminta ndan menerapkan lambda ini dengan satu kutipan sebagai argumen kiri yang berkali-kali. singkatan argumen kiri (kutipan) dan singkatan argumen kanan (teks input):

⍵=⍺ Boolean di mana teksnya sama dengan kutipan

1+ tambahkan satu

⍵/⍨ mereplikasi setiap karakter dari argumen dengan frekuensi yang sesuai

⍺, tambahkan kutipan

⍺,⍨ tambahkan kutipan

Ini berfungsi karena string dalam APL 'dibatasi dan tanda kutip tunggal dalam string digandakan, sementara tidak ada karakter lain yang perlu diloloskan.


Dyalog APL juga dikirimkan dengan utilitas ( ⎕SE.Dyalog.Utils.repObj) yang menghasilkan ekspresi APL yang mengevaluasi argumennya (mirip dengan Jelly's uneval ). Karena itu, program berikut ini setara dengan di atas, tetapi bekerja untuk semua array:

SE.Dyalog.Utils.repObj⍣⎕⊢⎕

Cobalah online!


Saya pikir APLX memungkinkan string "dua kali lipat" dan juga 'dikutip secara tunggal'. Jika sisanya bekerja di sana, Anda dapat menyimpan byte :) ngn / apl dulu tapi saya menghapus "" baru
ngn

Pertimbangkan untuk melewatkan kutipan sebagai .- yang menghemat (setidaknya) satu byte.
ngn

@ ngn Terima kasih, tetapi APLX tidak memiliki dfns. NARS2000 memiliki tanda kutip ganda dan dan dfns, tetapi masing-masing karakter harganya dua byte.
Adám

2

Firefox JavaScript, 41 35 byte

f=(s,n)=>"_=>"+uneval(--n?f(s,n):s)

Firefox memiliki yang bagus uneval, yang berfungsi seperti apa - tidak mengungkap objek yang diberikan, dalam hal ini - string.


2

Java 8, 95 93 byte

String c(String s,int n){return"v->\""+(n-->1?c(s,n).replaceAll("[\\\\\"]","\\\\$0"):s)+'"';}

-2 byte terima kasih kepada @Lynn .

Melarikan karakter khusus sangat menjengkelkan di Jawa ..

Coba di sini dan coba metode yang dihasilkan di sini .

Penjelasan:

String c(String s,int n){  // Method with String and int parameters and String return-type
  return"v->\""+           //  Return literal "v->" + a leading double-quote +
   (n-->1?                 //   If `n` is larger than 1:
     c(s,n)                //    Recursive-call,
      .replaceAll("[\\\\\"]","\\\\$0")
                           //    with all double-quotes ('"') and slashes ('\') escaped
    :                      //   Else:
     s)                    //    The input String
   +'"';                   //   + a trailing double quote
}                          // End of method 

Penjelasan tambahan untuk penggantian regex:

.replaceAll("[\\\\\"]","\\\\$0")
.replaceAll("        ","      ")  // Replace the match of the 1st String, with the 2nd
             [      ]             //  One of these inner characters:
              \\\\                //   Escaped slash ('\')
                  \"              //   Escaped double-quote ('"')
                                  //  And replace them with:
                        \\\\      //   Escaped slash ('\'),
                            $0    //   plus found match

Kenapa semua tebasan ini?

\   →  \\       // Escapes a single slash for the regex
\\  →  \\\\     // Escapes both regex-escaped slashes for the String
"   →  \"       // Escapes a double-quote for the String

1
Saya tidak berpikir Anda perlu melarikan diri "dalam kelas karakter regex, jadi \\\\\"(lima backslash) harus baik-baik saja.
Lynn

2

Underload , 11 byte

(a(S)*)~^^S

Cobalah online!

Masukan harus dimulai dari tumpukan, dengan nomor di atas dalam bentuk angka gereja . Saya tidak tahu apakah ini adalah metode input yang valid, tetapi spesifikasinya tidak memiliki input, dan menempatkan input ke atas tumpukan tampaknya seperti metode terdampar yang digunakan dalam bahasa tersebut.



1

QuadR , 8 byte

Terjemahan sederhana dari jawaban ngn .

Dibawa nsebagai argumen dan ssebagai Input.

^|'|$
'&

Cobalah online!

PCRE R eplace semua instance dari

^|'|$ Awal baris ATAU Kutipan ATAU Akhir baris

'& dengan Kutipan dan seluruh pertandingan

Argumen menentukan berapa kali untuk mengulangi transformasi.


ah, sekarang saya tahu untuk apa bahasa itu untuk :)
ngn

1

R , 62 byte

f=function(n,s){"if"(n,{formals(f)$n=n-1;formals(f)$s=s;f},s)}

Cobalah online!

Sebut seperti ini: f(n,s)diikuti oleh nsalinan()

Fungsi bernama; mengembalikan fungsi anonim. Yang dilakukan adalah memodifikasi nilai default formalsdari f, yang memungkinkan fungsi yang dihasilkan dipanggil (dan kemudian hasil dari yang dipanggil, nkali). ketika nmencapai 0, ia kembali s.

R sebenarnya tidak terlalu buruk dalam melarikan diri! Ini menggunakan C-style escaping, jadi Anda hanya perlu mengambil input, ganti "dengan \"dan \dengan \\, lalu bungkus semuanya " ".


0

Pyth, 21 byte

L++NsXbJ,N\\+L\\JNyFz

Coba di sini.

Sayangnya fungsi rekursif (bukan program lengkap seperti di atas) lebih panjang (24 byte):

M?GgtG++NsXHJ,N\\+L\\JNH


0

Ruby , 34 byte

%padalah flag printf khusus Ruby yang mendapatkan inspectnilai argumennya, mirip dengan %rdi Python. $><<berarti cetak.

f=->n,s{"$><<%p"%(n>1?f[n-1,s]:s)}

Cobalah online!


0

Excel VBA (32-Bit), 67 Bytes

Versi Terbatas untuk VBA Excel 32-Bit karena 2^imengevaluasi tanpa kesalahan dalam VBA 32-Bit, tetapi tidak dalam VBA 64-Bit

Fungsi jendela langsung VBE anonim yang mengambil input ndan sdari rentang [A1]dan [B1]dan menampilkan fungsi anonim yang bila dievaluasi turun menjadi hanya terminal (setelah niterasi) yang dihasilkan hanya ssebagai terminal itu

For i=0To[A1-1]:q=q+"?"+String(2^i,34):Next:?q[B1]Replace(q,"?","")

Contoh Input / Output

[A1:B1]=Array(7, "PPCG")
For i=0To[A1-1]:q=q+"?"+String(2^i,34):Next:?q[B1]Replace(q,"?","")
?"?""?""""?""""""""?""""""""""""""""?""""""""""""""""""""""""""""""""?""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""PPCG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
?"?""?""""?""""""""?""""""""""""""""?""""""""""""""""""""""""""""""""PPCG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
?"?""?""""?""""""""?""""""""""""""""PPCG"""""""""""""""""""""""""""""""
?"?""?""""?""""""""PPCG"""""""""""""""
?"?""?""""PPCG"""""""
?"?""PPCG"""
?"PPCG"
PPCG
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.