Program yang menghasilkan program yang menghasilkan program ... yang menghasilkan "Halo!"

8

Tantangan

Tuliskan program P terpendek sehingga

  • P mengambil bilangan bulat positif n sebagai input, dan mengeluarkan string program P 1
  • mengeksekusi P 1 (tanpa input) menghasilkan string program P 2 ,

  • mengeksekusi P 2 (tanpa input) menghasilkan string program P 3 ,

  • ...

  • mengeksekusi P n (tanpa input) menghasilkan persis "Halo!" (tanpa tanda kutip).

Secara skematis:

                P (n) → P 1 → P 2 → ... → P n → Halo!

Kriteria

  • I / O adalah via stdin / stdout.
  • Panjang program diukur dalam byte.
  • Program hanya terdiri dari karakter yang dapat dicetak ASCII.
  • Tidak boleh ada duplikat di antara program P, P 1 , ..., P n .

EDIT: Program P, P 1 , ..., P n dimaksudkan sebagai kode sumber, dan "mengeksekusi program" mengacu pada pemrosesan apa pun yang menghasilkan output (yaitu, interpretasi, kompilasi & eksekusi, dll.).

res
sumber
1
Terkait: codegolf.stackexchange.com/questions/5510/can-you-meta-quine
dmckee --- ex-moderator kitten
@dmckee - Hubungannya, jika ada, tampaknya sangat jauh. Secara skematis, perilaku quine seperti P -> P , dan perilaku program terkait seperti P -> Q -> P ; tapi di sini perilakunya seperti P (n) -> ...--> Halo! , di mana P tidak harus menyerupai salah satu output.
res
1
Itu bukan kritik, res, hanya sebuah catatan bahwa orang yang menyukai masalah ini mungkin menyukai yang lain juga.
dmckee --- ex-moderator kitten
@ dmckee - Poin bagus, terima kasih.
res

Jawaban:

10

Golfscript 39 14

~'Hello!'{`}@*

Contoh:

Dengan asumsi bahwa n = 4 dan program kami adalah P , ini adalah langkah-langkahnya:

  1. Jalankan P dengan parameter 4 . Outputnya adalah "\"\\\"\\\\\\\"Hello!\\\\\\\"\\\"\""( P 1 )

  2. Menjalankan output P 1"\"\\\"Hello!\\\"\"" ( P 2 )

  3. Menjalankan output P 2"\"Hello!\"" ( P 3 )

  4. Menjalankan output P 3"Hello!" ( P 4 )

  5. Menjalankan output P 4Hello! . Jika Anda tidak mempercayai saya, ikuti tautan ini ☺.

Cristian Lupascu
sumber
1
Saya menemukan P1, P2, P3, P4 Anda berfungsi sebagaimana diperlukan, tetapi dengan input dari stdin, P Anda tidak menampilkan P1 - sebagai gantinya, ia menampilkan \'\\\'\\\\\\\'Hello!\\\\\\\'\\\'\'(mis., Melewatkan tanda kutip luar), ketika saya menjalankannya baik di Linux maupun di bawah Menangkan 7 (menggunakan echo 4 | ...pada prompt perintah). Adakah yang tahu apa masalahnya?
res
@res Anda benar; itu adalah kekurangan dari situs pengujian Golfscript yang saya buat. Saya berhasil memperbaikinya dengan menambahkan tiga karakter, tetapi sementara itu saya menemukan versi yang jauh lebih pendek dan mengedit posting saya.
Cristian Lupascu
@res Versi yang benar dari pendekatan lama adalah~''\(,{)2\?('\\'*}/]"'"*:z"'Hello!"z-1%"'"
Cristian Lupascu
Pada 14 byte, mengesankan! ... dan situs web yang bagus btw. (Tampaknya stdin dapat disimulasikan dengan mendahului sebuah program dengan ;"...", di mana ...inputnya. Misalnya, ;"4"akan mengungkapkan masalah missing-quote di atas, sedangkan hanya mendahului program dengan "4"tidak.) ...
res
@ terima kasih banyak! Anda benar tentang pemimpin ;. Ketika saya menulis program pertama saya lupa tentang ini di sepanjang jalan, meskipun saya yang menulis tentang hal itu di situs meta: meta.codegolf.stackexchange.com/a/521/3527
Cristian
4

JavaScript, 58 karakter

function $(_){alert(_?$+'$('+--_+')':'Hello!')}$(prompt())
salinan
sumber
Bagaimana cara kerjanya?
thepirat000
@ thepirat000 Jika argumennya _adalah 0, ini menghasilkan "Hello!", jika tidak, output definisi fungsi dan panggilan dengan _minus satu
salin
+1 untuk menyalahgunakan aturan dengan menggunakan penghitung alih-alih memperpanjang kode ...
WallyWest
4

Perl ( 45 36)

say"say q("x($m=<>),"Hello!",")"x$m         

Jalankan dengan perl -M5.010menggunakan say.

Untuk n=1, keluaran say q(Hello!)
Untuk n=2, keluaran say q(say q(Hello!))
Untuk n=3, keluaran say q(say q(say q(Hello!)))
dan sebagainya.

marinus
sumber
2

Python3, 66

r="print(%r)";e=eval;n=e(input())+1;e(e("(r%"*n+"'Hello!'"+")"*n))
Ev_genus
sumber
2

Gangguan Umum, 68 karakter

(do((n(read)(1- n))(s'(princ"Hello!")`(print',s)))((= 0 n)(eval s)))
(do ((n (read) (1- n))
     (s '(princ "Hello!") `(print ',s)))
    ((= 0 n) (eval s)))

Satu-satunya hal yang tidak langsung: itu menghasilkan satu tingkat program lebih dari yang dibutuhkan dan mengevaluasinya, karena evalsatu karakter lebih pendek dari print.

Kevin Reid
sumber
2

Gangguan Umum: 65

#1=(SETF N(READ)(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))

Versi ini lebih kecil dari jawaban CL yang ada. Jika Lisp Anda rusak dengan stackoverflow, maka Anda harus menggunakan ini, 81 byte:

#1=(SETF N(READ)*PRINT-CIRCLE* T(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))

Saya tahu saya terlambat ke pesta, dan saya yakin ini masih bisa dioptimalkan.

Demonstrasi (hati-hati, beberapa REPL online tidak berfungsi dengan benar):

* #1=(SETF N(READ)*PRINT-CIRCLE* T(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))
2
#1=(SETF N 1
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#))) 
#1=(SETF N 1
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#)))
* (eval *)

#1=(SETF N 0
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#))) 
#1=(SETF N 0
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#)))
* (eval *)
"Hello!" 
"Hello!"
* 

Perhatikan bahwa:

  • Diuji menggunakan SBCL 1.2.11.debian

  • Ada banyak peringatan karena saya melakukan hal-hal yang secara serius tidak seharusnya dilakukan. Untungnya, semua peringatan dicetak dengan tanda titik koma, sehingga mereka tetap diperlakukan sebagai komentar.

  • Duplikasi adalah karena satu adalah nilai balik dan satu output aktual. Jika nilai kembali juga akan dihitung, maka menyederhanakan menjadi 58 byte:#1=(SETF N(READ)(CADDR'#1#)(1- N)W(IF(= N 0)"Hello!"'#1#))

  • Saya masih tahu saya terlambat ke pesta

Mike Gebirge
sumber
1

Python 2.7, 57

print reduce(lambda x,y:y+`x`,input()*["print"],"Hello!")
JPvdMerwe
sumber
1

Haskell, 62

main=interact$(iterate(("main=putStr"++).show)"Hello!"!!).read
Joey Adams
sumber
1

Bash, 47 atau 12 (jika saya menggunakan golfbash)

Kode:

read x;for((;x>=0;x--)){ O+=" echo";};$O Hello!

kode golfbash:

R;n e Hello!

Kode sebelumnya (49):

read x;E=echo;eval \"\${E[0]\"{0..$x}\"}\" Hello!

Menggunakan:

Buat program P

$ echo '<paste code here>' > P

$ chmod +x P

Contoh

Buat P1:

$> echo 4 | ./P > 
echo echo echo echo Hello!

Buat P2:

$> echo 4 | ./P | bash
echo echo echo Hello!

Buat P3:

$ echo 4 | ./P | bash | bash
echo echo Hello!

Buat P4:

$ echo 4 | ./P | bash | bash | bash
echo Hello!

Jalankan P4:

$ echo 4 |./P | bash | bash | bash | bash
Hello!

Katakanlah saya membuat bahasa tujuan umum baru yang disebut golfbash - sedikit mirip golfscript - yang memiliki beberapa perintah berguna seperti ini:

R which reads stdin and places result into variable $REPLY.
n $1 $2 which echo's $1 $REPLY times followed by $2.
e which echo's all parameters to stdout.

Maka saya bisa menulis ini:

R;n e Hello!

Ini akan legal, bukan?

philcolbourn
sumber
1
Kasar. -1 untuk apa?
philcolbourn
+1. Saya kira downvote adalah untuk bahasa yang Anda temukan yang tampaknya khusus untuk tantangan ini. Lihat meta.codegolf.stackexchange.com/questions/871/…
Cees Timmerman
Baik, tapi aku melakukannya dengan bash juga.
philcolbourn
0

F #, 182

let say msg = sprintf "%s" msg
let gen num = 
    let rec g n a =
        match n with
        | i when i > 0 -> g (i-1) ("say \"" + a + "\"")
        | _ -> say a
    g num "Hello!"
vasu
sumber
Ketika saya menjalankan program Anda , sepertinya tidak menginput apa pun dari stdin, atau untuk mengeluarkan apa pun ke stdout.
res
0

J - 31 char

Perlu diingat bahwa J menggunakan string gaya Pascal: 'It''s too easy!'

'Hello!'(],,)''''#~<:2^".1!:1]1

Dijelaskan:

  • ".1!:1]1 - Baca dalam satu baris dari stdin dan ubah menjadi angka.
  • <:2^ - Ambil 2 pangkat angka ini, dan pengurangan.
  • ''''#~ - Buat string dengan banyak salinan karakter kutipan tunggal.
  • 'Hello!'(],,)- Tambahkan kutipan ini ke depan dan belakang Hello!.

Pemakaian:

   'Hello!'(],,)''''#~<:2^".1!:1]1   NB. let's try 3
3
'''''''Hello!'''''''
   '''''''Hello!'''''''  NB. P1
'''Hello!'''
   '''Hello!'''          NB. P2
'Hello!'
   'Hello!'              NB. and P3 prints Hello!
Hello!
algoritme hiu
sumber
0

Python 2.7: 75

def h(n):
 return "Hello"if n<1 else'print %s' % `h(n-1)`
print h(input())

Pertama kali bermain golf, tidak yakin apakah saya melakukannya dengan benar;

heo
sumber
2
Bukankah itu mengasumsikan bahwa definisi hjuga dikenal dalam program-program berikutnya? (Sehingga ini harus dijalankan dalam REPL atau sesuatu?)
Martin Ender
0

Clojure, 36 byte

(str(apply str(repeat 5\'))"Hello!")

Simbol

'something

mengevaluasi ke

something

Bangun simbol dengan 5 tanda kutip tunggal dan jalankan hasilnya sampai tidak ada tanda kutip.

Michael M.
sumber