Вывод или возврат в Java без использования буквы e или цифры 5

Для этого вызова на PCG.SE требуется написать функцию/программу, которая возвращает/выводит первые N простые числа.

Однако символы с простыми кодовыми точками не допускаются в программе.

Два из этих символов — 5 и e. Кодовые точки любой буквы содержат 5. Из-за этого \u{codepoint} не будет работать для этих двух букв.

Используя escape-последовательности, я могу удалить из кода все простые символы, кроме e в return.

Я мог бы использовать System.out или FileDescriptor.out, но оба содержат букву e.

Есть ли способ вернуть или вывести без использования 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;
}

person TheNumberOne    schedule 20.02.2015    source источник
comment
в чем вопрос?   -  person piotrek    schedule 20.02.2015
comment
@piotrek Вопрос четко сформулирован: есть ли способ вернуть или вывести без использования e или 5?   -  person ProgramFOX    schedule 20.02.2015
comment
Вы можете заполнить массив, переданный в качестве параметра, то есть выходной параметр.   -  person Adrian Leonhard    schedule 20.02.2015
comment
@AdrianLeonhard chat.stackexchange.com/transcript/message/20169645#20169645   -  person TheNumberOne    schedule 20.02.2015


Ответы (1)


Я нашел способ вывести простые числа без использования 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 содержит es.

Это оставляет непроверенные исключения. Наиболее вероятным использованием будет IllegalArgumentException, созданный не этим кодом напрямую, а вызовом чего-то встроенного, которое выдает IllegalArgumentException.

  • Enums помогли бы, за исключением того, что 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заполнение массива нулями вместо nulls по умолчанию.

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
comment
Очень мило, я не уверен, должен ли я быть впечатлен или потрясен :D - person Adrian Leonhard; 21.02.2015
comment
Это потрясающе! Если бы у меня было больше репутации, я бы дал тебе награду. - person TheNumberOne; 21.02.2015
comment
Однако вы забыли экранировать оператор +. - person TheNumberOne; 21.02.2015
comment
Хороший улов! Теперь я сбежал от оператора +. - person rgettman; 22.02.2015
comment
+1. Вам должно быть довольно сложно это понять, и ваше объяснение того, как вы это сделали, завораживает. (Кстати, сколько времени ушло на это?) - person TNT; 22.02.2015