Cetak N karakter pertama dari kode Anda


21

Anda harus menulis program atau fungsi yang menerima bilangan bulat positif Nsebagai input dan mencetak Nkarakter pertama dari kode Anda. Jika Nlebih besar dari panjang kode Anda, Anda harus melanjutkan menampilkan kode Anda secara siklis.

Membaca kode sumber Anda dengan cara apa pun dan membaca dari file, stdio, dll. Tidak diizinkan.

Contohnya

(dengan asumsi kode Anda adalah yourcode)

Input => Output:

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

Klarifikasi

Panjang program Anda minimal 1 byte.


15
Selamat telah memposting tantangan golf kode 2000! :)
Martin Ender

3
Douglas Hofstadter akan menyukai ini!
Luis Mendo

1
@ MartinBüttner Sebenarnya, ada lebih dari 300 pertanyaan [kode-golf] yang dihapus. Tapi cukup dekat;)
Gagang pintu

11
@ MartinBüttner Terima kasih. Hanya 48 untuk pergi sampai angka bulat!
randomra

5
Mungkin sudah waktunya Anda sebutkan secara eksplisit bahwa program kosong tidak valid?
Martin Ender

Jawaban:



10

> <> , 49 byte

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

Setengah kode mengkonversi input dari string ke int. Jika kita diperbolehkan menggunakan titik kode dari char tunggal yang dibaca dari STDIN, maka program ini akan jauh lebih pendek dengan 21 byte:

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

Penjelasan

Saya akan menggunakan program kedua untuk penjelasannya.

'mulai string parsing, mendorong setiap char hingga kutipan penutupan ditemukan. Karena sisa baris tidak memiliki 'kuotasi, setiap karakter kecuali inisial 'didorong ke stack.

Tapi> <> adalah bahasa 2D toroidal, jadi setelah baris selesai pointer instruksi kembali ke awal, memukul 'lagi dan berhenti mengurai string. Hasilnya adalah kami telah mendorong semua yang diperlukan kecuali kutipan awal, yaitu

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

'adalah ASCII 39, jadi kami mendorong kutipan awal dengan mendorong 3d* = 3*13 = 39. Kami kemudian menggeser tumpukan ke kanan ( }) dan membalikkan ( r), memberikan:

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

Sekarang kita semua siap untuk mulai mencetak. imembaca dalam char input, tetapi> <> karakter pada dasarnya adalah bilangan bulat. Dalam program pertama, idiganti dengan loop yang mengubah string digit dari STDIN menjadi integer.

Kami kemudian menjalankan loop berikut untuk mencetak karakter N pertama:

:?!;               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 byte

Ini bisa bermain golf banyak ..

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

Perluasan kode :

{`"_~"+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";

Akhirnya, semua yang ada di stack dicetak ke STDOUT secara otomatis

Cobalah online di sini


5

Python 2, 117 byte

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

Life protip: jangan dieksekusi list(itertools.cycle(x)). Untuk beberapa alasan, saya tidak bisa membayangkan mengapa, itu membuat penerjemah jatuh.


1
itertools.cycle()adalah generator tanpa batas, jadi kecuali komputer Anda memiliki memori tak terbatas, Anda akan mengalami masalah :)
Sp3000

5

JavaScript (ES6), 65 52 50 47 41 39

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

Menggunakan ES6 repeat()untuk mengkloning kode, lalu memotong. Menggunakan hardcoded length.


Versi lama (50):

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

Menciptakan fungsi q, mengambil satu parameter.

Ini meringkas teks fungsi, dan secara rekursif memanggil fungsi jika nlebih besar dari panjang teks. Jika tidak, ia mengembalikan substring dari teks.

Versi Non ES6 (65):

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

1
menggunakan rekursi, bukan ES6 .repeat, untuk persyaratan siklus hanyalah kejeniusan.
Yakub

1
Sebenarnya, sepertinya menggunakan repeat()memungkinkan saya untuk memotong banyak, jadi saya menggunakannya sebagai gantinya.
Scimonster

Tidak melihat itu Bagaimanapun - ini adalah jawaban yang sangat bagus
Yakub

mengapa /39+1? kenapa tidak tinggalkan saja tali yang cukup panjang?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)berfungsi dengan baik di firefox
l4m2

5

J - 24 char

Membawa argumen integer positif tunggal dan mengeluarkan string.

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

J tidak memiliki trik referensi diri, jadi kami lakukan saja dengan cara quine. Dijelaskan oleh ledakan:

  ],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)&

$Operator dyadic dalam J secara siklis mengambil item dari argumen kanannya agar sesuai dengan dimensi yang ditentukan di sebelah kiri. Ketika dimensi adalah angka tunggal, ini adalah daftar karakter 1D sederhana, jadi kami melakukan persis apa yang ditanyakan.

Cobalah sendiri di tryj.tk .


Apa tujuan umum quotekata kerja?
randomra

@randomra Definisi di perpustakaan standar adalah ''''&,@(,&'''')@(#~ >:@(=&'''')), atau dalam bahasa Inggris, "gandakan 'karakter apa pun , lalu tambahkan satu ke awal dan akhir." J menggunakan string literal seperti Ada sehingga ini lolos dari string.
algorithmshark

4

k2 - 7 char

{x#$_f}

Dalam bahasa Inggris, ini adalah fungsi dengan argumen xyang definisinya adalah " xtake string self".

  • Self (kata benda _f) adalah fungsi terdalam yang sedang dieksekusi. Ini dia fungsinya {x#$_f}.
  • String (monadic $) mengubah argumennya menjadi string. Dalam kasus fungsi, ini menciptakan string dengan definisi asli fungsi.
  • Take (diad #) mengambil item - item arg kiri dari daftar di arg-kanan . Dalam kasus string, item adalah karakter, jadi ini melakukan persis apa yang kita inginkan.

Ini tidak akan berfungsi di sumber terbuka Kona, karena tampaknya membuat lubang hitam yang memakan semua upaya untuk menggunakannya sebagai argumen untuk apa pun. Saya tidak yakin dengan semantik k3 yang tepat tetapi mereka mungkin tidak lebih ramah.

Di Q, ini {x#string .z.s}dan di k4 {x#2_$.z.s}. Kita harus menggunakan 2_untuk menjatuhkan dua karakter awal dalam k4, dengan alasan hanya seorang ibu yang bisa mencintai.


3

Ruby, 66 64 63 byte

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

Penggunaan fungsi yang sama untuk menghindari panggilan getssedikit lebih lama (81 byte):

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

Versi Lambda yang sama adalah 69 dan 65 byte:

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
.cyclerapi, saya harus ingat itu. :) Anda mungkin dapat mempersingkat .joinke *''.
Martin Ender

Anda dapat menyimpan beberapa karakter dengan menggunakan String#formatalih-alih interpolasi:eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero

3

Mathematica, 65 byte

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

Semua ruang diperlukan untuk menjadikan ini quine yang tepat, termasuk yang tertinggal. Ini adalah fungsi murni, yang dapat Anda gunakan sebagai berikut:

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

yang mencetak

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

Sayangnya, menerapkan ToStringke fungsi tidak menghasilkan persis seperti yang Anda memasuki fungsi, jadi saya tidak bisa mempersingkat ini dengan menghapus spasi, memperpendek #1ke #atau menggunakan notasi prefix untuk panggilan fungsi.


"kependekan #menjadi #1"?
undergroundmonorail

@undergroundmonorail sebaliknya, terima kasih
Martin Ender

3

MATLAB, 319 141 karakter

Saya berhasil memeras beberapa byte dari yang asli:

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

Jawaban bagus ...! Tidak tahu cara kerjanya :-)
Luis Mendo

3

JavaScript, 34 byte

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

Fungsi rekursif yang mengulang kode nkali, lalu mengiris hasilnya.


3

Japt , 2 byte

îî

Cobalah online!

Yang pertama îadalah metode angka yang mengambil satu parameter, dan mengulanginya dengan panjang n. Karena itu adalah metode pertama, nmenjadi input. Yang kedua îdilemparkan ke dalam string, dan diulang.

Ini transparan ke:

n.î("î")-> Ulangi "î"sampai mencapai panjangn

Solusi 8 byte

îQi"îQi"

Cobalah online!

îQi"îQi" transparansi ke n.î(Qi"îQi")

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

1
Cantik dalam kesederhanaannya!
Shaggy

2

R, 203 byte

Ketika N = 203, kode sepenuhnya dicetak sendiri.

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

Ketika N = 50, kode akan terpotong sendiri.

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

Ketika N = 300, kode ini mengulangi sebagian.

(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 = "\

Cobalah ini:(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);

1Indeks awal (bukan 0) pada baris terakhir adalah karena fungsi Matlab typememperkenalkan umpan baris awal, yang harus dihapus. Terima kasih kepada Dennis untuk koreksi (indeks terakhir) dan untuk sarannya ( nnzlebih pendek dari numel).


Saya khawatir ini tidak melakukan apa yang saya harapkan (f (4) mengembalikan 'kesenangan'), kabar baiknya adalah Anda dapat memperbaikinya dengan menyimpan 2 karakter. (hapus -1). - Saya pikir Anda juga dapat menghapus baris kedua dan swap keluar numeluntuk nnz.
Dennis Jaheruddin

@Dennis Terima kasih atas dua ide ini! Aku sudah diedit untuk menggabungkan kedua
Luis Mendo

Hm, saya tidak ingin menjadi buzzkill, tetapi bukankah type fbagian itu berbenturan dengan persyaratan Membaca kode sumber Anda dengan cara apa pun dan membaca dari file, stdio, dll tidak diizinkan ?
knedlsepp

@ knedlsepp Saya pikir Anda benar. Saya juga curiga. typemungkin mengakses hard disk. Apakah Anda pikir saya harus menghapus jawabannya?
Luis Mendo

@LuisMendo: Saya tidak berpikir ada orang yang keberatan. :-) Saya hanya ingin menyelesaikan masalah ini kemarin, karena saya sudah gagal menghasilkan quine yang serupa dengan ini beberapa kali sebelumnya. Dan tentu saja saya harus memeriksa apakah sudah ada solusi Matlab. :-) Pada akhirnya ini memberi saya motivasi yang cukup untuk menggali cukup dalam tentang ini untuk akhirnya menghasilkan solusi. ( modNgomong - ngomong, aku mencuri ide -indeksmu)
knedlsepp

2

Unary (versi 1-8) , 23855 byte

Mengambil input sebagai unary dari '1's, dan kodenya 23855' 1's ( ,[.,])


1
Brainfuck apa yang menerjemahkan ini juga?
DJMcMayhem

@DJMcMayhem Ini adalah kucing
l4m2

Sekarang temukan bahasa yang input unary masuk akal dan beberapa program 1-char do cat
l4m2

2

Japt , 40 28 byte


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

Pertama kali menulis quine, jadi ini mungkin bisa dipersingkat sedikit. Di sisi lain, saya cukup senang bisa bekerja sama sekali.

Leading newline disengaja, baris kedua adalah data dan sisanya membuka bungkus data, kemudian mengulangi seluruh string yang dihasilkan hingga mencapai panjang yang sama dengan input.

Mencukur 12 byte kekalahan berkat Oliver .

Cobalah online!


Bagus :) Anda dapat mengganti tTUdengan ¯Udan Anda dapat menggunakanî di tempat pdengan bergerak ke depan: Cobalah online
Oliver

Setelah dipikir-pikir, saya tidak berpikir Anda perlu mengirisnya sama sekali. îR+Q+V+Q+R+Vharus bekerja dengan baik.
Oliver

@ Lebih Tua Oh itu pintar, saya tidak tahu î, itu sangat berguna. Terima kasih banyak!
Nit

Saya tidak terlalu baik dengan quines, tetapi saya pikir ini harus bekerja untuk 24 byte.
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;}

Penjelasan Selain dari karakter pelarian semua karakter lain dicetak. Metode utama adalah di dalam string s dan di dalam main string penuh dibangun dan dicetak ke stdout


1

Pyth, 15 13 14 byte

<jN*Q]"<jN*Q]"

Cobalah online!

Versi modifikasi dari standar Pyth quine .


@ l4m2 Bagaimana bisa begitu? Tolong jelaskan, saya tidak melihat sesuatu yang salah ...
hakr14

29 seharusnya <jN*Q]"<jN*Q]<jN*Q]"<jN*Q]<jNsalah?
m 2

@ l4m2 Ah, benar juga. Saya sudah memperbaikinya.
hakr14

<jN*Q]"<jN*Q]"sepertinya berhasil?
14m2

Ya, saya menyadari itu. Terima kasih atas bantuannya btw!
hakr14

1

Hoon , 185 byte

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

Setel fke kode program sebagai kaset, tetapi dengan "k" untuk dirinya sendiri. Pisahkan rekaman itu pada karakter 5, mengatur variabel [p=left q=right]. Mengelas string p, string asli f, dan semuanya setelah karakter pertamaq . Ulangi string itu nkali, lalu kembalikan nkarakter pertama itu.

Melakukan ini sedikit terhambat oleh stdlib Hoon yang tidak memiliki fungsi format atau temukan-dan-ganti ... Juga, saya tidak yakin mengapa kita perlu pemeran lain setelah scag, karena itu harus menyimpan informasi jenis. Begitu seterusnya.




1

Gol> <> , 12 byte

"r2ssIFLko|;

Cobalah online!

Bagaimana itu bekerja

"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 dapat membungkus beberapa kali, jadi kami tidak perlu menduplikasi seluruh tumpukan tergantung pada input.


1

SmileBASIC, 106 66 byte

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

0

KSFTgolf - 4 karakter, 6 byte

KSFTgolf jika saya mencoba mendesain kode untuk golf. Saya sudah banyak mengubahnya, jadi ini mungkin seharusnya tidak benar-benar masuk hitungan.

☃\@2

Bahasa apa ini ? Ada tautan? Spec? penjelasan ..
Pengoptimal

@Optimizer Ah, benar. Saya lupa tentang itu. Ini adalah bahasa yang saya rancang untuk kode golf. Ini akhirnya merupakan tantangan di mana (jika saya memperbaiki semua bug) itu benar-benar bisa menang.
KSFT

1
Selain itu, sejauh yang saya bisa lihat, bahasa dibuat seperti 10 menit yang lalu, jadi secara teknis, ini adalah jawaban yang tidak bersaing :). Juga, saya kira ini adalah blok yang sesuai dengan kode Anda , yang benar-benar terlihat seperti sesuatu yang telah secara khusus dilakukan untuk tantangan ini (karena tidak ada blok kode berbasis unicode lain di seluruh file Anda).
Pengoptimal

@Optimizer Instruksi itu sebenarnya dalam bahasa sebelumnya (meskipun komit yang mengubahnya sedikit didorong setelah tantangan diposting), yang dibuat beberapa hari yang lalu. Karena saya tidak berpikir ini akan berfungsi dalam versi bahasa yang umum ketika tantangan diposting, meskipun, saya tidak berpikir jawaban ini benar-benar harus dihitung, seperti yang saya nyatakan dalam jawaban saya.
KSFT

4
Apakah Anda ingin membuat manusia salju?
flawr


0

J, 41 Bytes

Sekarang itu asah otak!

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

Penjelasan:

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

Contoh:

   ((,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 byte

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

Penjelasan:

Cobalah 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

:

  • Ini var sberisi kode sumber yang tidak diformat.
  • %sdigunakan untuk memasukkan String ini ke dalam dirinya sendiri dengan s.format(...).
  • %c, %1$cdan34 digunakan untuk memformat tanda kutip ganda.
  • s.format(s,34,s) menempatkan semuanya bersama-sama.

Bagian tantangan:

  • for(int i=n;i>n;i/=176)loop ceil(n/176)kali, di mana 176panjang kode sumber.
  • s+=s;secara eksponensial meningkatkan ukuran String kode sumber. ( abmenjadi abab; ababmenjadi abababab; ababababmenjadi abababababababab; dll.)
  • s.subtring(0,n);mengambil nkarakter pertama dari String.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.