使用Java输出或返回,而不使用字母e或数字5

时间:2015-02-20 17:56:23

标签: java escaping

对于PCG.SE上的这个challenge,需要编写一个返回/输出前N个素数的函数/程序。

但是,程序中不允许使用带有主要代码点的字符。

其中两个字符为5e。任一字母的代码点都包含5。因此,\u{codepoint}对这两个字母不起作用。

使用转义符,除e中的return外,我可以删除代码中的所有主要字符。

我可以使用System.outFileDescriptor.out,但都包含字母e

有没有办法在不使用e5的情况下退货或退货?

这里是我的代码,我的代码包含字符转义:

int[]b(int b\u0029{
    int c,d,f[]\u003d{}\u003b
    for(f\u003dj\u0061v\u0061.util.Arr\u0061ys.copy\u004ff(f,b\u0029\u003bb-->0\u003b\u0029
        for(d\u003d0,c\u003d2\u003bf[b]<1\u003bf[b]\u003dd<1?c:f[b],d\u003d0,c\u002b\u002b\u0029
            for(int h:f\u0029
                d\u003dh>0&&c\u002fh*h\u003d\u003dc?1:d\u003b
    return f;
}

没有转义字符:

int[]b(int b){
    int c,d,f[]={};
    for(f=java.util.Arrays.copyOf(f,b);b-->0;)
        for(d=0,c=2;f[b]<1;f[b]=d<1?c:f[b],d=0,c++)
            for(int h:f)
                d=h>0&&c/h*h==c?1:d;
    return f;
}

1 个答案:

答案 0 :(得分:23)

我找到了一种在不使用System.outFileDescriptor.outreturn的情况下输出素数的方法。我的方法不使用&#34; prime&#34;字符。

这非常棘手,因为e遍布Java包名,类名和方法名。此外,必须禁止S,因为它在Unicode中的编号为8383为素数。它的Unicode转义\u0053包含5,其Unicode字符53也是素数。以下是我们在这些规则下不能使用Unicode转义的所有字符:

  • %(37为素数,\u00255
  • 5(53为素数,\u00355
  • S(83为素数,\u00535
  • Y(89为素数,\u00595
  • e(101为素数,\u00655

这消除了:

  • 任何方法,例如toStringfromStringparseIntvalueOfvalues
  • java.beansjava.netjava.lang.reflect个套件
  • Class.forName
  • 使用new运算符。
  • 记录通常使用包含Logger的{​​{1}}类的框架。

以下是我们可以使用Unicode转义符的字符:

  • e(41为素数,允许)
  • \u0029(43为素数,允许+
  • \u002b(47为素数,允许/
  • \u002f(59为素数,允许;
  • \u003b(61为素数,允许=
  • \u003d(67为素数,允许C
  • \u0043(71为素数,允许G
  • \u0047(73为素数,允许I
  • \u0049(79为素数,允许O
  • \u004f(97为素数,允许a
  • \u0061(107为素数,允许k
  • \u006b(113是素数,q是允许的)

尝试生成其消息包含所需输出的异常是满足Java要求的唯一方法。我们不能使用已检查的异常,因为我可以找到的所有已检查异常在其名称中使用\u0071,在e之前的每个超类中使用Throwable。我将被要求使用包含throws的异常名称的e子句。我无法extend任何课程,因为extends包含e s。

留下未经检查的例外情况。最有可能的用途是IllegalArgumentException不是由此代码直接创建的,而是通过调用内置的函数来抛出IllegalArgumentException

    除了Enum包含valueOf之外,
  • e会有所帮助。
  • javax.crypto.Mac.getInstance有一个e;无论如何它都会抛出一个检查过的异常。
  • javax.naming.ldap.Rdn.unescapeValue("\\b" + stringFormOfOutput)通过例外输出了该列表,但该方法有一个e
  • java.util.UUID.fromString通过例外输出了该列表,但该方法有一个S

This method会抛出DataBindingException which is unchecked

  • javax.xml.bind.JAXB.unmarshal(stringFormOfOutput, Long.class)通过DataBindingException输出了该列表,但没有e

现在我们所要做的就是将int[]转换为String。通过将数组连接到""进行字符串转换不起作用,因为arrays, as objects in Java, don't override toString()。由于Arrays.toString,<{1}}已经过时了。

我们可以使用S从数据中获取Arrays.asList。但Arrays.asList(f) gives a List<int[]>, not a List<Integer>,使问题复杂化。将List的类型更改为f无法正常工作,其中包含Integer[]。将e的类型更改为f有效。

将数组转换为Long[]如下。

String

代替Long c,d,f[]... ""+Arrays.asList(f) 语句,制作方法return,然后致电voidunmarshal的使用意味着需要进行一些其他调整,例如使用Long文字和long数组使用零而不是默认fill

null

逃离&#34; prime&#34;字符:

void b(int b){
    Long c,d,f[]={};
    for(f=java.util.Arrays.copyOf(f,b),Arrays.fill(f,0L);b-->0;)
        for(d=0L,c=2L;f[b]<1;f[b]=d<1?c:f[b],d=0L,c++)
            for(long h:f)
                d=h>0&&c/h*h==c?1:d;
    javax.xml.bind.JAXB.unmarshal(""+Arrays.asList(f),Long.class);
}

这是一个丑陋的代码,它可能不会赢得任何代码打高尔夫的比赛,但这是我能用Java想到满足要求的唯一方式。

使用void b(int b\u0029{ Lon\u0067 c,d,f[]\u003d{}\u003b for(f\u003dj\u0061v\u0061.util.Arr\u0061ys.copy\u004ff(f,b\u0029,Arr\u0061ys.fill(f,0L\u0029\u003bb-->0\u003b\u0029 for(d\u003d0L,c\u003d2L\u003bf[b]<1\u003bf[b]\u003dd<1?c:f[b],d\u003d0L,c\u002b\u002b\u0029 for(lon\u0067 h:f\u0029 d\u003dh>0&&c\u002fh*h\u003d\u003dc?1:d\u003b j\u0061v\u0061x.x\u006dl.bind.JAXB.un\u006d\u0061rsh\u0061l(""\u002bArr\u0061ys.\u0061sList(f\u0029, Lon\u0067.cl\u0061ss\u0029\u003b } 作为参数调用此b方法会产生以下输出,其中10是前10个素数:

[29, 23, 19, 17, 13, 11, 7, 5, 3, 2]

但是Exception in thread "main" javax.xml.bind.DataBindingException: javax.xml.bind.UnmarshalException - with linked exception: [java.io.FileNotFoundException: C:\dev\src\misc\[29, 23, 19, 17, 13, 11, 7, 5, 3, 2] (The system cannot find the file specified)] at javax.xml.bind.JAXB.unmarshal(JAXB.java:208) at Main.b(Main.java:34) at Main.main(Main.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90) Caused by: javax.xml.bind.UnmarshalException - with linked exception: [java.io.FileNotFoundException: C:\dev\src\misc\[29, 23, 19, 17, 13, 11, 7, 5, 3, 2] (The system cannot find the file specified)] at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:206) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:181) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:235) at javax.xml.bind.JAXB.unmarshal(JAXB.java:205) ... 7 more Caused by: java.io.FileNotFoundException: C:\dev\src\misc\[29, 23, 19, 17, 13, 11, 7, 5, 3, 2] (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:138) at java.io.FileInputStream.<init>(FileInputStream.java:97) at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90) at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:609) at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:799) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203) ... 10 more 呢?有一个看似不可避免的public static void main(String[] args)。制作S b并使用静态初始化程序调用{​​{1}},以消除static及其b要求。

main

输出现在包含String[],但输出的其余部分完好无损; st\u0061tic { b(10\u0029\u003b } st\u0061tic void b(int b\u0029{ // ... 被链接。

ExceptionInInitializerError