Programm, das ein Programm ausgibt, das ein Programm ausgibt ... das "Hallo!"

8

Herausforderung

Schreiben Sie das kürzeste Programm P so, dass

  • P nimmt eine beliebige positive ganze Zahl n als Eingabe und gibt eine Programmzeichenfolge P 1 aus
  • Durch Ausführen von P 1 (ohne Eingabe) wird eine Programmzeichenfolge P 2 ausgegeben.

  • Durch Ausführen von P 2 (ohne Eingabe) wird eine Programmzeichenfolge P 3 ausgegeben.

  • ...

  • Das Ausführen von P n (ohne Eingabe) gibt genau "Hallo!" (ohne die Anführungszeichen).

Schematisch:

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

Kriterien

  • E / A erfolgt über stdin / stdout.
  • Die Programmlänge wird in Bytes gemessen.
  • Programme bestehen nur aus ASCII-druckbaren Zeichen.
  • Es dürfen keine Duplikate zwischen den Programmen P, P 1 , ..., P n vorhanden sein .

BEARBEITEN: Die Programme P, P 1 , ..., P n sind als Quellcode gedacht, und "Ausführen des Programms" bezieht sich auf die Verarbeitung, die die Ausgabe erzeugt (dh Interpretation, Kompilierung und Ausführung usw.).

res
quelle
1
Siehe auch
dmckee --- Ex-Moderator Kätzchen
@dmckee - Die Beziehung, falls vorhanden, scheint sehr abgelegen zu sein. Schematisch ist das Verhalten eines Quines wie P -> P und das Verhalten der verknüpften Programme wie P -> Q -> P ; aber hier ist das Verhalten wie P (n) -> ...--> Hallo! , wobei P nicht erforderlich ist, um einem der Ausgänge zu ähneln .
Res
1
Das ist keine Kritik, res, nur eine Anmerkung, dass Leute, die dieses Problem mögen, auch das andere mögen könnten.
dmckee --- Ex-Moderator Kätzchen
@dmckee - Guter Punkt, danke.
Res

Antworten:

10

Golfscript 39 14

~'Hello!'{`}@*

Beispiel:

Unter der Annahme, dass n = 4 ist und unser Programm P ist , sind dies die Schritte:

  1. Führen Sie P mit Parameter 4 aus . Der Ausgang ist "\"\\\"\\\\\\\"Hello!\\\\\\\"\\\"\""( P 1 )

  2. Ausführen von P 1 -Ausgängen "\"\\\"Hello!\\\"\""( P 2 )

  3. Ausführen von P 2 -Ausgängen "\"Hello!\""( P 3 )

  4. Ausführen von P 3 -Ausgängen "Hello!"( P 4 )

  5. Ausführen von P 4 -Ausgängen Hello!. Wenn Sie mir nicht vertrauen, folgen Sie diesem Link ☺.

Cristian Lupascu
quelle
1
Ich finde, dass sich Ihr P1, P2, P3, P4 wie erforderlich verhält, aber mit der Eingabe von stdin gibt Ihr P nicht P1 aus - stattdessen gibt es aus \'\\\'\\\\\\\'Hello!\\\\\\\'\\\'\'(dh es fehlen die äußeren Anführungszeichen), wenn ich es sowohl unter Linux als auch unter ausführe Win 7 (mit echo 4 | ...an einer Eingabeaufforderung). Irgendeine Idee, was das Problem sein könnte?
Res
@res Du hast recht; Das ist ein Mangel der von mir erstellten Golfscript-Testwebsite. Ich habe es geschafft, das durch Hinzufügen von drei Zeichen zu beheben, aber in der Zwischenzeit habe ich eine viel kürzere Version gefunden und meinen Beitrag bearbeitet.
Cristian Lupascu
@res Die korrekte Version des alten Ansatzes ist~''\(,{)2\?('\\'*}/]"'"*:z"'Hello!"z-1%"'"
Cristian Lupascu
Mit 14 Bytes beeindruckend! ... und schöne Website übrigens. (Es scheint, dass stdin simuliert werden kann, indem einem Programm vorangestellt wird ;"...", wobei ...die Eingabe ist. ZB ;"4"hätte das Problem des fehlenden Anführungszeichens oben aufgedeckt, während das einfache Voranstellen des Programms "4"dies nicht tut.) ...
res
@res Vielen Dank! Sie haben absolut Recht mit der Führung ;. Als ich das erste Programm schrieb, vergaß ich dies auf dem Weg, obwohl ich es war, der auf der Meta-Site darüber schrieb: meta.codegolf.stackexchange.com/a/521/3527
Cristian Lupascu
4

JavaScript, 58 Zeichen

function $(_){alert(_?$+'$('+--_+')':'Hello!')}$(prompt())
Kopieren
quelle
Wie funktioniert es?
Thepirat000
@ thepirat000 Wenn das Argument _0 ist, gibt es "Hallo!" aus, andernfalls gibt es die Funktionsdefinition aus und ruft mit _minus eins auf
Kopie
+1 für den Missbrauch von Regeln durch Verwendung eines Zählers, anstatt den Code zu verlängern ...
WallyWest
4

Perl ( 45 36)

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

Führen Sie mit perl -M5.010zu verwenden say.

Für n=1, Ausgänge say q(Hello!)
Für n=2, Ausgänge say q(say q(Hello!))
Für n=3, Ausgänge say q(say q(say q(Hello!)))
und so weiter.

Marinus
quelle
2

Python3, 66

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

Common Lisp, 68 Zeichen

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

Das einzig Unkomplizierte: Es generiert eine Programmebene mehr als nötig und wertet sie aus, da evalein Zeichen kürzer als ist print.

Kevin Reid
quelle
2

Common Lisp: 65

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

Diese Version ist kleiner als die vorhandene CL-Antwort. Wenn Ihr Lisp mit einem Stackoverflow krächzt, müssen Sie dies verwenden, 81 Bytes:

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

Ich weiß, dass ich zu spät zur Party komme und ich bin sicher, dass dies noch optimiert werden könnte.

Demonstration (Vorsicht, einige Online-REPLs funktionieren nicht richtig):

* #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!"
* 

Beachten Sie, dass:

  • Getestet mit SBCL 1.2.11.debian

  • Es gibt viele Warnungen, weil ich Dinge tue, die ernsthaft nicht getan werden sollen. Zum Glück werden alle Warnungen mit einem Semikolon gedruckt, sodass sie sowieso als Kommentare behandelt werden.

  • Die Duplizierung erfolgt, weil einer der Rückgabewert und eine tatsächliche Ausgabe ist. Wenn der Rückgabewert auch zählen würde, vereinfacht er sich auf 58 Bytes:#1=(SETF N(READ)(CADDR'#1#)(1- N)W(IF(= N 0)"Hello!"'#1#))

  • Ich weiß immer noch, dass ich zu spät zur Party komme

Mike Gebirge
quelle
1

Python 2.7, 57

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

Haskell, 62

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

Bash, 47 oder 12 (wenn ich Golfbash benutze)

Code:

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

Golfbash-Code:

R;n e Hello!

Vorheriger Code (49):

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

Verwenden:

Programm P erstellen

$ echo '<paste code here>' > P

$ chmod +x P

Beispiel

Machen Sie P1:

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

Machen Sie P2:

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

Machen Sie P3:

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

Machen Sie P4:

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

Führen Sie P4 aus:

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

Angenommen, ich erstelle eine neue Allzwecksprache namens Golfbash - ähnlich wie Golfscript - mit einigen nützlichen Befehlen wie diesen:

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.

Dann könnte ich folgendes schreiben:

R;n e Hello!

Das wäre legal, nicht wahr?

Philcolbourn
quelle
1
Das ist unhöflich. -1 für was?
Philcolbourn
+1. Ich denke, die Ablehnung war für Ihre erfundene Sprache, die speziell für diese Herausforderung zu sein scheint. Siehe meta.codegolf.stackexchange.com/questions/871/…
Cees Timmerman
Gut, aber ich habe es auch in Bash gemacht.
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
quelle
Wenn ich Ihr Programm starte, scheint es weder etwas von stdin noch etwas von stdout auszugeben.
Res
0

J - 31 char

Beachten Sie, dass J Zeichenfolgen im Pascal-Stil verwendet: 'It''s too easy!'

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

Erklärt:

  • ".1!:1]1 - Lesen Sie eine Zeile von stdin ein und konvertieren Sie sie in eine Zahl.
  • <:2^ - Nehmen Sie 2 hoch von dieser Zahl und dekrementieren Sie.
  • ''''#~ - Erstellen Sie eine Zeichenfolge mit so vielen Kopien des einfachen Anführungszeichens.
  • 'Hello!'(],,)- Fügen Sie diese Anführungszeichen vorne und hinten an Hello!.

Verwendungszweck:

   '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!
Algorithmushai
quelle
0

Python 2.7: 75

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

Beim ersten Golfen bin ich mir nicht sicher, ob ich es richtig mache

heo
quelle
2
Geht das nicht davon aus, dass die Definition von hauch in den nachfolgenden Programmen bekannt ist? (Damit dies in einer REPL oder so ausgeführt werden müsste?)
Martin Ender
0

Clojure, 36 Bytes

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

Symbol

'something

bewertet zu

something

Erstellen Sie ein Symbol mit 5 einfachen Anführungszeichen und führen Sie das Ergebnis aus, bis keine Anführungszeichen mehr vorhanden sind.

Michael M.
quelle