今天我在维基百科上浏览了一些随机的极客文章,以获取我日常无用的知识.我偶然发现了quines,这是打印自己的源代码的程序.我发现这是让我的大脑受伤的好方法,所以我开始在VBA中使用quine.我有两个很好的理由:
这是我的杰作:
Sub q()
c = "Sub q();c = #;Debug.Print Replace(Replace(c, Chr(59), vbNewLine), Chr(35), Chr(34) & c & Chr(34));End Sub"
Debug.Print Replace(Replace(c, Chr(59), vbNewLine), Chr(35), Chr(34) & c & Chr(34))
End Sub
Run Code Online (Sandbox Code Playgroud)
我的挑战:你能让它变得更短(最好是更尴尬)吗?
我试图理解这段自我复制代码是如何工作的(在这里找到),但问题是我不能让它按原样运行:
class c {
static void Main(){
string s = "class c{{static void Main(){{string s={0}{10};System.Console.Write(s,(char)34,s);}}}}";
System.Console.Write(s,(char)34,s); //<<-- exception on this line
}
}
Run Code Online (Sandbox Code Playgroud)
它在writeline上抛出异常:Index(从零开始)必须大于或等于零且小于参数列表的大小.
有人可以提供帮助 - 尤其是格式化选项{0} {10}吗?
我得到了这样的工作(见下文),但它比原来更长 - 我很好奇原作如何在第一位起作用:
class c {
static void Main(){
string s = "class c{{static void Main(){{string s={0}{1}{2};System.Console.Write(s,(char)34,s,(char)34);}}}}";
System.Console.Write(s,(char)34,s,(char)34);
}
}
Run Code Online (Sandbox Code Playgroud) 我在维基百科上发现了这个代码块,作为Ruby中的一个quine(打印自己的程序)的例子.
puts <<2*2,2
puts <<2*2,2
2
Run Code Online (Sandbox Code Playgroud)
但是,我不知道它是如何工作的.特别是,我没有得到的是,当我删除最后一行时,我收到此错误:
语法错误,意外$ end,期待tSTRING_CONTENT或tSTRING_DBEG或tSTRING_DVAR或tSTRING_END
那些线会发生什么?
在Haskell中使用"ap"monad的正确方法是什么?我想做类似的事情:
main = (putStr . ap (++) show) "main = (putStr . ap (++) show) "
Run Code Online (Sandbox Code Playgroud)
但我收到错误"不在范围内:'ap'."
使用"import Control.Monad"什么都不做.我试过给它
"ap :: Monad m => m (a -> b) -> m a -> m b"
Run Code Online (Sandbox Code Playgroud)
然后我得到"'ap'的类型签名缺少附带的绑定"
这是一个特殊的Haskell程序,它输出一个Python程序,输出一个输出原始Haskell程序的Ruby程序(来自http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages. HTML)
更准确地说,输出是这个Haskell程序
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"
Run Code Online (Sandbox Code Playgroud)
是一个Python程序,
$ runhaskell test.hs
def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'
q("def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'","def …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个图灵完整的编程语言(已经过验证),因此必须可以为它编写一个quine,对吧?
但是我所知道的所有quines都将它们的源代码存储在一个字符串中,然后使用chr和之类的东西替换它中的特殊字符ord.
我的语言只有以下内容
我不知道如何写一个quine,因为我没有真正的字符串操作可用,我只能输出常量字符串.然而,它是100%图灵完成.
是否有可能有一个Java printf语句,其输出是语句本身?
一些片段来说明:
// attempt #1
public class Main {
public static void main(String[] args) {
System.out.printf("something");
}
}
Run Code Online (Sandbox Code Playgroud)
这打印something.
因此,尝试#1的输出并不完全是printf尝试#1中的语句.我们可以尝试这样的事情:
// attempt #2
public class Main {
public static void main(String[] args) {
System.out.printf("System.out.printf(\"something\");");
}
}
Run Code Online (Sandbox Code Playgroud)
现在输出是 System.out.printf("something");
所以现在尝试#2的输出与输出#1中的语句匹配,但是我们回到了之前的问题,因为我们需要尝试#2的输出来匹配尝试#2中的语句.
那么可以写一个printf打印自己的单行语句吗?
众所周知,C++模板是完整的.因此,应该可以输出在编译时基本上呈现的quine.有没有人知道这样的quine是否已经写好或者我找到了哪一个.