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
fireflame241
sumber
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

HyperNeutrino
sumber
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)}")`
Arnauld
sumber
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.

Neil
sumber
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

Python 2 , 40 byte

f=lambda r,t:r and"print%r"%f(r-1,t)or t

Cobalah online!

-4 byte terima kasih kepada xnor

HyperNeutrino
sumber
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.

Kevin Reid
sumber
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!

Adm
sumber
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.

dzaima
sumber
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
Kevin Cruijssen
sumber
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.

MegaTom
sumber
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.

Adm
sumber
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 " ".

Giuseppe
sumber
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
Erik the Outgolfer
sumber
0

APL (Dyalog Classic) , 19 byte

'^|''|$'r'''&'⍣⎕⊢⍞

Cobalah online!

ngn
sumber
Itu sangat pintar. Saya mencoba pendekatan ini, tetapi tidak berpikir untuk menambahkan.
Adám
Jual juga ini .
Adám
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!

Nilai Tinta
sumber
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
Taylor Scott
sumber