Лічильники виявлення мови псевдокінних поліглотів


11

Квінки - це весело. Поліглоти теж веселі. Поліглот Квіни існують, але ми можемо підняти планку ще вище.

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

Це пояснення може бути трохи важким для розуміння, тому ось приклад. Нехай Α, Β і Γ - функції, які виконують свій вхід як мова α, β, або γ відповідно. програмувати і повертати вихід цих програм. Нехай x є дійсним поданням на цей конкурс. Тоді наступне вираз, де ми обробляємо х через мову β, α, β, α, α, β і γ у цьому порядку, дасть 41, оскільки 41 10 = 101001 2 .

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

Ви можете не припускати, що передостаннє виконання у ланцюзі - це виконання мовою β. У випадку, коли ваше оригінальне подання безпосередньо виконується як мова γ-програми, воно має надрукувати 0.

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

Це конкурс популярності для заохочення творчих рішень. Подача з найбільшою кількістю голосів виграє.


Чи можуть три мови бути рівними (навіть якщо це різко зменшить кількість результатів)?
Згарб

6
@ Zgarb Я хотів би побачити рішення, де деякі (або всі) мови рівні. Подивимось, як вам вдається розрізнити рівні мови.
FUZxxl

1
...Розумію. : DI прочитав виклик занадто поспішно.
Згарб

@Zgarb Як щодо різних версій однієї мови? magic += Number(System.env.lang_version[-1])
Джон Дворак

1
+1 за використання грецьких букв замість нудних a,b,cабо 1,2,3=)
недолік

Відповіді:


13

Python 2, Python 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])

> <> (Риби) пояснення

Коли ви запустите інтерпретатор> <>, вказівник коду #відштовхується від обгортань навколо першого рядка, а починаючи з кінця першого рядка і заголовка Захід починає натискати числа на стек. Якщо оператор приходить ( +або *), він вискакує два верхні елементи зі стека і відштовхує результат. За допомогою цього методу ми закінчуємо представленням base2 попередніх прогонів ( 13у попередньому прикладі). Це потрібне число, тому ми виводимо його nі закінчуємо ;.


Це досить приємно.
FUZxxl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.