Я нашел способ вывести простые числа без использования System.out
, FileDescriptor.out
или return
. В моем методе не используются «простые» символы.
Это было очень сложно, потому что e
встречается повсюду в именах пакетов Java, именах классов и именах методов. Кроме того, S
должно быть запрещено, потому что это число 83
в Юникоде, а 83
— простое число. Его побег Unicode \u0053
содержит 5
, чей символ Unicode 53
также является простым. Вот все символы, для которых мы не можем использовать escape-последовательность 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
.
- Платформы ведения журналов, которые обычно используют класс
Logger
, содержащий e
.
Вот символы, для которых мы можем использовать escape-последовательности 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
в своем имени и в каждом суперклассе до Throwable
. Мне потребуется использовать предложение throws
, которое включает имя исключения, содержащее e
. Я не мог extend
ни одного класса, потому что 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
.
Этот метод создает DataBindingException
, который не отмечен.
javax.xml.bind.JAXB.unmarshal(stringFormOfOutput, Long.class)
вывел список через DataBindingException
, без e
.
Теперь все, что нам нужно сделать, это преобразовать int[]
в String
. Преобразование строк путем объединения массива в ""
не работает, поскольку массивы как объекты в Java, не переопределяйте toString()
. Arrays.toString
отсутствует из-за S
.
Мы можем использовать Arrays.asList
, чтобы получить List
из данных. Но Arrays.asList(f)
дает List<int[]>
, а не List<Integer>
, что усугубляет проблему. Изменение типа f
на Integer[]
не сработает, у которого есть e
. Изменение типа f
на Long[]
работает.
Преобразование массива в String
происходит следующим образом.
Long c,d,f[]...
""+Arrays.asList(f)
Вместо оператора return
создайте метод void
и вызовите unmarshal
. Использование Long
означает, что необходимы некоторые другие настройки, такие как использование литералов long
и fill
заполнение массива нулями вместо null
s по умолчанию.
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 для выполнения требований.
Вызов этого метода b
с 10
в качестве аргумента дает следующий результат, где [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)
...
person
rgettman
schedule
21.02.2015