Viết chương trình tự nhận dạng ngắn nhất (một biến thể quine)


57

Viết chương trình sẽ tạo đầu ra "đúng" nếu đầu vào khớp với mã nguồn của chương trình và tạo ra đầu ra "sai" nếu đầu vào không khớp với mã nguồn của chương trình.

Vấn đề này có thể được mô tả là có liên quan đến các quines, vì chương trình phải có khả năng tính toán mã nguồn của chính nó trong quá trình.

Đây là mã golf: áp dụng quy tắc tiêu chuẩn. Chương trình của bạn không được truy cập bất kỳ tệp đặc biệt nào, chẳng hạn như tệp mã nguồn của chính nó.

Chỉnh sửa: Nếu bạn chọn, đúng / sai có thể được thay thế bằng Đúng / Sai hoặc 1/0.

Thí dụ

Nếu mã nguồn của chương trình của bạn là bhiofvewoibh46948732));:/)4, thì đây là những gì chương trình của bạn phải làm:

Đầu vào (Stdin)

bhiofvewoibh46948732));:/)4

Đầu ra (Stdout)

true

Đầu vào

(Anything other than your source code)

Đầu ra

false

7
true/ falseđầu ra là một yêu cầu mạnh mẽ, hoặc là các biến thể ( True/ False, 1/ 0) cũng được chấp nhận?
Cristian Lupascu

Có vấn đề gì không nếu chương trình xuất ra nhiều hơn một chút so với true / false (nếu nó không rõ ràng và kết thúc bằng true / false)?
Denys Séguret


5
Vì vậy, bạn có nghĩa là một chương trình Narcissist?
PyRulez

Câu trả lời:


33

JavaScript: 26

function f(s){return s==f}

Tôi không biết nếu một tệp JavaScript thực sự đủ điều kiện là một "chương trình".



Điều này có thể được rút ngắn bằng cách sử dụng chức năng mũi tênf=s=>s=='f='+f
Jonathan

2
@Jonathan vâng. Nhưng vào năm 2013, nó không thể ...
Denys Séguret

19

JavaScript ES6, 9 ký tự

Đây là cách duy nhất (golfy) để làm điều đó trong JS. ES6 chỉ làm cho nó mất ít nhân vật

Chạy cái này trong Bảng điều khiển web mới nhất của Firefox:

f=x=>f==x

Ví dụ sử dụng:

f("check") // returns false
f("x=>f==x") // returns true

1
@phinotpi - Mục nhập của tôi vẫn đủ điều kiện để được chọn làm câu trả lời phải không?
Trình tối ưu hóa

6
Có thể tranh luận mặc dù nguồn trong trường hợp này là f=x=>f==xkhông x=>f==x, trong khi phiên bản của Denys Séguret thực sự kiểm tra toàn bộ nguồn.
Hankrecords

@Hankrecords Hãy để JavaScript quyết định điều đó. f=x=>f==x function f() f.toSource() "x=>f==x"(về cơ bản đánh giá mã trong bảng điều khiển và sau đó đánh giá f.toSource()trong trình duyệt hỗ trợ phương thức đó.
Trình tối ưu hóa

Các chức năng ẩn danh không được phép (rút ngắn mã của bạn thành x=>f==x) EDIT: nevermind, f được tham chiếu bên trong hàm
MilkyWay90

9

Haskell, 72 ký tự

main=interact$show.(==s++show s);s="main=interact$show.(==s++show s);s="

Lưu ý: không có ký tự cuối dòng ở cuối tập lệnh.

$ runhaskell Self.hs < Self.hs
True

8

GolfScript, 11 ký tự

{`".~"+=}.~

Nếu không có =, mã này sẽ là một quine tạo mã nguồn riêng của nó dưới dạng một chuỗi. Điều này =làm cho nó so sánh chuỗi này với đầu vào và đầu ra của nó 1nếu chúng khớp và 0nếu chúng không khớp . Lưu ý rằng so sánh là chính xác - đặc biệt, một dòng mới ở cuối đầu vào sẽ khiến nó bị lỗi.

Giải trình:

  • { } là một khối mã theo nghĩa đen trong GolfScript;
  • .sao chép khối mã này và ~thực hiện bản sao thứ hai (để lại bản đầu tiên trên ngăn xếp);
  • `xâu chuỗi khối mã và ".~"+ nối .~vào nó;
  • cuối cùng, =so sánh chuỗi kết quả với đầu vào (được đẩy vào ngăn xếp dưới dạng chuỗi bởi trình thông dịch GolfScript trước khi chương trình bắt đầu) và trả về 1nếu chúng khớp và 0nếu chúng không khớp .

7

Perl, Infinity 41 38 Nhân vật

$_=q(print<>eq"\$_=q($_);eval"|0);eval

Cập nhật: Chương trình không còn kết thúc với một dòng mới, có nghĩa là nó sẽ hoạt động chính xác trên các tệp đa dòng. Bạn phải nhập dữ liệu từ STDIN mà không cần nhấn enter. Trên Windows tôi chỉ có thể làm điều này bằng cách đọc từ một tệp.

Giải pháp ban đầu:

print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(...

1
Làm tốt lắm! . . .
mob

Thất bại cho một tập tin bắt đầu bằng mã, ví dụ(cat id.pl; echo foo)|perl id.pl
Geoff Reedy

@GeoffReedy, cảm ơn; chương trình không xử lý đầu vào nhiều dòng trước đó. Nó được sửa chữa ngay bây giờ.

Chết tiệt, đây là mã bowling?
Matthew Roh

7

> <> , 68 byte

Cá thích ăn cá ị. Bây giờ chúng tôi biết họ có thể phân biệt họ với bạn bè của họ.

00v      0+1~$^?)0~\;n0\
  >:@@:@gi:0(?\:a=?/=?!/$1+
  0n;n*=f$=2~~/

Bạn có thể thử trực tuyến !


1
Kết quả này cũng 1cho bất kỳ tiền tố nào của mã
Jo King

@JoKing nó tệ nhất chỉ là tiền tố của tập lệnh, nó cũng chấp nhận các dòng bị cắt bớt! Tôi đã sửa nó, nhưng tôi thất vọng vì nó không chung chung như tôi muốn, tôi phải kiểm tra ô đạt được ở cuối tập lệnh để đảm bảo toàn bộ mã được khớp. Nó chắc chắn có thể được cải thiện, nhưng tôi không chắc mình sẽ làm phiền.
Aaron

6

Con trăn 2, 55

a='a=%r;print a%%a==raw_input()';print a%a==raw_input()

Thử nghiệm:

a='a=%r;print a%%a==raw_input()';print a%a==raw_input() -> True

(anything else) -> False


3
Thất bại trên bất kỳ tập tin bắt đầu với dòng đầu tiên bằng a='a=%r;print a%%a==raw_input()';print a%a==raw_input().
gian hàng

Đúng, đầu vào nhiều dòng không được hỗ trợ.
flornquake

Một sửa chữa tầm thường sẽ được thay thế raw_input()bằng __import__('sys').stdin.read().
frageum

Tôi bối rối trước từ ngữ thách thức (vì tôi không giỏi ngữ pháp tiếng Anh). Điều này có được phép không? print raw_input()==open(__file__).read()? Nó chỉ có 40 byte, sử dụng raw_input()cách tiếp cận của bạn , nhưng đọc mã của nó.
Simon

1
@Simon Điều đó không được phép, đó là một trong những lỗ hổng tiêu chuẩn cho những thách thức như thế này. Và vâng, đây là ý nghĩa của nóYour program must not access any special files, such as the file of its own source code.
PunPun1000

6

JavaScript ES6, 16 14 byte

$=_=>_==`$=`+$

Trừ hai byte nhờ Neil.

31 byte nếu chúng ta phải đưa đầu vào qua dấu nhắc.

$=_=>prompt()==`$=${$};$()`;$()

38 byte nếu chúng ta phải xuất qua cảnh báo.

$=_=>alert(prompt()==`$=${$};$()`);$()

Đây là cách thích hợp để làm điều đó, vì câu trả lời của Trình tối ưu hóa không chấp nhận toàn bộ mã nguồn.


1
Đẹp, mặc dù tôi sẽ chỉ viết '$='+$.
Neil

Ồ, đúng rồi. @Neil
Conor O'Brien

1
Tôi khá chắc chắn rằng bạn cần kết thúc ;$()bởi vì lời gọi hàm là một phần của quine. Điều này cũng có nghĩa là bạn sẽ cần phải chuyển sang prompttài khoản đầu vào.
Mama Fun Roll

1
Đó không phải là vấn đề. Cuộc gọi chức năng là cần thiết bởi vì nó là một phần của quine. Cho phép người dùng gọi nó là một chức năng sẽ làm hỏng quine.
Mama Fun Roll

1
thử$=_=>prompt()==`$=${$};$()`;$()
Mama Fun Roll

5

Node.js: 54

function f(){console.log(f+'f()'==process.argv[2])}f()

Bạn kiểm tra nó bằng cách lưu nó vào một tệp f.js(tên chính xác không có tầm quan trọng) và sử dụng

node f.js "test"

(kết quả đầu ra sai) hoặc

node f.js "$(< f.js)"

(kết quả đúng)

Tôi cũng đã tạo một phiên bản khác dựa trên eval:

eval(f="console.log('eval(f='+JSON.stringify(f)+')'==process.argv[2])")

Bây giờ là 72 ký tự, tôi sẽ cố rút ngắn điều đó khi có thời gian.


1
@ dan1111 Vì sao? Nó không truy cập bất kỳ tập tin. Tôi chỉ chỉ cách khởi chạy chương trình cho những người không quen với node.js. Nó không đọc tập tin.
Denys Séguret

1
Tất cả các giải pháp Javascript đều tận dụng thực tế là bạn có thể truy cập mã nguồn của riêng bạn trong JS. Đó có thể không phải là kỹ thuật "truy cập tệp mã nguồn của chính nó", nhưng nó hoàn thành chính xác điều tương tự. Tuy nhiên, tôi cho rằng câu trả lời của bạn là hợp pháp, vì câu hỏi không đặc biệt cấm điều này.

Vâng, bạn truy cập vào nguồn của một chức năng (chỉ chính xác là cơ thể) là một phần của chương trình. Điều đó giống như sử dụng mixin () trong D. Nhưng tôi không nghĩ hai câu trả lời JS khác, bao gồm một câu trả lời từ tôi, thực sự đủ điều kiện là "chương trình".
Denys Séguret

@dystroy thực sự mixin trong D giống như sử dụng eval hơn là đọc nguồn
ratchet freak

@ratchetfreak vâng, bạn nói đúng. Nhưng tôi nghĩ rằng chương trình của bạn sử dụng một loại toString của giá trị enum, phải không? Và bất kỳ mã nào sử dụng eval / mixin đều có cùng một mẹo so với sử dụng nguồn của hàm.
Denys Séguret

5

Smalltalk (phương ngữ Pharo 2.0)

Thực hiện phương thức 41 ký tự này trong Chuỗi (định dạng xấu cho mã golf):

isItMe^self=thisContext method sourceCode

Sau đó đánh giá điều này trong Không gian làm việc (in theo cách truyền thống của Smalltalk)
Đầu vào không được đọc từ stdin, nó chỉ là một Chuỗi mà chúng tôi gửi tin nhắn (một chương trình khác có thể là gì trong Smalltalk?):

'isItMe^self=thisContext method sourceCode' isItMe.

Nhưng chúng tôi đang gian lận, sourceCode đọc một số tệp nguồn ...
Đây là một biến thể với 51 ký tự không:

isItMe
    ^ self = thisContext method decompileString

Và kiểm tra với:

'isItMe
    ^ self = thisContext method decompileString' isItMe

Nếu một Chuỗi trong Không gian làm việc không được coi là đầu vào hợp lệ, thì hãy xem cách sử dụng một số Hộp thoại trong 116 ký tự
Chỉ cần đánh giá câu này:

(UIManager default request: 'type me') = (thisContext method decompileString withSeparatorsCompacted allButFirst: 7)

Vì định dạng dịch ngược bao gồm CR và TAB, chúng tôi thay đổi điều đó vớiSeparatorsCompacted.
Sau đó, chúng tôi bỏ qua 7 ký tự đầu tiên là 'doIt ^'

Cuối cùng, một biến thể 105 ký tự sử dụng stdin, chỉ cần diễn giải câu này từ dòng lệnh, để cảm thấy chính thống hơn:

Pharo -headless Pharo-2.0.image eval "FileStream stdin nextLine = (thisContext method decompileString withSeparatorsCompacted allButFirst: 7)"

4

flex - 312 ký tự

Q \"
N \n
S " "
B \\
P "Q{S}{B}{Q}{N}N{S}{B}n{N}S{S}{Q}{S}{Q}{N}B{S}{B}{B}{N}P{S}{Q}{P}{Q}{N}M{S}{Q}{M}{Q}{N}%%{N}{P}{N}{M}{N} putchar('1');"
M "(.|{N})* putchar('0');"
%%
Q{S}{B}{Q}{N}N{S}{B}n{N}S{S}{Q}{S}{Q}{N}B{S}{B}{B}{N}P{S}{Q}{P}{Q}{N}M{S}{Q}{M}{Q}{N}%%{N}{P}{N}{M}{N} putchar('1');
(.|{N})* putchar('0');

Có thể có thể được thực hiện ngắn hơn, nhưng nó hoạt động với đầu vào nhiều dòng (cần thiết vì mã nguồn là nhiều dòng) và ngay cả đối với các đầu vào có chứa chương trình dưới dạng một chuỗi con. Có vẻ như nhiều câu trả lời cho đến nay thất bại ở một hoặc cả hai câu trả lời.

Biên dịch lệnh: flex id.l && gcc -lfl lex.yy.c


3

D (133 ký tự)

enum c=q{import std.stdio;import std.algorithm;void main(){auto i=readln();writeln(equal("auto c=q{"~c~"};mixin(c);",i));}};mixin(c);

3

JavaScript (V8), 35

function i(){alert(prompt()==i+[])}

gọi i()và nó sẽ nhắc cho đầu vào


Các +[]nên bắt buộc như JS sẽ tự động loại-cast nó
Downgoat


3

Python 2, 47 byte

_='_=%r;print _%%_==input()';print _%_==input()

Một quine đơn giản với kiểm tra thêm.


Điều này không hoạt động. printlà một chức năng là Python 3. Bạn cần thực hiện print(_%%_==input())';print(_%_==input())hoặc thay đổi nó thành Python 2.
Mego

3

CJam , 12 byte

{s"_~"+q=}_~

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

Giải trình

Điều này chỉ sử dụng khung quine CJam tiêu chuẩn.

{s"_~"+q=}    e# Push this block (function literal).
          _~  e# Copy and run it.

Khối này làm gì:

 s            e# Stringify the top element (this block itself).
  "_~"+       e# Append "_~". Now the source code is on the stack.
       q      e# Read the input.
        =     e# Check if it equals the source code.

Đây chính xác là giải pháp tôi đã có ._.
Esolanging Fruit 27/03/18

2

Tcl, 111 ký tự

set c {set c {$c};puts [expr {[read stdin] eq [subst -noc \$c]}]};puts [expr {[read stdin] eq [subst -noc $c]}]


2

Python, 187 byte

import sys;code="import sys;code=!X!;print(sys.stdin.read()==code.replace(chr(33),chr(34)).replace(!X!,code,1))";print(sys.stdin.read()==code.replace(chr(33),chr(34)).replace("X",code,1))

Cẩn thận không thêm dòng mới vào cuối. Ai đó có Python-fu tốt hơn có thể rút ngắn nó.


2
Bạn có thể sử dụng C=chrđể thả một vài byte. Ngoài ra, rút ​​ngắn tên biến code.
Zach Gates

2
Vì không ai nói điều đó trong hơn một năm, Chào mừng bạn đến với PPCG!
Erik the Outgolfer

2

Husk , 11 byte

=hS+s"=hS+s

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

Giải trình

Giải thích sử dụng ¨để phân định các chuỗi (để tránh thoát không thể đọc được):

     "=hS+s  -- string literal: ¨=hS+s¨
  S+         -- join itself with
    s        -- | itself "showed": ¨"=hS+s"¨
             -- : ¨=hS+s"=hS+s"¨
 h           -- init: ¨=hS+s"=hS+s¨
=            -- is the input equal?

Bằng cách loại bỏ chức năng, =bạn có thể xác minh rằng nó thực sự sẽ chỉ khớp với chính nguồn đó.


2

> <> , 24 byte

'1rd3*i={*}50l3-?.~i)*n;

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

Bao bọc chuỗi bằng chữ theo sau bằng cách kiểm tra xem đầu vào có giống với ngăn xếp hay không, với kiểm tra cuối cùng là không còn đầu vào nữa.


2

Thạch , 10 byte

“Ṿ;$⁼”Ṿ;$⁼

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

“Ṿ;$⁼”Ṿ;$⁼
“Ṿ;$⁼”      String literal: 'Ṿ;$⁼'
        $   Next two links act on the string literal
      Ṿ     Uneval: '“Ṿ;$⁼”'
       ;    Append string: '“Ṿ;$⁼”Ṿ;$⁼' (source code)
         ⁼  Is the string above equal to the input?

2

05AB1E , 15 byte

0"D34çýQ"D34çýQ

Sửa đổi mặc định 0"D34çý"D34çýbằng cách thêm Q(kiểm tra sự bằng nhau với đầu vào ẩn)

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

Giải trình:

0                # Push 0 to the stack
                 #  STACK: [0]
 "D34çýQ"        # Push the string 'D34çýQ' to the stack
                 #  STACK: [0, 'D34çýIå']
         D       # Duplicate this string
                 #  STACK: [0, 'D34çýIå', 'D34çýIå']
          34ç    # Push '"' to the stack
                 #  STACK: [0, 'D34çýIå', 'D34çýIå', '"']
             ý   # Join the stack by this '"' delimiter
                 #  STACK: ['0"D34çýIå"D34çýIå']
              Q  # Check if it's equal to the (implicit) input
                 # (and output the top of the stack implicitly as result)

Thay thế mát mẻ 15 byte được cung cấp bởi @Grimy :

187745012D27BJQ

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

Giải trình:

187745012        # Push integer 187745012 
                 #  STACK: [187745012]
         D       # Duplicate it
                 #  STACK: [187745012, 187745012]
          27     # Push integer 27
                 #  STACK: [187745012, 187745012, 27]
            B    # Convert 187745012 to base-27
                 #  STACK: [187745012, "D27BJQ"]
             J   # Join the values on the stack together
                 #  STACK: ["187745012D27BJQ"]
              Q  # Check if it's equal to the (implicit) input
                 # (and output the top of the stack implicitly as result)

3
187745012D27BJQlà một cái cà vạt.
Grimmy

1

C - 186 176 ký tự

Lót:

 *a="*a=%c%s%c,b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}",b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}

Với khoảng trắng (lưu ý rằng điều này phá vỡ chương trình):

*a="*a=%c%s%c,b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}",b[999],c[999];
main() {
  sprintf(b,a,34,a,34);
  gets(c);
  putchar(strcmp(b,c)?'0':'1');
}



1

q, 8 byte

{x~.z.s}

Trả về boolean trên đầu vào khớp với .zs tự tham chiếu


1

Runic , 11 byte

"3X4+kSqi=@

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

TIO đã được cập nhật và không còn vấn đề đọc đầu vào (và không còn yêu cầu khoảng trắng theo dõi).

Giải trình

>                 Implicit entry
 "                Begin reading as string
  3X4+kSqi=@      Pushed to the stack as a string, loop around
 "                End reading as string
  3X4+            Push 3*10 and 4 to the stack, add them together
      k           Convert to character (")
       S          Swap the top two items on the stack
        q         Concatenate. This leaves only "3X4+kSqi=@ on the stack
         i        Read input
          =       Compare using .Equals, push 1 if equal, else 0
           @      Print and terminate

Giải pháp của JoKing:

"'<~qi=@|

Giải trình

  <              Entry
 '               Read character (loop around)
"                Push "
         |       Mirror
"                Begin reading string (loop around)
 '<~ri=@|        Push the string '<~qi=@| (loop around)
"                End reading string
 '<~             Push the character < and then discard it
    q            Concatenate, stack contains only "'<~qi=@|
      i          Read input
       =         Compare
        @        Print and terminate


@JoKing Rất thông minh.
Draco18

Trên thực tế, 9 byte tránh được rmãi mãi
Jo King

@JoKing Có lẽ tôi đã có thể tự mình đến đó (từ giải pháp 10 byte), nhưng tôi chưa có cawfee của mình . Tôi đã làm việc ngày hôm qua rằng "bên trái là nơi duy nhất nó thực sự có thể đi, bởi vì có nó ở nơi khác làm phức tạp mọi thứ. (Nhưng vừa nãy tôi phải chạy nó trong trình gỡ lỗi của mình để xem nó đang làm gì ...)
Draco18s

1

R , 54 byte

f=function(s)s==paste0("f=function(s)s==", body(f)[3])

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

bodylấy phần thân của hàm (tách nó ra một chút, vì vậy đó body(f)[3]là mọi thứ từ đó paste0trở đi). Thật thú vị, bodyđịnh dạng lại mã, thêm dấu cách sau dấu phẩy, v.v ... Đây là trường hợp hiếm hoi của câu trả lời golf R với khoảng trắng sau dấu phẩy.

Điều này hoạt động vì body(f)là một đối tượng của kiểu languagevà tồn tại một as.characterphương thức cho kiểu này. Mặt khác, fargs(f)thuộc loại closure, và không thể chuyển đổi thành loại ký tự như tôi có thể nói. Xin đừng hỏi tôi loại ngôn ngữ nào dành cho giáo dục


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.