在 Java 中输出或 return 而不使用字母 e 或数字 5
Output or return in Java without using the letter e or digit 5
对于PCG.SE上的这个challenge,需要写一个function/program,即returns/outputs前N个素数。
但是程序中不允许出现带素码的字符。
其中两个字符是 5
和 e
。任一字母的代码点都包含 5
。因此,\u{codepoint}
对这两个字母不起作用。
使用转义符,我可以从代码中删除除 return
中的 e
之外的所有素数字符。
我可以使用 System.out
或 FileDescriptor.out
但两者都包含字母 e
.
有什么方法可以 return 或不使用 e
或 5
输出吗?
这里是我的转义字符代码:
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;
}
我找到了一种无需使用 System.out
、FileDescriptor.out
或 return
即可输出质数的方法。我的方法不使用 "prime" 个字符。
这非常棘手,因为 e
在 Java 包名称、class 名称和方法名称中无处不在。此外,S
必须被禁止,因为它是 Unicode 中的数字 83
,而 83
是素数。它的 Unicode 转义符 \u0053
包含一个 5
,其 Unicode 字符 53
也是质数。以下是我们不能根据这些规则使用 Unicode 转义符的所有字符:
%
(37是质数,\u0025
有一个5
)
5
(53是质数,\u0035
有一个5
)
S
(83是质数,\u0053
有一个5
)
Y
(89是质数,\u0059
有一个5
)
e
(101是质数,\u0065
有一个5
)
这消除了:
- 任何方法,例如
toString
、fromString
、parseInt
、valueOf
和 values
。
java.beans
、java.net
、java.lang.reflect
包
Class.forName
new
运算符的使用。
- 通常使用包含
e
. 的 Logger
class 的日志记录框架
以下是我们可以使用 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 中要求的唯一方法。我们不能使用已检查的异常,因为我能找到的几乎所有已检查的异常都在它们的名称中使用 e
,并且在每个 superclass 到 Throwable
中。我将需要使用 throws
子句,其中包含包含 e
的异常名称。我不能 extend
任何 classes,因为 extends
包含 e
s.
这留下了未经检查的异常。最有可能的用途是 IllegalArgumentException
,它不是由这段代码直接创建的,而是通过调用抛出 IllegalArgumentException
.
的内置内容创建的。
Enum
s 会有所帮助,除了 valueOf
包含 e
.
javax.crypto.Mac.getInstance
有一个 e
;它无论如何都会抛出一个已检查的异常。
javax.naming.ldap.Rdn.unescapeValue("\b" + stringFormOfOutput)
通过异常输出列表,但该方法有一个 e
.
java.util.UUID.fromString
通过异常输出列表,但该方法有一个 S
.
This method throws a 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
因 S
.
而出局
我们可以使用 Arrays.asList
从数据中得到 List
。但是 Arrays.asList(f)
gives a List<int[]>
, not a List<Integer>
,使问题更加复杂。将 f
的类型更改为 Integer[]
将不起作用,它有一个 e
。将 f
的类型更改为 Long[]
有效。
数组到String
的转换如下。
Long c,d,f[]...
""+Arrays.asList(f)
代替 return
语句,创建方法 void
,然后调用 unmarshal
。 Long
的使用意味着需要进行一些其他调整,例如使用 long
文字和 fill
用零代替默认的 null
s.[=138] =]
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);
}
转义 "prime" 个字符:
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
作为参数调用此 b
方法会产生以下输出,其中 [29, 23, 19, 17, 13, 11, 7, 5, 3, 2]
是前 10 个素数:
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
static
并调用 b
,以消除 main
及其 String[]
要求。
st\u0061tic
{
b(10\u0029\u003b
}
st\u0061tic void b(int b\u0029{
// ...
输出现在包含 ExceptionInInitializerError
,但输出的其余部分完好无损; DataBindingException
已链接。
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)
...
对于PCG.SE上的这个challenge,需要写一个function/program,即returns/outputs前N个素数。
但是程序中不允许出现带素码的字符。
其中两个字符是 5
和 e
。任一字母的代码点都包含 5
。因此,\u{codepoint}
对这两个字母不起作用。
使用转义符,我可以从代码中删除除 return
中的 e
之外的所有素数字符。
我可以使用 System.out
或 FileDescriptor.out
但两者都包含字母 e
.
有什么方法可以 return 或不使用 e
或 5
输出吗?
这里是我的转义字符代码:
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;
}
我找到了一种无需使用 System.out
、FileDescriptor.out
或 return
即可输出质数的方法。我的方法不使用 "prime" 个字符。
这非常棘手,因为 e
在 Java 包名称、class 名称和方法名称中无处不在。此外,S
必须被禁止,因为它是 Unicode 中的数字 83
,而 83
是素数。它的 Unicode 转义符 \u0053
包含一个 5
,其 Unicode 字符 53
也是质数。以下是我们不能根据这些规则使用 Unicode 转义符的所有字符:
%
(37是质数,\u0025
有一个5
)5
(53是质数,\u0035
有一个5
)S
(83是质数,\u0053
有一个5
)Y
(89是质数,\u0059
有一个5
)e
(101是质数,\u0065
有一个5
)
这消除了:
- 任何方法,例如
toString
、fromString
、parseInt
、valueOf
和values
。 java.beans
、java.net
、java.lang.reflect
包Class.forName
new
运算符的使用。- 通常使用包含
e
. 的
Logger
class 的日志记录框架
以下是我们可以使用 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 中要求的唯一方法。我们不能使用已检查的异常,因为我能找到的几乎所有已检查的异常都在它们的名称中使用 e
,并且在每个 superclass 到 Throwable
中。我将需要使用 throws
子句,其中包含包含 e
的异常名称。我不能 extend
任何 classes,因为 extends
包含 e
s.
这留下了未经检查的异常。最有可能的用途是 IllegalArgumentException
,它不是由这段代码直接创建的,而是通过调用抛出 IllegalArgumentException
.
Enum
s 会有所帮助,除了valueOf
包含e
.javax.crypto.Mac.getInstance
有一个e
;它无论如何都会抛出一个已检查的异常。javax.naming.ldap.Rdn.unescapeValue("\b" + stringFormOfOutput)
通过异常输出列表,但该方法有一个e
.java.util.UUID.fromString
通过异常输出列表,但该方法有一个S
.
This method throws a 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
因 S
.
我们可以使用 Arrays.asList
从数据中得到 List
。但是 Arrays.asList(f)
gives a List<int[]>
, not a List<Integer>
,使问题更加复杂。将 f
的类型更改为 Integer[]
将不起作用,它有一个 e
。将 f
的类型更改为 Long[]
有效。
数组到String
的转换如下。
Long c,d,f[]...
""+Arrays.asList(f)
代替 return
语句,创建方法 void
,然后调用 unmarshal
。 Long
的使用意味着需要进行一些其他调整,例如使用 long
文字和 fill
用零代替默认的 null
s.[=138] =]
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);
}
转义 "prime" 个字符:
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
作为参数调用此 b
方法会产生以下输出,其中 [29, 23, 19, 17, 13, 11, 7, 5, 3, 2]
是前 10 个素数:
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
static
并调用 b
,以消除 main
及其 String[]
要求。
st\u0061tic
{
b(10\u0029\u003b
}
st\u0061tic void b(int b\u0029{
// ...
输出现在包含 ExceptionInInitializerError
,但输出的其余部分完好无损; DataBindingException
已链接。
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)
...