In ra N ký tự đầu tiên của mã của bạn


21

Bạn nên viết một chương trình hoặc hàm nhận số nguyên dương Nlàm đầu vào và in ra các Nký tự đầu tiên của mã của bạn. Nếu Nlớn hơn độ dài mã của bạn, bạn nên tiếp tục xuất mã theo chu kỳ.

Đọc mã nguồn của bạn theo bất kỳ cách nào và đọc từ tệp, stdio, v.v. đều không được phép.

Ví dụ

(giả sử mã của bạn là yourcode)

Đầu vào => Đầu ra:

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

Làm rõ

Chương trình của bạn phải dài ít nhất 1 byte.


15
Chúc mừng bạn đã đăng bài thử thách golf mã thứ 2000! :)
Martin Ender

3
Douglas Hofstadter sẽ thích điều này!
Luis Mendo

1
@ MartinBüttner Trên thực tế, có hơn 300 câu hỏi [code-golf] đã bị xóa. Nhưng đủ gần;)
Doorknob

11
@ MartinBüttner Cảm ơn bạn. Chỉ 48 để đi cho đến khi một số tròn!
ngẫu nhiên

5
Có lẽ đã đến lúc bạn đề cập rõ ràng rằng các chương trình trống không hợp lệ?
Martin Ender

Câu trả lời:



10

> <> , 49 byte

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

Một nửa mã đang chuyển đổi đầu vào từ một chuỗi thành int. Nếu chúng ta được phép sử dụng điểm mã của một char được đọc từ STDIN, thì chương trình này sẽ ngắn hơn nhiều ở 21 byte:

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

Giải trình

Tôi sẽ sử dụng chương trình thứ hai để giải thích.

'bắt đầu phân tích chuỗi, đẩy mỗi char cho đến khi tìm thấy trích dẫn kết thúc. Vì phần còn lại của dòng không có 'trích dẫn, mọi char ngoại trừ chữ cái đầu tiên 'được đẩy lên ngăn xếp.

Nhưng> <> là ngôn ngữ 2D hình xuyến, vì vậy sau khi dòng kết thúc, con trỏ lệnh sẽ quay trở lại điểm bắt đầu, nhấn 'lại và dừng phân tích chuỗi. Kết quả là chúng tôi đã đẩy mọi thứ cần thiết ngoại trừ trích dẫn ban đầu, cụ thể là

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

'là ASCII 39, vì vậy chúng tôi đẩy báo giá ban đầu bằng cách đẩy 3d* = 3*13 = 39. Sau đó chúng ta thay đổi ngăn xếp phải ( }) và đảo ngược ( r), đưa ra:

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

Bây giờ tất cả chúng ta đã thiết lập để bắt đầu in. iđọc trong một char của đầu vào, nhưng> <> chars về cơ bản là số nguyên. Trong chương trình đầu tiên, chuỗi iđược thay thế bằng một vòng lặp chuyển đổi một chuỗi chữ số từ STDIN thành một số nguyên.

Sau đó chúng tôi thực hiện vòng lặp sau để in ra các ký tự N đầu tiên:

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

Điều này có thể được đánh golf rất nhiều ..

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

Mở rộng mã :

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

Cuối cùng, mọi thứ trên stack sẽ được in tự động sang STDOUT

Dùng thử trực tuyến tại đây


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

Cuộc sống protip: không thực hiện list(itertools.cycle(x)). Vì một số lý do, tôi không thể tưởng tượng được tại sao, nó làm hỏng trình thông dịch.


1
itertools.cycle()là một trình tạo vô hạn, vì vậy trừ khi máy tính của bạn có bộ nhớ vô hạn, bạn sẽ gặp vấn đề :)
Sp3000

5

JavaScript (ES6), 65 52 50 47 41 39

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

Sử dụng ES6 repeat()để sao chép mã, sau đó cắt xuống. Sử dụng một chiều dài mã hóa cứng.


Phiên bản cũ (50):

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

Tạo một hàm q, lấy một tham số duy nhất.

Nó xâu chuỗi văn bản hàm và gọi đệ quy hàm nếu nlớn hơn độ dài của văn bản. Mặt khác, nó trả về một chuỗi con của văn bản.

Phiên bản không ES6 (65):

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

1
sử dụng đệ quy, thay vì ES6 .repeat, cho các yêu cầu tuần hoàn chỉ đơn giản là thiên tài.
Jacob

1
Trên thực tế, có vẻ như việc sử dụng repeat()cho phép tôi cắt nó xuống, vì vậy tôi đã sử dụng nó để thay thế.
Scimonster

Không thấy điều đó. Dù sao đi nữa - đây là một câu trả lời rất hay
Jacob

tại sao /39+1? Tại sao không để lại một chuỗi đủ dài?
l4m2

1
q=n=>('q='+q).repeat(n).slice(0,n)hoạt động tốt trên firefox
l4m2

5

J - 24 char

Đưa ra một đối số nguyên dương duy nhất và tạo ra một chuỗi.

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

J không có bất kỳ thủ thuật tự tham chiếu nào, vì vậy chúng tôi chỉ thực hiện theo cách chính xác. Giải thích bằng vụ nổ:

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

$Toán tử dyadic trong J theo chu kỳ lấy các mục từ đối số bên phải của nó để khớp với các kích thước được chỉ định ở bên trái. Khi thứ nguyên là một số duy nhất, đây là danh sách các ký tự 1D đơn giản, vì vậy chúng tôi thực hiện chính xác những gì câu hỏi yêu cầu.

Hãy thử nó cho chính mình tại tryj.tk .


Mục đích chung của quoteđộng từ là gì?
ngẫu nhiên

@randomra Định nghĩa của nó trong thư viện chuẩn là ''''&,@(,&'''')@(#~ >:@(=&'''')), hoặc bằng tiếng Anh, "nhân đôi bất kỳ 'ký tự nào , sau đó thêm một ký tự vào đầu và cuối." J sử dụng chuỗi ký tự giống như Ada để thoát chuỗi này.
thuật toán

4

k2 - 7 char

{x#$_f}

Trong tiếng Anh, đây là một hàm với đối số xcó định nghĩa là " xtự lấy chuỗi".

  • Self (danh từ _f) là hàm trong cùng hiện đang thực thi. Đây là chức năng {x#$_f}.
  • Chuỗi (monadic $) chuyển đổi đối số của nó thành một chuỗi. Trong trường hợp của hàm, nó tạo ra một chuỗi với định nghĩa ban đầu của hàm.
  • Take (dyadic #) lấy các mục bên trái tạo thành danh sách trong bên phải-arg . Trong trường hợp của một chuỗi, các mục là các ký tự, vì vậy đây là thực hiện chính xác những gì chúng ta muốn.

Điều này sẽ không hoạt động trong Kona nguồn mở, bởi vì nó dường như tạo ra các lỗ đen ăn mọi nỗ lực để sử dụng chúng làm đối số cho bất cứ điều gì. Tôi không chắc về ngữ nghĩa k3 thích hợp nhưng có lẽ chúng không tốt hơn nhiều.

Trong Q, đây là {x#string .z.s}và trong k4 {x#2_$.z.s}. Chúng tôi phải sử dụng 2_để thả hai ký tự ban đầu trong k4, vì lý do chỉ có một người mẹ có thể yêu.


3

Ruby, 66 64 63 byte

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

Tương tự sử dụng một hàm để tránh gọi getslà lâu hơn một chút (81 byte):

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

Các phiên bản Lambda giống nhau là 69 và 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
.cyclelà gọn gàng, tôi phải nhớ điều đó. :) Bạn có thể rút ngắn .joinlại *''.
Martin Ender

Bạn có thể lưu một vài ký tự bằng cách sử dụng String#formatthay vì nội suy:eval s="$><<('eval s=%p'%s).chars.cycle.take(gets.to_i)*''"
Ventero

3

Toán học, 65 byte

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

Tất cả các không gian là cần thiết để làm cho điều này một quine thích hợp, bao gồm cả dấu vết. Đây là một hàm thuần túy, bạn có thể sử dụng như sau:

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

mà in

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

Thật không may, áp dụng ToString cho một chức năng không mang lại một cách chính xác theo cách bạn bước vào chức năng, vì vậy tôi không thể rút ngắn này bằng cách loại bỏ khoảng trắng, rút ngắn #1đến #hoặc sử dụng ký hiệu tiền tố cho các cuộc gọi chức năng.


"rút ngắn #tới #1"?
undergroundmonorail

@undergroundmonorail theo cách khác, cảm ơn
Martin Ender

3

MATLAB, 319 141 ký tự

Tôi đã quản lý để nén một vài byte từ cái ban đầu:

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

Câu trả lời chính xác...! Không biết làm thế nào nó hoạt động :-)
Luis Mendo

3

JavaScript, 34 byte

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

Hàm đệ quy lặp lại số nlần mã , sau đó cắt kết quả.


3

Japt , 2 byte

îî

Hãy thử trực tuyến!

Đầu tiên îlà một phương thức số lấy một tham số và lặp lại theo chiều dài n. Bởi vì nó là phương thức đầu tiên, ntrở thành đầu vào. Cái thứ hai îđược đúc thành một chuỗi, và được lặp lại.

Điều này chuyển đến:

n.î("î")-> Lặp lại "î"cho đến khi đạt được chiều dàin

Giải pháp 8 byte

îQi"îQi"

Hãy thử trực tuyến!

îQi"îQi" phiên mã đến n.î(Qi"îQi")

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

1
Đẹp trong sự đơn giản của nó!
Xù xì

2

R, 203 byte

Khi N = 203, mã tự in hoàn toàn.

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

Khi N = 50, mã tự cắt.

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

Khi N = 300, mã sẽ lặp lại một phần.

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

Hãy dùng thử:(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);

1Chỉ mục ban đầu (thay vì 0) trong dòng cuối cùng là do chức năng của Matlab typegiới thiệu một nguồn cấp dữ liệu ban đầu, cần được loại bỏ. Cảm ơn Dennis vì sự điều chỉnh của anh ấy (chỉ số cuối cùng) và cho lời đề nghị của anh ấy ( nnzngắn hơn numel).


Tôi sợ điều này không làm những gì tôi mong đợi (f (4) trả về 'niềm vui'), tin tốt là bạn có thể khắc phục bằng cách lưu 2 ký tự. (loại bỏ -1). - Tôi nghĩ rằng bạn cũng có thể loại bỏ các newline thứ hai và hoán đổi ra numelcho nnz.
Dennis Jaheruddin

@Dennis Cảm ơn hai ý tưởng này! Tôi đã chỉnh sửa để kết hợp cả hai
Luis Mendo

Hừm, tôi không muốn trở thành một buzzkill, nhưng không phải là type fphần xung đột với yêu cầu Đọc mã nguồn của bạn theo bất kỳ cách nào và đọc từ tệp, stdio, v.v. không được phép ?
knedlsepp

@knedlsepp Tôi nghĩ bạn nói đúng. Tôi cũng có sự nghi ngờ đó. typecó thể truy cập vào đĩa cứng. Bạn có nghĩ rằng tôi nên loại bỏ câu trả lời?
Luis Mendo

@LuisMendo: Tôi không nghĩ có ai thực sự để tâm. :-) Tôi chỉ muốn đưa ra vấn đề này vào ngày hôm qua, vì tôi đã thất bại trong việc tạo ra một câu hỏi tương tự như điều này một vài lần trước đây. Và tất nhiên tôi phải kiểm tra xem đã có giải pháp Matlab chưa. :-) Cuối cùng, điều này đã cho tôi đủ động lực để đào sâu vào vấn đề này để cuối cùng tạo ra một giải pháp. (Tôi đã đánh cắp modý tưởng của bạn bằng cách này.)
knedlsepp

2

Unary (phiên bản 1-8) , 23855 byte

Lấy đầu vào là đơn vị của '1' và mã là 23855 '1's ( ,[.,])


1
Brainfuck gì dịch này quá?
DJMcMayhem

@DJMcMayhem Đó là một con mèo
l4m2

Bây giờ hãy tìm một ngôn ngữ mà đầu vào unary có ý nghĩa và một số chương trình 1 char làm mèo
l4m2

2

Japt , 40 28 byte


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

Lần đầu tiên viết một bài quine, vì vậy điều này có thể được rút ngắn khá nhiều. Mặt khác, tôi khá hạnh phúc khi tôi làm việc đó.

Dẫn đầu dòng mới có chủ ý, dòng thứ hai là dữ liệu và phần còn lại của nó sẽ hủy kết nối dữ liệu, sau đó lặp lại toàn bộ chuỗi kết quả cho đến khi đạt đến độ dài bằng với đầu vào.

Cạo sạch một con số khổng lồ 12 byte nhờ Oliver .

Hãy thử trực tuyến!


Đẹp :) bạn có thể thay thế tTUbằng ¯Uvà bạn có thể sử dụng îthay thế pbằng cách di chuyển nó ra phía trước: Dùng thử trực tuyến
Oliver

Về ý nghĩ thứ hai, tôi không nghĩ bạn cần phải cắt nó ra. îR+Q+V+Q+R+Vnên làm việc tốt
Oliver

@Oliver Ôi thật thông minh, tôi không biết î, điều đó rất tiện dụng. Cảm ơn rất nhiều!
Nit

Tôi cũng không quá giỏi với quines nhưng tôi nghĩ cái này sẽ hoạt động được 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;}

Giải thích Ngoài nhân vật thoát, tất cả các nhân vật khác được in ra. Phương thức chính nằm bên trong chuỗi s và bên trong chính chuỗi đầy đủ được xây dựng và in ra thiết bị xuất chuẩn



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

Đặt fmã của chương trình dưới dạng băng, nhưng với "k" cho chính nó. Tách băng ở ký tự 5, thiết lập các biến [p=left q=right]. Hàn các chuỗi p, chuỗi gốc fvà mọi thứ sau ký tự thứ 1 củaq . Lặp lại chuỗi nlần đó, sau đó trả về các nký tự đầu tiên của nó.

Làm điều này hơi bị cản trở bởi stdlib của Hoon không có chức năng định dạng hoặc tìm và thay thế ... Ngoài ra, tôi không chắc tại sao chúng ta cần một diễn viên khác sau đó scag, vì nó nên giữ thông tin loại. Vì vậy, nó đi.




1

Gol> <> , 12 byte

"r2ssIFLko|;

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

"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 có thể gói bất kỳ số lần nào, vì vậy chúng tôi không cần sao chép toàn bộ ngăn xếp tùy thuộc vào đầu vào.


1

SmileBASIC, 106 66 byte

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

0

KSFTgolf - 4 ký tự, 6 byte

KSFTgolf nếu một ngôn ngữ tôi đã cố gắng thiết kế cho mã golf. Tôi đã thay đổi nó rất nhiều, vì vậy điều này có lẽ không thực sự được tính đến.

☃\@2

Ngôn ngữ này là gì? Bất kỳ liên kết? Thông số kỹ thuật? giải thích ..
Trình tối ưu hóa

@Optimizer À, đúng rồi. Tôi quên mất điều đó. Đó là một ngôn ngữ tôi đã thiết kế cho mã golf. Đây cuối cùng là một thử thách (nếu tôi sửa tất cả các lỗi) nó thực sự có thể chiến thắng.
KSFT

1
Hơn nữa, theo như tôi có thể thấy, ngôn ngữ đã được tạo ra sau 10 phút, vì vậy về mặt kỹ thuật, đây là một câu trả lời không cạnh tranh :). Ngoài ra, tôi cho rằng đây là khối tương ứng với mã của bạn , nó hoàn toàn trông giống như một thứ đã được thực hiện cụ thể cho thử thách này (vì không có khối mã dựa trên unicode nào khác trong toàn bộ tệp của bạn).
Tối ưu hóa

@Optimizer Hướng dẫn đó thực sự bằng ngôn ngữ trước đó (mặc dù một cam kết đã thay đổi một chút đã được đẩy sau khi thử thách được đăng), được tạo ra vài ngày trước. Tuy nhiên, vì tôi không nghĩ rằng nó sẽ hoạt động trong phiên bản ngôn ngữ công khai khi thử thách được đăng, tuy nhiên, tôi không nghĩ câu trả lời này thực sự nên được tính, như tôi đã nêu trong câu trả lời của mình.
KSFT

4
Bạn có muốn xây dựng một người tuyết?
flawr


0

J, 41 byte

Bây giờ đó là một lời trêu ghẹo não!

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

Giải trình:

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

Ví dụ:

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

Giải trình:

Hãy thử trực tuyến.

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:

  • Các var s chứa mã nguồn chưa được định dạng.
  • %s được sử dụng để nhập Chuỗi này vào chính nó với s.format(...) .
  • %c, %1$c34 được sử dụng để định dạng dấu nháy kép.
  • s.format(s,34,s) đặt tất cả lại với nhau

Phần thử thách:

  • for(int i=n;i>n;i/=176)vòng lặp ceil(n/176)lần, trong đó 176độ dài của mã nguồn.
  • s+=s;tăng theo cấp số nhân của chuỗi mã nguồn. ( abtrở thành abab; ababtrở thành abababab;abababab trở thành abababababababab; v.v.)
  • s.subtring(0,n);lấy các nký tự đầu tiên của Chuỗi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.