Kaç kez golf oynamak zorunda kalacaksın?


12

Bu zorluk için, bir tamsayı alan xve kaynağını xbirçok kez çıkaran bir program oluşturmalısınız .

kurallar

  • Bu codegolf, amaç en az bayt miktarına sahip olmak için programınıza golf yapmak

  • Bir işlev gönderirseniz, işlev xparametre olarak almalı ve kodunuzun tamamını xSTDOUT'a birçok kez döndürmeli veya yazdırmalıdır . İşlev gövdesi de boş olmamalıdır

  • Bir lambda gönderirseniz, bir değişkene atamanız gerekmez

  • Standart boşluk deliği kısıtlamaları geçerlidir.

  • Boş programlar yasaktır

  • Programınızın yalnızca x0'dan büyük veya 0'a eşit bir tamsayı olması durumunda çalışması gerekir

  • Programınız kaynak kodunun herhangi bir bölümünü doğrudan okumaz


Güzel bir ilk soru
Bald Bantha 18:17

Can xolmak 0veya bunun pozitif tamsayılar için kısıtlayabilirsiniz?
mbomb007

İşlevimizin kaynağını okumaya izin veriliyor mu?
Shaggy

@ mbomb007, kuralları açıklığa kavuşturmak için bir düzenleme yaptım, xbelki 0'dan büyük veya 0'a eşit herhangi bir tam sayı
Dignissimus - Spammy

@Shaggy, bunun standart bir boşluk olduğunu düşündüm, sanki değilmiş gibi görünüyor. Bir programın kaynak kodunun herhangi bir bölümünü okumadığını açıkça belirtmek için soruda bir düzenleme yaptım
Dignissimus - Spammy 18:07

Yanıtlar:


8

Python 2 , 50 bayt

Sondaki virgül ve satırsonuna dikkat edin.

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

Çevrimiçi deneyin!


@ mbomb007 Kodun sonunda yeni bir satır olduğunu varsayalım. Sorun çözüldü.
MD XF

OP, x'in sıfır olabileceğini, bu durumda hiçbir şey basılmaması gerektiğini söyledi, bu yüzden bu cevap yanlış.
mbomb007

@NickA Hayır, yanlış bir yeni satır yazdırır.
mbomb007

0, yeni bir satır yazdırıyor gibi görünmüyor sys.stdout.write("2").
Ørjan Johansen

5

Japt , 14 bayt

"iQ ²pU"iQ ²pU

Çevrimiçi deneyin!

açıklama

"iQ ²pU"iQ ²pU
"iQ ²pU"       # Take this string
        iQ     # Prepend a quote
           ²   # Double the string (= source code)
            pU # Duplicate input times

4

RProgN 2 , 8 bayt

{`{.*¶}{

RProgN2 Loop quine bunun için özellikle iyi çalışır!

{     } # 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.

Çevrimiçi deneyin!


4

Mathematica, 40 33 bayt

7 bayt tasarruf sağladığı için lanlock4'e teşekkürler!

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

Negatif olmayan bir tamsayı argümanı alan saf işlev. ToString[#0]geçerli saf işlevin tanımına erişmenin standart Mathematica yoludur; StringRepeat[..., #1]bu dizenin kopyalarını bir araya getirir (girdi). Örneğin,

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

verim:

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

Bir kullanım örneği gönderebilir misiniz? Koşmak, örneğin , StringJoin @@ Table[ToString[#0], #1] & [2]bana bir hata veriyor.
Julian Wolf

Gerçekten mi? Bu çağrı benim için işe yarıyor. Mathematica 11 kullanıyorum ....
Greg Martin

Hmm, hala 10 kullanıyorum (v10.0.1.0) - bu olabilir. Referans olarak, aldığım hata:Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Aha — Mathematica 10.2 ve ötesinde Table[x,5]geri döneceğini keşfediyorum {x,x,x,x,x}, ancak Mathematica 10.1'de böyle bir hata veriyor (beklediği gibi Table[x,{5}]).
Greg Martin

Sana yerini alabilir mi StringJoin @@ Tablesahip StringRepeat.
Değil bir ağaç


3

dc , 31 bayt

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

Çevrimiçi deneyin!

Açıklama:

[[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

3

Python 2,70 bayt

Bu çözüm eğer çalışır x=0. Tek bir son satır var.

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

Çevrimiçi deneyin


Python 2, 60 bayt (geçersiz)

Bu x>=1, ancak OP'nin xsıfır olabileceğini açıkladı. Tek bir son satır var.

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

Çevrimiçi deneyin


2

Düşük yük , 12 bayt

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

Çevrimiçi deneyin!

İşlev gönderme, çünkü Underload giriş almak için başka bir yol yoktur. (TIO bağlantısı giriş olarak verilen 4 sayısını gösterir ve elde edilen çıktıyı yazdırmak için kod ekler).

Bu sadece evrensel bir kine kurucusudur (a(:^)*):^, artı ~^("argümana eşit sayıda kopya oluştur").



1

Jöle , 10 bayt

“;⁾vṾẋɠ”vṾ

Çevrimiçi deneyin!

Nasıl çalışır

“;⁾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.

4
Bu lezzetli görünüyor, ama annem bana her zaman garip görünen şeyleri ağzıma sokmamamı söyledi.
Mateen Ulhaq

1

GNU Marka , 49 bayt

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

Make, kopyaları tek bir boşlukla birleştirecek, bu yüzden sonuna ek boşluk karakteri eklemeliyim stripve gereksinimi sadakatle takip etmek için arada bir ile kaldırmalıyım .


Bu, hem varsayılan hem de açıkça yasak olan kaynak kodunu okuyor gibi görünüyor.
Ørjan Johansen

@ ØrjanJohansen Hayır, kaynağı okumuyor, değişken bir değer okuyor. Diğer cevaplardakiyle aynı prensiptir, örneğin JS veya Python.
eush77

@ ØrjanJohansen Oh, anlıyorum. $0Make fonksiyonları kabuklarda olduğu gibi değildir. İşlevin adı verilen değişkenin adıdır. Bkz. Gnu.org/savannah-checkouts/gnu/make/manual/html_node/…
eush77

Böyle gri bir alanı içinize çekin . BTW, Python olanlar bunu yapmaz .
Ørjan Johansen

@ ØrjanJohansen Bu cevabın Python'a JS'den çok daha yakın olduğunu söyleyebilirim. Tek callyapmanız gereken yerine koymak $0ve $1gerçek parametreler - Python'lar gibi basit dize enterpolasyonu %.
eush77

1

Pyth, 17 bayt

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

Çevrimiçi deneyin!

Oldukça iyi bilinen jN*2]"jN*2]kine için önemsiz uzantısı , ancak muhtemelen golf edilebilir


1

Beta yükü , 203 bayt

Netlik için yeni satırlar eklendi:

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

Kendime, tipik olarak bir Düşük Yük cevabı gibi, yığının tepesinden ziyade STDIN'den okuması gereken kısıtlamayı verdim. Ayrıca, kodun çoğunu oluşturan uygun, ondalık girdi kullandım.

Açıklama:

Programı bir sarmalayıcıya sarıyorum: (a(:^)*ve ):^. Bu, sarma sarmalayıcısının içindeki tüm kodun, programın kaynak kodunu yığının altında olacağı anlamına gelir.

Basamakları normal bir Kilise rakamına dönüştürmek için, 10 ile çarpmak ve bu rakamı eklemek için her basamağı kodla değiştirme tekniğini kullanıyorum:

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

Burada çok fazla tekrar var, bu yüzden onu yığının en üstünden bir Kilise rakamı alacak ve "rakam dizesini" oluşturmak için kullanacağız bir alt programa paketleyelim:

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

Hızlı bir şekilde erişilebilir olması için bunu yeni bir ortama koydum:

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

Şimdi için yedek kod oluşturabilirim R. RSTDIN'den bir dizeyi Betaload koduyla değiştirmek için bir arama tablosu oluşturmak üzere yığının üst öğelerini kullanır. Şöyle çalışır:

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

Bununla birlikte, kod segmentlerini oluşturmak için az önce yaptığımız alt programı kullanabiliriz:

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

Ne zaman Rçalıştırılır, bu yapı bir kilise rakamı yukarı alt programların bir dizi girdi değiştirecek. Bu alt program yürütüldüğünde, yığındaki bir sonraki öğede (daha önce yerleştirilmiş olan 0) Kilise numarasını oluşturur. Bu R^, yığındaki en yüksek değerin Kilise sayısı olacağı anlamına gelir . Daha sonra ^cevabı almak için kilisenin rakamını yığındaki son elemana (programın kaynak kodu) uygulamak için bir kez daha.

Eğlenceli gerçek: Birkaç aydır bu başvuru için MD aldım. Bir soruyu yanlış anladıktan sonra sakladım (artık bulamıyorum). Buraya göndermek için Geri Dönüşüm Kutusu'ndan kazmak zorunda kaldım.



1

Python 2 , 41 bayt

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

Çevrimiçi deneyin!

inputBunun yerine kullanarak biraz hileli bir çıktı var print, çünkü gerekmediğiprint zaman bir yeni satır yazdırmayı içeren garip bir hata var . EOF hatası ile çıkar.

Açıklama:

_="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



0

Perl, 48 bayt

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

\47tek bir alıntı için sekizli kaçıştır ( '). Çift tırnak ( ") içinde yorumlanır , ancak tek tırnak içinde yorumlanmaz.


0

Javascript ES6, 27 37 bayt

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

Düzenle

f=Ayrıca görüntülenmesi gerekiyorsa +10 bayt


f=

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

f(2);


@Downvoter neden?
Weedoze

@Kaiido Bilmiyorum .. Saklamalı mıyım f=?
Weedoze

Kodunuz, toStringişlevi dolaylı olarak çağırarak kendisini okuyor .
aebabis

@acbabis Çağırıyor f.toString()ya fda aynı, ancak işlev adını göstermiyor
Weedoze

@Acbabis'in ne demek istediğinin, "Programınız kaynak kodunun herhangi bir bölümünü doğrudan okumuyor olabilir" sorusunun son noktasını ihlal ettiğine inanıyorum - fbu yolu kullanmak kendi kaynağına atıfta bulunuyor.
skyline3000

0

CJam , 20 12 bayt

Martin Ender sayesinde 8 bayt kurtardı

{"_~"+ri*}_~

Çevrimiçi deneyin!

Exaplanation

{       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.

0

PHP, 194 bayt

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

Çevrimiçi deneyin!

Golf değil, b64 quines olma eğilimindedir.


0

Git , 257254 bayt

Bu beni acıtıyor.

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

Çevrimiçi deneyin!


0

Microscript II, 22 bayt:

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

Microscript II, 20 bayt (ancak bir kod bloğunun kaynak koduna eriştiği için teknik olarak geçersiz):

{s""+`"~sN*"s`+}~sN*

0

C, 144 116 bayt

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);}

0

Python 3, 69 Bayt

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)


0

05AB1E , 17 bayt

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

Ekleyerek varsayılan .0"D34çý"D34çý×?

Çevrimiçi deneyin.

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.