Jeszcze jeden program i nie ma mnie!

21

Biorąc pod uwagę dodatni poziom zagnieżdżenia liczb całkowitych ni ciąg znaków sdrukowalnych ascii ( do ~, wypisuje program, który po uruchomieniu w tym samym języku, wypisuje program, który wypisuje program ... który wypisuje ciąg s.

nNależy wygenerować w sumie programy, z których wszystkie powinny być uruchomione w tym samym języku, co twoja odpowiedź.

Uwaga: możesz wyprowadzać programy lub funkcje - wszystko jest dozwolone domyślnie jako przesłanie.

Możesz wprowadzać sznaki zmiany znaczenia, w jaki sposób program lub funkcja w twoim języku zwykle wprowadza ciąg znaków.


Przykład

Na przykład podany n=1i s="recursion"program w języku Python 2 może wyświetlać:

print "recursion"

Uruchomienie tego spowoduje wyjście:

recursion

Biorąc pod uwagę n=2is = "PPCG", program Python 2 może wypisać:

print "print \"PPCG\" "

Uruchamianie tych wyjść:

print "PPCG"

Uruchamianie tych wyjść:

PPCG

Powiązane (+ inspiracja do tytułu): Jeszcze jeden LUL i nie ma mnie

Również powiązane (w piaskownicy - teraz usunięte, ale nadal można je oglądać z wystarczającą reputacją): Rekursja kodu źródłowego

Przypadki testowe

Upewnij się, że kod działa w następujących przypadkach testowych (jeden w wierszu):

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
źródło
1
Czytałem wyzwanie i było jak „hej, to wygląda bardzo znajomo…”, a potem zauważyłem twoje „ Także powiązane (w piaskownicy): Inspiracja kodem źródłowym ” do mojego pytania dotyczącego piaskownicy. :) Na razie zostawię moje pytanie, ale usunę je po kilku tygodniach. Twój jest w zasadzie taki sam, z wyjątkiem dodania parametru liczby całkowitej.
Kevin Cruijssen
1
Jak sugerowano tutaj , czy dozwolone jest zwracanie anonimowych funkcji zamiast programów?
Arnauld,
1
Czy „dodatnia liczba całkowita” obejmuje 0?
Felix Palmen
1
Czy z jakiegoś powodu wybrałeś program? Domyślnie jest to funkcja lub program? Czy dozwolone jest, aby funkcja drukowała funkcję?
Kevin Cruijssen
1
@StewieGriffin, ponieważ ucieczka w podwyrażenia lub programy zagnieżdżone może być problematyczna (a ktoś poprosił o cytowanie przypadków testowych w piaskownicy).
fireflame241

Odpowiedzi:

19

Galaretka , 2 bajty

Ṿ¡

Wypróbuj online!

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

hehe wbudował

HyperNeutrino
źródło
To jest zepsute, „cześć” produkuje cześć, a nie „cześć”
Tahg
10
Dane wejściowe @Tahg Jelly są automatycznie przetwarzane jako kod w języku Python, jeśli nie zgłosi błędu. Jeśli tak, to tylko ciąg znaków. Trzeba by zrobić, '"hi"'aby zobaczyć oczekiwany wynik
HyperNeutrino,
19

JavaScript (ES6), 47 44 bajtów

Zaoszczędź 3 bajty dzięki @HermanLauenstein

Pobiera dane wejściowe w składni curry (n)(s).

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

Przykład

f(2)('PPCG')

Wyjdzie:

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

Który wydrukuje:

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

Który wydrukuje:

'PPCG'

Próbny

Bardziej złożony przykład, w którym alert()został zastąpiony, aby wyniki pośrednie były drukowane na konsoli i automatycznie wykonywane.


Alternatywna wersja, 40 bajtów

Sugerowane przez @Shaggy

Ten zwraca anonimową funkcję zamiast pełnego programu.

n=>g=s=>`_=>atob("${btoa(--n?g(s):s)}")`
Arnauld
źródło
Czy możesz zwrócić anonimową funkcję zamiast używać alert? 41 bajtów
Kudłaty
@Shaggy Naprawdę nie wiem. Zapytałem OP.
Arnauld,
Jeśli nie, być może uda Ci się uciec z IIFE zamiast 45 bajtów.
Shaggy
-3 bajty przy użyciu curry: n=>g=s=>BTalert(atob("${btoa(--n?g(s):s)}"))BT(zamień BT na backsticks)
Herman L
@HermanLauenstein Thanks! :)
Arnauld
10

sh + coreutils, 31 bajtów

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

Pobiera njako parametr wiersza polecenia i sSTDIN.

Neil
źródło
8
Ten kod mówi: „Tak, zdecydowanie musisz mnie wykonać”.
RedClover,
Czy możesz dodać wyjaśnienie? Mam problem z wypracowaniem tego
JoshRagem
1
@JoshRagem yeswielokrotnie wypisuje swój wiersz poleceń, który jest exec sed 1d $0( $jest metaznakiem powłoki, więc należy go zacytować). sed $1qprzestaje drukować po $1(tj. n) wierszach. catnastępnie kopiuje ciąg wejściowy. Plik wynikowy jest shskryptem, który każe powłoce zastąpić się kopią sedparametrów 1di nazwą pliku skryptu. sednastępnie pomija pierwszy wiersz pliku i wypisuje resztę. Każdy skrypt ma jeden mniej exec sed 1d $0prefiksu, dopóki po nwykonaniu nie zostanie wydrukowane tylko oryginalne wejście.
Neil
5

Python 2 , 40 bajtów

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

Wypróbuj online!

-4 bajty dzięki xnor

HyperNeutrino
źródło
5

Haskell, 17 bajtów

Na dzień, w którym to piszę, jest to najkrótsza odpowiedź dla języka niezwiązanego z golfem .

Jest to funkcja, która przyjmuje siw ntej kolejności i zwraca wynik lub kod źródłowy wyrażenia, które po ocenie zwraca następny kod źródłowy.

(!!).iterate show

Argument, dlaczego to się liczy:

  1. Rozwiązania mogą być funkcjami.
  2. Ich wyjściami mogą być funkcje.
  3. Te funkcje nie mają parametrów.
  4. W Haskell, ponieważ jest on leniwy i wszystko jest curry, najbardziej naturalne - dla praktycznych celów programowania - definicja funkcji 0-parametrowej jest taka sama jak jej wynik; najbliższa alternatywa, funkcja 1-parametrowa, która ignoruje parametr, jest głupia.

Jeśli fpodano PPCGi 2jako jego parametry, wynikiem jest tekst "\"PPCG\""(pierwsza wygenerowana funkcja), który po ocenie zwraca tekst "PPCG"(druga generowana funkcja), a gdy jest oceniany, zwraca PPCG.

Dzięki Nimi dla sugerując skrócenie.

Kevin Reid
źródło
W Haskell istnieje istotne pytanie Meta dotyczące kwestii funkcji bez argumentów, choć nie zwróciło ono jeszcze tak dużej uwagi i wciąż ma otwarte pytania: codegolf.meta.stackexchange.com/q/12924/56433
Laikoni
3

APL (Dyalog) , 24 23 bajty

-1 dzięki ngn.

Jest to pełny program, który monituje, sa następnie wyświetla ni drukuje do STDOUT.

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

Wypróbuj online! (17 Deep case jest pomijany, ponieważ przekracza limit wyjściowy TIO - działa offline)

monit o s

 dają to (do rozdzielenia i )

''''{}⍣⎕ Pytaj ni zastosuj tę lambda za jednym cytatem jako lewy argument, że wiele razy. oznacza lewy argument (cytat) i oznacza prawy argument (tekst wejściowy):

⍵=⍺ Boolean, w którym tekst jest równy cytatowi

1+ Dodaj jeden

⍵/⍨ powtórz każdy znak argumentu odpowiednią liczbę razy

⍺, zrób wycenę

⍺,⍨ dołączyć wycenę

Działa to, ponieważ ciągi znaków w APL są 'rozdzielane, a pojedyncze cudzysłowy w ciągach znaków są podwajane, podczas gdy inne znaki nie wymagają ucieczki.


Dyalog APL jest również dostarczany z narzędziem ( ⎕SE.Dyalog.Utils.repObj), które generuje wyrażenie APL, które ocenia jego argument (podobnie jak nierówność Jelly ). Poniższy program jest zatem równoważny powyższemu, ale działa dla wszystkich tablic:

SE.Dyalog.Utils.repObj⍣⎕⊢⎕

Wypróbuj online!

Adám
źródło
Myślę, że APLX dopuszcza ciągi „podwójnie” oraz „pojedynczo cytowane”. Jeśli reszta tam działa, możesz zapisać bajt :) ngn / apl kiedyś, ale ostatnio usunąłem „”
ngn
Rozważ przekazanie cytatu jako. - co oszczędza (przynajmniej) bajt.
ngn
@ngn Dzięki, ale APLX nie ma plików dfns. NARS2000 ma zarówno cudzysłowy, jak i dfns, ale znaki kosztują po dwa bajty.
Adám
2

Firefox JavaScript, 41 35 bajtów

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

Firefox ma fajny uneval, który działa tak, jak to brzmi - nierówności danego obiektu, w tym przypadku - ciąg znaków.

dzaima
źródło
2

Java 8, 95 93 bajtów

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

-2 bajty dzięki @Lynn .

Ucieczka od znaków specjalnych jest tak irytująca w Javie ..

Wypróbuj tutaj i wypróbuj wynikową metodę tutaj .

Wyjaśnienie:

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 

Dodatkowe wyjaśnienie zastępowania wyrażenia regularnego:

.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

Skąd te wszystkie cięcia?

\   →  \\       // Escapes a single slash for the regex
\\  →  \\\\     // Escapes both regex-escaped slashes for the String
"   →  \"       // Escapes a double-quote for the String
Kevin Cruijssen
źródło
1
Nie sądzę, że musisz uciekać "w klasie wyrażeń regularnych, więc \\\\\"(pięć odwrotnych ukośników) powinno być w porządku.
Lynn
2

Niedociążenie , 11 bajtów

(a(S)*)~^^S

Wypróbuj online!

Dane wejściowe muszą zaczynać się od stosu, z liczbą na górze w postaci cyfr kościelnych . Nie wiem, czy jest to poprawna metoda wprowadzania danych, ale specyfikacja nie zawiera danych wejściowych, a umieszczanie danych wejściowych na górze stosu wydaje się być linkową metodą stosowaną w takich językach.

MegaTom
źródło
1

QuadR , 8 bajtów

Proste tłumaczenie odpowiedzi ngn .

Przyjmuje njako argument i sjako dane wejściowe.

^|'|$
'&

Wypróbuj online!

PCRE R EUmieãæ wszystkie przypadki

^|'|$ Początek linii LUB Cytat LUB Koniec linii

'& z cytatem i całym dopasowaniem

Argument określa, ile razy powtórzyć transformację.

Adám
źródło
ah, teraz wiem do czego służy ten język :)
ngn
1

R , 62 bajty

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

Wypróbuj online!

Nazwij to tak: f(n,s)następnie nkopie()

Nazwana funkcja; zwraca anonimową funkcję. Wszystko robi to zmodyfikować domyślne wartości formalsz f, pozwalając wynikające funkcja do wywołania (i wtedy wynik tego nazywa, nrazy). kiedy nosiągnie 0, wraca s.

R nie jest wcale taki zły w ucieczce! Używa stylu C ucieczki, więc po prostu trzeba wziąć wejście, wymienić "z \"i \z \\, a następnie owinąć w całość " ".

Giuseppe
źródło
0

Pyth, 21 bajtów

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

Wypróbuj tutaj.

Niestety funkcja rekurencyjna (nie pełny program jak wyżej) jest dłuższa (24 bajty):

M?GgtG++NsXHJ,N\\+L\\JNH
Erik the Outgolfer
źródło
0

APL (Dyalog Classic) , 19 bajtów

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

Wypróbuj online!

ngn
źródło
To bardzo sprytne. Próbowałem tego podejścia, ale nie myślałem o przygotowaniach.
Adám
Sprzedaj także to .
Adám
0

Rubin , 34 bajty

%pjest specyficzną dla Ruby flagą printf, która pobiera inspectwartość swojego argumentu, podobnie jak %rw Pythonie. $><<oznacza druk.

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

Wypróbuj online!

Wartość tuszu
źródło
0

Excel VBA (32-bit), 67 bajtów

Wersja ograniczona do 32-bitowej wersji Excel VBA, ponieważ 2^i ocenia bez błędów w 32-bitowym VBA, ale nie w 64-bitowym VBA

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe ni szakresy [A1]oraz [B1]wysyła anonimową funkcję, która po ocenie do samego terminala (po niteracjach) wyprowadza tylko sjako ten terminal

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

Przykładowe wejście / wyjście

[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
źródło