Ile razy będziesz musiał zagrać w golfa?

12

Aby sprostać temu wyzwaniu, musisz utworzyć program, który pobiera liczbę całkowitą xi wysyła swoje źródło xwiele razy.

Zasady

  • To jest codegolf, celem jest gra w golfa w programie, aby miał najmniejszą liczbę bajtów

  • Jeśli prześlesz funkcję, funkcja musi przyjąć xjako parametr i albo zwrócić lub wydrukować cały kod xwiele razy do STDOUT. Treść funkcji również nie może być pusta

  • W przypadku przesłania lambda nie jest wymagane przypisanie jej do zmiennej

  • Obowiązują standardowe ograniczenia luk .

  • Puste programy są zabronione

  • Twój program musi działać tylko wtedy, gdy xjest liczbą całkowitą większą lub równą 0

  • Twój program może również nie czytać bezpośrednio żadnej części kodu źródłowego

Dignissimus - Spammy
źródło
Ładne pierwsze pytanie
Bald Bantha
Czy może xbyć 0, czy możemy ograniczyć go do dodatnich liczb całkowitych?
mbomb007
Czy czytanie źródła naszej funkcji jest dozwolone?
Kudłaty
@ mbomb007, dokonałem edycji w celu wyjaśnienia zasad, xbyć może dowolna liczba całkowita większa lub równa 0
Dignissimus - Spammy
@ Shaggy, myślałem, że to standardowa luka, wygląda na to, że tak nie było.
Dokonałem

Odpowiedzi:

8

Python 2 , 50 bajtów

Zwróć uwagę na przecinek końcowy i znak nowej linii.

s='s=%r;print s%%s*input(),\n';print s%s*input(),

Wypróbuj online!

całkowicie ludzki
źródło
@ mbomb007 Załóżmy, że na końcu kodu jest nowa linia. Problem rozwiązany.
MD XF
OP stwierdził, że x może wynosić zero, w którym to przypadku nic nie powinno być drukowane, więc ta odpowiedź jest błędna.
mbomb007
@NickA Nie, drukuje nowy wiersz, który jest nieprawidłowy.
mbomb007
0 nie wydaje mi się drukować nowego wiersza, co przetestowano przy użyciu sys.stdout.write("2")po nim.
Ørjan Johansen
5

Japt , 14 bajtów

"iQ ²pU"iQ ²pU

Wypróbuj online!

Wyjaśnienie

"iQ ²pU"iQ ²pU
"iQ ²pU"       # Take this string
        iQ     # Prepend a quote
           ²   # Double the string (= source code)
            pU # Duplicate input times
Łukasz
źródło
4

RProgN 2 , 8 bajtów

{`{.*¶}{

W tym celu szczególnie dobrze sprawdza się pętla RProgN2 Loop!

{     } # A function literal
       {# Without a matching }, this loops back to the second instruction, which essentially runs the function. This is a bug, but it works to make the "Looping Quine".
 `{.    # Append the literal {, stringifying the function.
    *   # Multiply the stringified function by the input.
     ¶  # Terminate the program.

Wypróbuj online!

ATaco
źródło
4

Mathematica, 40 33 bajtów

Dzięki lanlock4 za oszczędność 7 bajtów!

StringRepeat[ToString[#0], #1] & 

Czysta funkcja przyjmująca nieujemną liczbę całkowitą. ToString[#0]jest standardowym sposobem na uzyskanie dostępu do definicji bieżącej funkcji czystej; StringRepeat[..., #1]łączy (wejściowe) kopie tego ciągu razem. Na przykład,

StringRepeat[ToString[#0], #1] & [2]

daje:

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 
Greg Martin
źródło
Czy możesz zamieścić przykład użycia? Bieganie, np , StringJoin @@ Table[ToString[#0], #1] & [2]wyskakuje mi błąd.
Julian Wolf
Naprawdę? To dokładne połączenie działa dla mnie. Używam Mathematica 11 ....
Greg Martin
Hmm, wciąż używam 10 (v10.0.1.0) - to może być to. Dla porównania, oto błąd, który otrzymuję:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf
Aha - odkrywam, że Table[x,5]powróci {x,x,x,x,x}w Mathematica 10.2 i późniejszych wersjach, ale w Mathematica 10.1 daje taki błąd (oczekuje Table[x,{5}]).
Greg Martin
Myślę, że można zastąpić StringJoin @@ Tablez StringRepeat.
Nie ma drzewa
3

dc , 31 bajtów

[[1-rd91Pn93P[dx]Pdx]s.rd0<.]dx

Wypróbuj online!

Wyjaśnienie:

[[1-rd91Pn93P[dx]Pdx]s.rd0<.]dx
[     91Pn93P[dx]P          ]dx  # Same old regular quine
 [1-rd            dx]s.rd0<.     # Loop until the counter is zero
eush77
źródło
3

Python 2, 70 bajtów

To rozwiązanie działa, jeśli x=0. Jest jeden końcowy znak nowej linii.

s='s=%r;exec"print%%r;"%%(s%%s)*input()';exec"print%r;"%(s%s)*input()

Wypróbuj online


Python 2, 60 bajtów (niepoprawny)

Zakłada się to x>=1, ale OP wyjaśnił, że xmoże to być zero. Jest jeden końcowy znak nowej linii.

s='s=%r;print(s%%s*input())[:-1]\n';print(s%s*input())[:-1]

Wypróbuj online

mbomb007
źródło
2

Niedociążenie , 12 bajtów

(a(:^)*~^):^

Wypróbuj online!

Podanie funkcji, ponieważ niedociążenie nie ma innego sposobu na przyjęcie danych wejściowych. (Łącze TIO pokazuje liczbę 4 podaną jako dane wejściowe i dodaje kod do wydruku wynikowego wyniku).

Jest to po prostu uniwersalny konstruktor quine (a(:^)*):^plus ~^(„zrób liczbę kopii równą argumentowi”).


źródło
1

Galaretka , 10 bajtów

“;⁾vṾẋɠ”vṾ

Wypróbuj online!

Jak to działa

“;⁾vṾẋɠ”vṾ  Main link. No arguments.

“;⁾vṾẋɠ”    Set the argument and the return value to the string ';⁾vṾẋɠ'.
         Ṿ  Uneval; yield '“;⁾vṾẋɠ”'.
        v   Eval ';⁾vṾẋɠ' with argument '“;⁾vṾẋɠ”'.
  ⁾vṾ           Yield 'vṾ'.
 ;              Concatenate '“;⁾vṾẋɠ”' and 'vṾ', yielding the source code.
      ɠ         Read an integer from STDIN.
     ẋ          Repeat the source code that many times.
Dennis
źródło
4
Wygląda to przepysznie, ale mama zawsze mówiła mi, żebym nie wkładał do ust dziwnie wyglądających rzeczy.
Mateen Ulhaq
1

Marka GNU , 49 bajtów

$(foreach ,$(shell seq $1),$(strip $(value $0))) 

Make połączy kopie pojedynczym odstępem, więc muszę dołączyć dodatkowy znak odstępu na końcu i usunąć go strippomiędzy, aby wiernie przestrzegać wymagań.

eush77
źródło
Wygląda na to, że czyta kod źródłowy, który jest zarówno domyślnie, jak i wyraźnie zabroniony.
Ørjan Johansen
@ ØrjanJohansen Nie, nie czyta źródła, tylko wartość zmiennej. Jest to dokładnie ta sama zasada, co w innych odpowiedziach, na przykład JS lub Python.
eush77
@ ØrjanJohansen Oh, rozumiem. $0w Make funkcji to nie to samo, co w powłokach. Jest to nazwa zmiennej, którą wywołuje funkcja. Zobacz gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77
Westchnij taki szary obszar. BTW, te Python nie robią tego.
Ørjan Johansen
@ ØrjanJohansen Powiedziałbym, że ta odpowiedź jest znacznie bliższa Pythonowi niż JS. Wszystko, co callrobimy, to podstawianie $0i stosowanie $1rzeczywistych parametrów - to prosta interpolacja ciągów, tak jak w Pythonie %.
eush77
1

Pyth, 17 bajtów

j*]jN*2]"j*]jN*2]

Wypróbuj online!

Trywialne rozszerzenie do dość znanego jN*2]"jN*2]quine, ale prawdopodobnie można go zagrać w golfa

klaskać
źródło
1

Betaload , 203 bajty

Dodano nowe linie dla jasności:

(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^

Dałem sobie ograniczenie, że musi czytać ze STDIN, a nie ze szczytu stosu, jak to zwykle bywało w przypadku niedociążenia. Użyłem również poprawnego, dziesiętnego wejścia, które stanowi większość kodu.

Wyjaśnienie:

Zawijam program w quine-wrapper: (a(:^)*i ):^. Oznacza to, że cały kod wewnątrz opakowania quine będzie miał kod źródłowy programu na dole stosu.

Aby przekonwertować cyfry na normalną liczbę kościelną, używam techniki zastępowania każdej cyfry kodem, aby pomnożyć przez 10 i dodać tę cyfrę:

0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*

Jest tu wiele powtórzeń, więc spakujmy go do podprogramu, który pobierze cyfrę Kościoła z góry stosu i użyje jej do skonstruowania „ciągu cyfr”:

:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*

Umieszczam to w nowym środowisku, aby można było szybko uzyskać do niego dostęp:

#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>

Teraz mogę utworzyć kod zastępczy dla R. Rwykorzystuje górne elementy stosu, aby utworzyć tabelę odnośników w celu zastąpienia ciągu STDIN kodem Betaload. Działa to tak:

()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R

Możemy jednak użyć podprogramu, który właśnie utworzyliśmy, aby wygenerować segmenty kodu:

(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...

Po Ruruchomieniu przekształci dane wejściowe w serię podprogramów, które tworzą cyfrę Kościoła. Kiedy ten podprogram jest wykonywany, tworzy ten numer kościelny na następnym elemencie na stosie (0, który został umieszczony wcześniej). Oznacza to, że później R^najwyższą wartością na stosie będzie liczba kościelna. Następnie ^jeszcze raz zastosujemy cyfrę Kościoła do ostatniego elementu na stosie (kodu źródłowego programu), aby uzyskać odpowiedź.

Ciekawostka: mam MD na to zgłoszenie od kilku miesięcy. Zatrzymałem je po niezrozumieniu pytania (którego nie mogę już znaleźć). Musiałem go wykopać z Kosza, aby opublikować tutaj.

Esolanging Fruit
źródło
1

Python 2 , 41 bajtów

_="input('_=%r;exec _'%_*input())";exec _

Wypróbuj online!

Czy wyjście trochę hacky używając inputzamiast print, ponieważ printma dziwny bug udziałem drukowania przełamane, gdy nie ma ... . Wyjście z błędem EOF.

Wyjaśnienie:

_="input('_=%r;exec _'%_*input())"; # Set _ to a string
exec _                              # Execute that string
input(                        )     # "print"
      '_=%r;exec _'%_               # The source code with _ formatted in
                     *input()       # Actual input many times
Jo King
źródło
0

Pyth, 13 bajtów

*jN*2]"*jN*2]

Zestaw testowy

Standardowa quina Pyth plus dwa *za powtórzenie.

isaacg
źródło
0

Perl, 48 bajtów

print"$_\47"x(2*pop)for'print"$_\47"x(2*pop)for'

\47jest ósemkową ucieczką dla pojedynczego cudzysłowu ( '). Jest interpretowany w podwójnych cudzysłowach ( "), ale nie w pojedynczych cudzysłowach.

Ponury
źródło
0

JavaScript ES6, 27 37 bajtów

_=>alert(`${f.name}=${f}`.repeat(_))

Edytować

+10 bajtów, jeśli f=powinno być również wyświetlone


f=

_=>alert(`${f.name}=${f}`.repeat(_))

f(2);

Weedoze
źródło
@Downvoter dlaczego?
Weedoze
@Kaiido Nie wiem .. Czy powinienem zachować f=?
Weedoze
Twój kod sam się odczytuje, domyślnie wywołując toStringfunkcję.
aebabis
@acbabis Wywołanie f.toString()lub fjest takie samo, ale nie wyświetla nazwy funkcji
Weedoze
Uważam, że @acbabis miał na myśli to, że narusza ostatni punkt wyzwania „Twój program może również nie odczytywać bezpośrednio żadnej części kodu źródłowego” - użycie ftego oznacza odniesienie do własnego źródła.
skyline3000
0

CJam , 20 12 bajtów

8 bajtów zaoszczędzonych dzięki Martinowi Enderowi

{"_~"+ri*}_~

Wypróbuj online!

Eksklanacja

{       e# Begin a block literal:
 "_~"+  e#  Add whatever's on the stack to the beginning of the array ['_', '~'].
 ri*    e#  Repeat the resulting array a number of times equal to the input.
}       e# Close the block. Push it on the stack.
_~      e# Copy it and run it.
Business Cat
źródło
0

PHP, 194 bajty

<?php $a="PD9waHAgJGE9IiMiOyRpPSRhcmd2WzFdO3doaWxlKCRpLS0pZWNobyBzdHJfcmVwbGFjZShjaHIoMzUpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=";$i=$argv[1];while($i--)echo str_replace(chr(35),$a,base64_decode($a));

Wypróbuj online!

W ogóle nie golfa, jak zwykle quiny b64.

Skidsdev
źródło
0

Idź , 257 254 bajtów

To mnie boli.

package main;import(."fmt";."strings";."strconv";."os");func main(){s:="package main;import(.\"fmt\";.\"strings\";.\"strconv\";.\"os\");func main(){s:=%q;n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}";n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}

Wypróbuj online!

całkowicie ludzki
źródło
0

Microscript II, 22 bajty:

"v{lqp}sN*h"v{lqp}sN*h

Microscript II, 20 bajtów (ale technicznie nieprawidłowy, ponieważ uzyskuje dostęp do kodu źródłowego bloku kodu):

{s""+`"~sN*"s`+}~sN*
SuperJedi224
źródło
0

C, 144 116 bajtów

i;main(a){for(i=getchar()-48;i--;)printf(a="i;main(a){for(i=getchar()-48;i--;)printf(a=%c%s%c,34,a,34);}",34,a,34);}
MD XF
źródło
0

Python 3, 69 bajtów

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)
MrGeek
źródło
0

05AB1E , 17 bajtów

0"D34çý×?"D34çý×?

Modyfikacja domyślnego 0"D34çý"D34çý przez dodanie ×?.

Wypróbuj online.

Wyjaśnienie:

0                   # Push 0 to the stack
                    #  STACK: [0]
 "D34çý×?"          # Push the string 'D34çý×?' to the stack
                    #  STACK: [0, 'D34çý×?']
          D         # Duplicate this string
                    #  STACK: [0, 'D34çý×?', 'D34çý×?']
           34ç      # Push '"' to the stack
                    #  STACK: [0, 'D34çý×?', 'D34çý×?', '"']
              ý     # Join the stack by this '"' delimiter
                    #  STACK: ['0"D34çý×?"D34çý×?']
               ×    # Repeat the string the (implicit) input amount of times
                    #  input = 2 → STACK: ['0"D34çý×?"D34çý×?0"D34çý×?"D34çý×?']
                ?   # Output to STDOUT without trailing newline
Kevin Cruijssen
źródło