Cyclic Polyglot Challenge (Cops)

11

Cyclic Polyglot Challenge

Dies ist der Thread der Polizei. Den Räuberfaden finden Sie hier .

Cyclic Polyglot

Ein zyklischer Polyglot mit N Elementen ist ein vollständiges Programm, das in N verschiedenen Sprachen ausgeführt werden kann. Wenn das Programm in jeder Sprache ohne Eingabe ausgeführt wird (möglicherweise vorbehaltlich dieser Ausnahme ), sollte es den Namen einer Sprache an STDOUT drucken. Insbesondere wenn das Programm in der K-ten Sprache ausgeführt wird, sollte es den Namen der (K ​​+ 1) -ten Sprache drucken. Wenn das Programm in der N-ten Sprache ausgeführt wird (dh der endgültigen Sprache in einem N-Element-Zyklus), sollte der Name der ersten Sprache gedruckt werden.

Ein Beispiel könnte nützlich sein.

a = [[ v = 7, puts('Befunge') ]]
__END__
= print("Ruby")
-->*+:292*++,,@
--3    9
--7    *
--^,:-5<

Wenn Sie dieses Programm mit Lua ausführen, wird die Zeichenfolge "Ruby" gedruckt. Wenn Sie dieses Programm in Ruby ausführen, wird die Zeichenfolge "Befunge" gedruckt. Wenn Sie dieses Programm in Befunge ausführen, wird die Zeichenfolge "Lua" gedruckt und der Zyklus abgeschlossen. Dieses Programm besteht aus 3 Zyklen, bestehend aus Lua, Ruby und Befunge.

Dieselbe Sprache kann nicht zweimal in einem Zyklus erscheinen, und verschiedene Versionen derselben Sprache (wie Python 2 und Python 3) können nicht im selben Zyklus erscheinen.

Cops

Ihre Herausforderung besteht darin, einen N-zyklischen Polyglot zu schreiben, wobei N mindestens 2 ist. Anschließend müssen Sie dem Programm einige Zeichen hinzufügen, ersetzen und löschen, um einen M-zyklischen Polyglot zu erzeugen, bei dem M streng größer als N ist Sie sollten dann den kürzeren, N-zyklischen Polyglot (und die Sprachen, in denen er ausgeführt wird) sowie die Anzahl der Zeichen, die Sie geändert haben, um den längeren Polyglot zu erzeugen, veröffentlichen. Ihre Punktzahl ist N, die Anzahl der Sprachen in Ihrem kürzeren Zyklus.

Die Räuber werden versuchen, Ihren längeren Zyklus zu identifizieren. Wenn nach sieben Tagen niemand Ihre Lösung erfolgreich geknackt hat, sollten Sie Ihre Antwort so bearbeiten, dass sie sicher ist. Sie sollten zu diesem Zeitpunkt auch Ihren längeren M-zyklischen Polyglot veröffentlichen.

Räuber

Angesichts des N-zyklischen Polyglots eines Polizisten und der Anzahl der Zeichen, die er hinzugefügt hat, um einen größeren Polyglot-Zyklus zu erzeugen, ist es Ihr Ziel, diesen größeren Zyklus zu erzeugen. Wenn Sie einen längeren Zyklus erzeugen können, indem Sie so viele Zeichen wie der Cop oder weniger Zeichen hinzufügen, löschen oder ersetzen , haben Sie den Polyglot des Cop geknackt. Ihre Punktzahl ist die Länge des neuen Zyklus, den Sie erstellt haben. Ihr neuer Polyglot muss nicht mit dem geheimen Polyglot des Polizisten identisch oder sogar ähnlich sein. es muss nur größer sein als das vorhandene.

Ihre Lösung kann auch Risse aufweisen. Wenn ein anderer Räuber vorbeikommt und einen Zyklus erzeugt, der streng länger ist als der Ihre, ausgehend von der Polyglotte desselben Polizisten, haben sie Ihre Punkte gestohlen.

Gültige Programmiersprachen

Da diese Herausforderung indirekt das Erraten von Programmiersprachen beinhaltet, die von anderen Teilnehmern verwendet werden, ist die Definition einer Programmiersprache für die Zwecke dieser Herausforderung etwas strenger als die übliche Definition. Eine in dieser Herausforderung verwendete Programmiersprache muss alle folgenden Bedingungen erfüllen.

Schlussbemerkungen

  • Der Code, den Sie schreiben, sollte ein eigenständiges Programm in jeder Sprache sein, in der er ausgeführt werden soll. Funktionen oder Codefragmente sind nicht zulässig.
  • Ihr Programm erhält keine Eingabe über STDIN. Ebenso sollte Ihr Programm nichts auf STDERR drucken.
  • Die Punktzahl eines Polizisten ist die Anzahl der Sprachen im Zyklus der von ihm veröffentlichten Polyglotte. Der Polizist sollte die Sprachen veröffentlichen, in denen der veröffentlichte Polyglot korrekt ausgeführt wird, sowie die Anzahl der Zeichen, die er hinzugefügt hat, um einen längeren Polyglot zu erzeugen. Sie sind nicht dafür verantwortlich, die Sprachen zu veröffentlichen, je länger versteckte Polyglotten laufen, bis ihre Antwort sicher ist.
  • Die Punktzahl eines Räubers ist die Anzahl der Sprachen, in denen der modifizierte Polyglot ausgeführt wird. Wie beim Cop sollte der Räuber die Liste der Sprachen veröffentlichen, in denen der Polyglot korrekt ausgeführt wird.
  • Die Anzahl der geänderten Zeichen sollte in Levenshtein-Entfernung berechnet werden.
Silvio Mayolo
quelle
3
"Die Sprache muss über einen frei verfügbaren Interpreter oder Compiler verfügen. Sorry, Mathematica-Fans, aber die Räuber müssen in der Lage sein, Ihre Lösung zu überprüfen." Was ist los mit der Wolfram Open Cloud? sandbox.open.wolframcloud.com
Scott Milner
Ich war mir dessen nicht bewusst, da ich eine lokale Kopie von Mathematica auf meinem Computer habe. Kommentar entfernt.
Silvio Mayolo
Ist es in Ordnung für N = 2 und M = 3?
Mdahmoune
Ja das ist ok. Ihre Punktzahl wird dann einfach 2 sein, aber das ist vollkommen akzeptabel.
Silvio Mayolo

Antworten:

1

C (gcc) , 126 Bytes

M=N+1

Levenshtein(polyglot(M),polyglot(N))beträgt 36 Bytes

#include<stdio.h>
#define print(a) main(){int z[1];if(sizeof(0,z)==4)printf("C(gcc)");else printf("Perl5");}
print("C++(gcc)")

Probieren Sie es online aus!

mdahmoune
quelle
Gebrochen (mit Levenshtein von 10)
Stephen