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

2022-09-04 08:16:43

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

但是,程序中不允许使用具有素数码位的字符。

其中两个字符是 和 。任一字母的码位都包含 .因此,不适用于这两个字母。5e5\u{codepoint}

使用转义,我可以从代码中删除除 in 之外的所有主要字符。ereturn

我可以使用或但两者都包含字母。System.outFileDescriptor.oute

有没有办法在不使用 or 的情况下返回或输出?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

我找到了一种方法来输出质数而不使用 , , 或 .我的方法不使用“主要”字符。System.outFileDescriptor.outreturn

这是非常棘手的,因为在Java包名称,类名和方法名中到处都是。此外,必须禁止,因为它是Unicode中的数字,并且是素数。它的 Unicode 转义包含 一个其 Unicode 字符也是素数的。以下是在这些规则下我们不能使用Unicode转义的所有字符:eS8383\u0053553

  • %(37是素数,有一个\u00255)
  • 5(53是素数,有一个\u00355)
  • S(83是素数,有一个\u00535)
  • Y(89是素数,有一个\u00595)
  • e(101是素数,有一个\u00655)

这消除了:

  • 任何方法,如 、、、和 。toStringfromStringparseIntvalueOfvalues
  • java.beansjava.netjava.lang.reflect
  • Class.forName
  • 使用运算符。new
  • 通常使用包含 的类的日志记录框架。Loggere

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

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

尝试生成消息包含所需输出的异常是满足 Java 中要求的唯一方法。我们不能使用已检查的异常,因为我能找到的几乎所有已检查的异常都在其名称中使用 a,并且在每个超类中一直到 .我将被要求使用一个包含异常名称的子句,该子句包含.我不能任何类,因为包含s。eThrowablethrowseextendextendse

这留下了未经检查的例外。最有可能的用法是不是由此代码直接创建的,而是通过调用内置的,该内容会引发 .IllegalArgumentExceptionIllegalArgumentException

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

此方法将引发一个未选中的数据绑定异常

  • javax.xml.bind.JAXB.unmarshal(stringFormOfOutput, Long.class)通过 不带 .DataBindingExceptione

现在我们所要做的就是将 转换为 .通过将数组串联为的字符串转换不起作用,因为数组作为 Java 中的对象不会覆盖 toString()。 由于 .int[]String""Arrays.toStringS

我们可以用它来获取数据。但是Arrays.asList(f)给出了一个List<int[]>,而不是List<Integer>,使问题复杂化。将 的类型更改为 将不起作用,该类型具有 .将 的类型更改为 工作。Arrays.asListListfInteger[]efLong[]

数组到 a 的转换如下所示。String

Long c,d,f[]...
""+Arrays.asList(f)

在语句的位置,创建方法 ,然后调用 。means 需要使用一些其他调整,例如使用文本和用零而不是默认 s 对数组进行处理。returnvoidunmarshalLonglongfillnull

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

转义“主要”字符:

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
}

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

将此方法作为参数调用将产生以下输出,即前 10 个素数:b10[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)SbstaticbmainString[]

st\u0061tic
{
   b(10\u0029\u003b
}

st\u0061tic void b(int b\u0029{
// ...

输出现在包含 一个 ,但输出的其余部分保持不变;是链接的。ExceptionInInitializerErrorDataBindingException

Exception in thread "main" java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:87)
Caused by: 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)
...

答案 2