Счетчики обнаружения языка полиглот


11

Quines это весело. Полиглоты тоже веселые. Полиглоты Quine существуют, но мы можем поднять планку еще выше.

Напишите файл, содержащий действительную программу для языков α, β и γ. Когда файл исполняется (возможно, после его компиляции) как языковая программа α или β, выходные данные программы должны иметь ту же форму, что и действительное представление для этого конкурса. Если ваш файл выполняется как программа на языке γ, он должен вывести число. Значение этого числа - цепочка предыдущих выполнений программы, интерпретируемая как двоичное число.

Это объяснение может быть немного трудно понять, поэтому вот пример. Пусть Α, Β и Γ - функции, которые выполняют свой ввод как язык α, β или γ соответственно. запрограммируйте и верните выходные данные этих программ. Пусть х будет действительным представлением на этот конкурс. Тогда следующее выражение, где мы обрабатываем x на языке β, α, β, α, α, β и γ в этом порядке, даст 41, поскольку 41 10 = 101001 2 .

Γ (Β (Α (Α (Β (Α (Β ( x ))))))))

Вы не можете предполагать, что предпоследнее выполнение в цепочке является выполнением на языке β. Для случая, когда ваше оригинальное представление выполняется непосредственно как языковая программа γ, оно должно вывести 0.

Ваша программа должна вести себя корректно до 16 сборников в цепочке; то есть наибольшее число, которое ваша программа может распечатать в конце, составляет 2 15 - 1. Конечно, вашей программе разрешено поддерживать более длинные цепочки компиляции.

Это конкурс популярности для поощрения творческих решений. Представление с наибольшим количеством голосов выигрывает.


Могут ли эти три языка быть равными (даже если это резко снизит количество голосов)?
Згарб

6
@Zgarb Я хотел бы увидеть решение, в котором некоторые (или все) языки равны. Давайте посмотрим, как вам удается различать равные языки.
FUZxxl

1
...Понятно. : D Я прочитал вызов слишком поспешно.
Згарб

@Zgarb как насчет разных версий одного и того же языка? magic += Number(System.env.lang_version[-1])
Джон Дворжак

1
+1 за использование греческих букв вместо скучных a,b,cили 1,2,3=)
flawr

Ответы:


13

Питон 2, Питон 3,> <> (Рыба)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

Объяснение Python

Интерпретаторы Python 2 и Python 3 работают аналогично, за исключением того, что v=int(1/2*2)переменная получает разные значения ( 0и 1), так как Python 2 использует деление с плавающей запятой, а Python 3 использует целочисленное деление.

При каждом запуске они добавляют выражение +0*2или +1*2 в первую строку (после #;n) и в xстроку (после последней команды записи). Интерпретатор> <> использует первое дополнение, а Питоны используют второе для создания правильных квиней.

Код после B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> (Рыба) объяснение

Когда вы запускаете интерпретатор> <>, указатель кода отскакивает от #переносов вокруг первой строки и начинается с конца первой строки, а заголовок West начинает помещать числа в стек. Если оператор приходит ( +или *), он выталкивает два верхних элемента из стека и возвращает результат. С помощью этого метода мы получаем представление base2 предыдущих прогонов ( 13в предыдущем примере). Это желаемое число, поэтому мы выводим его с помощью nи заканчиваем с ;.


Это довольно мило.
FUZxxl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.