Kodunuzun ilk N karakterini yazdırın


21

NGiriş olarak pozitif bir tamsayı alan ve Nkodunuzun ilk karakterlerini basan bir program veya işlev yazmalısınız . Eğer Nsiz döngüsel olarak çıktı üretmesi kodunuzu devam etmelidir Kodunuzdaki uzunluğundan daha büyüktür.

Kaynak kodunuzu herhangi bir şekilde okumak ve dosyadan, stdio'dan vb. Okumak yasaktır.

Örnekler

(kodunuzun olduğu varsayılarak yourcode)

Giriş => Çıkış:

5=> yourc
10=> yourcodeyo
22=>yourcodeyourcodeyour

açıklama

Programınız en az 1 bayt uzunluğunda olmalıdır.


15
2000'inci golf golf mücadelesini gönderdiğiniz için tebrikler! :)
Martin Ender

3
Douglas Hofstadter bunu çok isterdi!
Luis Mendo,

1
@ MartinBüttner Aslında, 300'den fazla silinmiş [code-golf] sorusu var. Ama yeterince yakın;)
Doorknob

11
@ MartinBüttner Teşekkürler. Yuvarlak bir sayı kadar gitmek için sadece 48!
randomra

5
Belki de boş programların geçersiz olduğunu açıkça söylemenin zamanı geldi?
Martin Ender

Yanıtlar:



10

> <> , 49 bayt

'3d*}r0ff+0i:&0(?.~~a*&"0"-+60.&~:?!;1-&:o}&" "0.

Kodun yarısı girişi bir dizgiden int değerine dönüştürüyor. Bunun yerine STDIN'den okunan tek bir karakterin kod noktasını kullanmamıza izin verilirse, bu program 21 baytta çok daha kısa olacaktır:

'3d*}ri:?!;1-&:o}&60.

açıklama

Açıklama için ikinci programı kullanacağım.

'Dize ayrıştırmaya başlar ve kapanış teklifi bulunana kadar her karakteri iter. Çizginin geri kalanının hiçbir 'teklifi olmadığından, başlangıç ​​dışındaki her karakter 'yığının üzerine itilir.

Ancak> <> toroidal 2B bir dildir, bu yüzden satır bittikten sonra komut göstericisi tekrar başa döner, 'tekrar vurur ve string ayrıştırmayı durdurur . Sonuç olarak, ilk teklif hariç, gerekli her şeyi ittik, yani

3d*}ri:0=?;1-&:o}&60.

'ASCII 39, bu yüzden ilk teklifi iterek bastırıyoruz 3d* = 3*13 = 39. Daha sonra yığını sağa ( }) ve geriye doğru ( ) kaydırırız r:

.06&}o:&-1;?=0:ir}*d3'

Şimdi hepimiz baskıya başlamak için hazırız. ibir giriş karakterinde okur, ancak> <> karakterleri temelde tamsayılardır. İlk programda, ibasamaklı bir dizgiyi STDIN'den bir tamsayıya dönüştüren bir döngü ile değiştirilir.

Daha sonra ilk N karakterini yazdırmak için aşağıdaki döngüyü uygularız:

:?!;               If the top of the stack (N) is 0, then terminate
                   Otherwise...
1-                 Subtract 1 from N
&                  Move N to the register temporarily
:o                 Output the next char in the program
}                  Shift the stack right
&                  Put N back on the stack
60.                Repeat loop by jumping back to the first :

9

CJam, 34 17 16 bayt

Bu çok golf olabilir ..

{`"_~"+ri_@*<}_~

Kod genişletme :

{`"_~"+ri_@*<}_~
{            }_~      "Put this code block on stack, take a copy and execute the copy";
 `                    "When executed, this block will the top element on stack to a string";
  "_~"                "Then put this string on stack";
      +               "Concat it to the the previous string on stack which ` created";
       ri             "Read an integer from STDIN";
         _@           "Copy the integer and put the concatinated string on top of stack";
           *          "Repeat the string input number of times";
            <         "Take the first input number of characters from the repeated string";

Son olarak, yığındaki herhangi bir şey otomatik olarak STDOUT'a yazdırılır

Burada çevrimiçi deneyin


5

Python 2, 117 bayt

b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a("b=input();a=lambda x:(b*(2*(x+chr(34))+')'))[:b];print a(")

Yaşam protip: yürütme list(itertools.cycle(x)). Bazı nedenlerden dolayı, neden olduğunu yorumlayamıyorum, tercümanı çökertiyor.


1
itertools.cycle()sonsuz bir jeneratördür, bu nedenle bilgisayarınızda sonsuz bir hafıza yoksa, sorun
yaşayacaksınız

5

JavaScript (ES6), 65 52 50 47 41 39

q=n=>('q='+q).repeat(n/39+1).slice(0,n)

repeat()Kodu klonlamak için ES6'yı kullanın, ardından dilimleyin. Kodlanmış bir uzunluk kullanır.


Eski versiyon (50):

q=n=>n>(l=(t='q='+q).length)?t+q(n-l):t.slice(0,n)

qTek bir parametre alarak bir işlev oluşturur .

İşlev metnini sıralar ve nmetnin uzunluğundan büyükse , işlevi tekrar tekrar çağırır . Aksi takdirde, metnin bir alt dilini döndürür.

ES6 olmayan sürüm (65):

function q(n){return t=q+'',l=t.length,n>l?t+q(n-l):t.slice(0,n)}

1
.repeatdöngüsel gereksinimler için ES6'lardan ziyade özyinelemeyi kullanmak dahidir.
Jacob

1
Aslında, kullanmak repeat()bana bir demet kesmemi sağladı gibi görünüyor , bu yüzden bunu kullandım.
Scimonster

Bunu görmedim. Neyse - bu çok güzel bir cevap
Jacob

neden /39+1? neden sadece yeterince uzun bir ip bırakmıyorsun?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)firefox'ta iyi çalışıyor
l4m2

5

J - 24 karakter

Tek bir pozitif tamsayı argümanı alır ve bir dize tükürür.

($],quote)&'($],quote)&'

J kendi kendine referans numaralarına sahip değil, bu yüzden sadece en kısa sürede yapıyoruz. Patlama ile açıklanacak:

  ],quote                 NB. right arg prepended to quotation of right arg (quine)
 $                        NB. cyclically take left-arg characters from that
(        )&'($],quote)&'  NB. preload right arg with  ($],quote)&

J'deki dyadiç $operatörü, solda belirtilen boyutlara uyacak şekilde döngüsel olarak sağ argümanından öğeleri alır. Boyut tek bir sayı olduğunda, bu basit bir 1B karakter listesidir, bu yüzden soruyu tam olarak ne istiyorsak onu yaparız.

Tryj.tk'te kendiniz deneyin .


quoteFiilin genel amacı nedir ?
randomra

@randomra Standart kütüphanedeki tanımı ''''&,@(,&'''')@(#~ >:@(=&''''))ya da İngilizce'dir, "herhangi bir 'karakteri ikiye katlayın , sonra bir tane ekleyin ve sonuna ekleyin." J, Ada benzeri dize değişmezleri kullanır, bu da dizgeden kaçar.
algorithmshark

4

k2 - 7 karakter

{x#$_f}

Türkçe'de bu, xtanımı " xtake string self" olan bağımsız değişkenli bir fonksiyondur .

  • Öz (isim _f) şu anda yürüten en içteki işlevdir. İşte fonksiyon {x#$_f}.
  • String (monadic $) argümanını bir dizgeye dönüştürür. Bir işlev durumunda, işlevin orijinal tanımına sahip bir dize oluşturur.
  • Take (dyadic #) listeden left-arg öğelerini right-arg'de alır . Bir dizgede, öğeler karakterdir, yani tam olarak istediğimiz şeyi yapıyor.

Bu olmaz herhangi bir argüman olarak kullanmak için tüm girişimleri yemek kara delikler oluşturmak gibi görünüyor, çünkü açık kaynak Kona çalışır. Uygun k3 anlambiliminden emin değilim, ama muhtemelen pek kinder değiller.

Q'da, bu {x#string .z.s}ve k4'te {x#2_$.z.s}. 2_Sadece bir annenin sevebileceği nedenlerden ötürü k4'e iki ilk karakteri bırakmak zorundayız .


3

Ruby, 66 64 63 bayt

eval s=%q(puts"eval s=%q(#{s})".chars.cycle.take(gets.to_i)*'')

Aynı şekilde arama yapmaktan kaçınmak için bir işlev kullanmak getsbiraz daha uzundur (81 bytes):

def f(i);eval s=%q(puts"def f(i);eval s=%q(#{s});end".chars.cycle.take(i)*'');end

Aynı lamda sürümleri 69 ve 65 bayt:

l=->i{eval s=%q(puts"l=->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}
->i{eval s=%q(puts"->i{eval s=%q(#{s})}".chars.cycle.take(i)*'')}

1
.cycletemiz, bunu hatırlamak zorundayım. :) Muhtemelen kısaltabilir .joiniçin *''.
Martin Ender

String#formatEnterpolasyon yerine birkaç karakter kaydedebilirsiniz :eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero

3

Mathematica, 65 bayt

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & 

Bunu takip eden de dahil olmak üzere uygun bir sırt yeri yapmak için tüm alanlar gereklidir. Bu, aşağıdaki gibi kullanabileceğiniz saf bir fonksiyondur:

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & [75]

hangi yazdırır

Print[StringTake[StringJoin @@ Table[ToString[#0], {#1}], #1]] & Print[Stri

Maalesef, ToStringbir işleve başvurmak , işleve tam olarak girme şeklinizi vermez, bu nedenle, boşlukları kaldırarak #1ve# işlev çağrıları için önek notasyonu kullanarak veya kısaltamam.


"kısaltılması #için #1"?
undergroundmonorail,

Diğer taraftan @ undergroundmonorail, teşekkürler
Martin Ender

3

MATLAB, 319 141 karakter

Orijinalinden birkaç bayt sıkmayı başardım:

function d=g(n);d='gvodujpo!e>h)o*<e>(<e>\e)2;2:*.2-e-e)2:;foe*.2^<e>e)2,npe)1;o.2-252**<';d=[d(1:19)-1,d,d(19:end)-1];d=d(1+mod(0:n-1,141));

Mükemmel cevap...! Nasıl çalıştığını bilmiyorum :-)
Luis Mendo,

3

JavaScript, 34 bayt

f=n=>n&&('f='+f+f(n-1)).slice(0,n)

Kod nzamanlarını tekrarlayan özyinelemeli işlev , ardından sonucu dilimler.


3

Japt , 2 bayt

îî

Çevrimiçi deneyin!

Birincisi î, bir parametreyi alan ve uzunluğu tekrar eden bir sayı yöntemidir n. Çünkü bu ilk yöntemdir, ngirdi haline gelir. İkinciî bir dizgenin içine atılır ve tekrarlanır.

Bu, şunları aktarır:

n.î("î") -> Tekrarla "î" ulaşana kadarn

8 byte çözüm

îQi"îQi"

Çevrimiçi deneyin!

îQi"îQi" nakli n.î(Qi"îQi")

n.î(Qi"îQi")
      "îQi"    // String "îQi"          -> îQi
    Qi         // Insert "              -> îQi"
n.î            // Repeated to length n  -> îQi"îQi"îQi"  (n=12)

1
Sadeliği güzel!
Shaggy

2

R, 203 bayt

N = 203 olduğunda kod tamamen yazdırılır.

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str)))})(203)

N = 50 olduğunda kod kendi kendini düzenler.

(f <- function(N){
str <- paste0("(f <- function(N

N = 300 olduğunda kod kısmen kendini tekrar eder.

(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\n"), ")}(", N, ")")
cat(rep(str, floor(N/nchar(str))), sep = "")
cat(substr(str, 1, N%%nchar(str))))}(300)(f <- function(N){
str <- paste0("(f <- function(N)", paste0(as.character(body(f)), collapse = "\

Bunu bir deneyin:(f=function(N){s=paste0("(f=",paste0(capture.output(f),collapse=""),")");cat(rep(s,N%/%nchar(s)),substr(s,1,N%%nchar(s)),sep="")})(200)
Thomas

2

Matlab (57)

function s=f(n);s=evalc('type f');s=s(mod(1:n,nnz(s))+1);

Son satırdaki 1(yerine 0) ilk dizinin nedeni Matlab'ın işlevinin typekaldırılması gereken bir ilk satır beslemesi getirmesidir . Dennis'e düzeltme (son dizini) ve önerisi için ( nnzdaha kısa ) için teşekkür ederiz numel.


Korkarım bu beklediğim şeyi yapmıyor (f (4) 'eğlenceli' döndürüyor), iyi haber şu ki 2 karakter kaydederek düzeltebilirsiniz. (kaldırın -1). - Ben de dışarı ikinci newline ve takas kaldırmak düşünüyorum numeliçin nnz.
Dennis Jaheruddin

@Dennis Bu iki fikir için teşekkürler! Her ikisini de dahil etmek için düzenleme yaptım
Luis Mendo

Hım, buzzkill olmak istemiyorum, ancak type fparça gereklilikle çakışmıyor Kaynak kodunuzu herhangi bir şekilde okumak ve dosyadan, stdio'dan, vs. okumaktan izin verilmedi mi?
knedlsepp,

@ knedlsepp bence haklısın. Ben de bu şüpheyi yaşadım. typemuhtemelen sabit diske erişir. Cevabı çıkarmam gerektiğini mi düşünüyorsun?
Luis Mendo,

@LuisMendo: Kimsenin gerçekten zihinle olduğunu sanmıyorum. :-) Daha önce birkaç kez buna benzer bir keki üretemediğim için dün bu problemi çözmek istedim. Ve tabii ki bir Matlab çözümü olup olmadığını kontrol etmem gerekti. :-) Sonunda bu, nihayet bir çözüm üretecek kadar derinlere inmek için bana yeterli motivasyon sağladı. (Bu modarada -ing fikrinizi çaldım .)
knedlsepp

2

Unary (1-8 sürümü) , 23855 bayt

'1'de bir girdi olarak girdi alır ve kod 23855' 1 'dir ( ,[.,]).


1
Bu da hangi beyincik anlamına geliyor?
DJMcMayhem

@DJMcMayhem Bir kedi
l4m2

Şimdi unary girişinin mantıklı olduğu bir dil bulun ve bazı 1-char programlarının cat yapmak
l4m2

2

Japt , 40 28 bayt


"îR+Q+V+Q+R+V"
îR+Q+V+Q+R+V

İlk kez bir yazı yazma, bu yüzden muhtemelen biraz kısaltılabilir. Öte yandan, işe yaradığı için çok mutluyum.

Kasıtlı olarak öne çıkan yeni satır, ikinci satır veridir ve geri kalanı verileri açar, daha sonra sonuçtaki dizgenin girişine eşit uzunluğa ulaşana kadar tekrar eder.

Oliver sayesinde 12 bayt boğuldu .

Çevrimiçi deneyin!


Güzel :) Eğer değiştirebilir tTUile ¯Uve kullanabileceğiniz îyerine pöne doğru hareket ettirerek: Çevrimiçi Deneyin
Oliver

İkinci düşüncede, onu kesmeniz gerekmiyor. îR+Q+V+Q+R+Viyi çalışması gerekir.
Oliver,

@Oliver Çok zekice, bilmiyorum î, çok kullanışlı. Çok teşekkürler!
Nit

Ben quines ile çok iyi değilim ya ama bence bu 24 byte için çalışmalıdır.
Shaggy

1

C ++, 305

int L=305;string s="int main(){string t=\"string s=\";int n;cin>>n;t+=s;t+=\"\";\";t+=s;while(n>0){if(n>L){cout<<t;n-=L;}else{cout<<t.substr(0,n);}return 0;}";
int main(){string t="int L=305;string s=\"";int n;cin>>n;t+=s;t+="\";";t+=s;while(n>0){if(n>L){cout<<t;}else{cout<<t.substr(0,n);}n-=L;}return 0;}

Açıklama Escape karakterinden başka diğer tüm karakterler basılır. Ana yöntem s dizgesinin içindedir ve ana dizgenin tamamı dize inşa edilir ve stdout'a basılır.



1

Hoon , 185 bayt

=/(f "=/(f k |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))" |=(n=@ =+((trim 5 f) `tape`(scag n `tape`(zing (reap n :(weld p <f> (slag 1 q))))))))

Set fbir kaset olarak programın koduna ama kendisi için "k" ile. Kaseti karakter 5'e ayarlayarak değişkenleri ayarlayın [p=left q=right]. Dizeleri p, orijinal dizgiyi fve ilk karakterden sonraki her şeyi bir araya getirin q. Bu dize nzamanlarını tekrarlayın , ardından ilkn karakterlerini döndürün.

Bunu yapmak Hoon'un stdlib'i tarafından biçimlendirme işlevine ya da bul ve değiştir işlevine sahip olmamaktan biraz rahatsız oldu ... Ayrıca, neden sonradan bilgi almamız gerektiğinden sonra neden başka bir oyuncuya ihtiyaç duyduğumuzdan da emin değilim scag. O zaman o gider.




1

Gol><>, 12 bytes

"r2ssIFLko|;

Try it online!

How it works

"r2ssIFLko|;

"..."   Push the chars in reverse order
r2ss    Reverse the stack, then push `"`
IF...|  Input n, and repeat the following n times...
  L     Push the loop counter (0 to n-1)
   k    Pop x and copy x-th from the top
    o   Pop and print as char
;       Halt

k can wrap any number of times, so we don't need to duplicate the whole stack depending on the input.


1

SmileBASIC, 106 66 bytes

INPUT N?MID$(("+CHR$(34))*3,23,N)INPUT N?MID$(("+CHR$(34))*N,23,N)

0

KSFTgolf - 4 chars, 6 bytes

KSFTgolf if a language I've been attempting to design for code golf. I've been changing it a lot, so this probably shouldn't actually count.

☃\@2

What language is this ? Any links ? Spec ? explanation ..
Optimizer

@Optimizer Ah, right. I forgot about that. It's a language I've been designing for code golf. This is finally a challenge where (if I fix all the bugs) it could actually win.
KSFT

1
Moreover, as far as I can see, the language was created like 10 minutes back, so technically, this is a non-competing answer :) . Also, I suppose this is the block corresponding to your code, which totally looks like something that has been specifically done for this challenge (as there are no other unicode based code blocks in your whole file).
Optimizer

@Optimizer That instruction was actually in the language before (although a commit that changed it slightly was pushed after the challenge was posted), which was created a few days ago. Because I don't think this would work in the version of the language that was public when the challenge was posted, though, I don't think this answer should actually count, as I stated in my answer.
KSFT

4
Do you want to build a snowman?
flawr


0

J, 41 Bytes

Now that was a brain teaser!

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

Explanation:

((,quote,')$~'"_)'((,quote,'')$~''"_)')$~  | Expression taking 1 argument
                                       $~  | Reshape left argument to fit right, taking cyclically.
(                                     )    | One large expression that evaluates to a string
                 '((,quote,'')$~''"_)'     | String literal containing the code to the left of it
 (,quote,'$)~'"_)                          | A 4-Hook:
         '$)~'"_                           | The string '$)~'
   quote,                                  | Appended to the quoted version of the string
  ,                                        | Appended to the raw string

Examples:

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 10
((,quote,'

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 20
((,quote,')$~'"_)'((

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 30
((,quote,')$~'"_)'((,quote,'')

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 41
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~

   ((,quote,')$~'"_)'((,quote,'')$~''"_)')$~ 50
((,quote,')$~'"_)'((,quote,'')$~''"_)')$~((,quote,


0

Java 10, 193 176 bytes

n->{var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}

Explanation:

Try it online.

n->{                       // Method with integer parameter and String return-type
  var s="n->{var s=%c%s%1$c;s=s.format(s,34,s);for(int i=n;i>0;i/=176)s+=s;return s.substring(0,n);}";
                           //  Unformatted source code
  s=s.format(s,34,s);      //  Create the formatted quine
  for(int i=n;i>0;         //  Loop `i` as long as it's not 0
      ;                    //    After every iteration:
       i/=176)             //     int-divide `i` by the hardcoded length of the source code
    s+=s;                  //   Exponentially enlarge the source code
  return s.substring(0,n);}//  Return the first `n` characters of the source code

-part:

  • The var s contains the unformatted source code.
  • %s is used to input this String into itself with the s.format(...).
  • %c, %1$c and the 34 are used to format the double-quotes.
  • s.format(s,34,s) puts it all together.

Challenge part:

  • for(int i=n;i>n;i/=176) loops ceil(n/176) times, where 176 is the length of the source code.
  • s+=s; exponentially increases the size of the source code String. (ab becomes abab; abab becomes abababab; abababab becomes abababababababab; etc.)
  • s.subtring(0,n); takes the first n characters of the String.


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.