Python: Keşke PHP olsaydım [kapalı]


8

Taşçı hakkında eski halinden asla memnun olmayan bir hikaye var. Güneş olabilmesini diledi ve öyle oldu. Bulutlar tarafından engellendi, bir bulut olmak istedi ve bir bulut haline geldi. Rüzgar patladığında, rüzgar olmasını istedi. Dağın yanında durdu, bir dağ olmayı diledi ve böylece bir oldu. Ancak kısa süre sonra bir taşçı tarafından saldırıya uğradı ve taşçı olmak istiyordu.

Benzer şekilde, göreviniz içinde bulunduğu dilden hiç memnun kalmayan bir program yazmaktır. Programınız, onu farklı bir dile çevirmek için bir dizi normal ifade yerine koymalıdır. Ve bunun gibi.

kurallar

  1. Bir programı istediğiniz dilde yazın.
  2. Program en az iki bölümden oluşan bir seri çıkarmalıdır. Segment, noktalı virgülle ayrılmış bir grup metindir. Ancak, normal ifadenin içinde noktalı virgül varsa, bu bölümün parçalanması geçersiz sözdizimi ile sonuçlanacak şekilde segmentleri ayırmaz. Örneğe bakın.
  3. İlk segment, bulunacak bir normal ifade modelidir ve ikinci segment, yedek modeldir. Üçüncüsü başka bir "bul" kalıbı, dördüncüsü ise bir "değiştir" kalıbı vb.
  4. Normal ifade kalıplarını programa uygulayın. İlk segmentteki deseni ikincisiyle değiştirin; üçüncü kalıbı dördüncü kalıpla değiştirin, vb.
  5. Sonuç, farklı bir dilde bir program olmalıdır, ki bu da kendisi 2 ila 4 kurallarını takip eder.
  6. Kullanılan diller sonsuz, tekrar eden bir döngü oluşturmalıdır.
    • Örneğin, Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Puanınız döngü periyodudur. Bağlar en kısa başlangıç ​​kod uzunluğu ile kesilir.
    • Yukarıdaki örnekte, puan üçtür.
  8. Döngünün her yinelemesinde, hiçbir dil bir kereden fazla kullanılamaz.
  9. Kural 5 ve 7 için uyumlu diller (C ve C ++) ve aynı dilin farklı sürümleri (Python 2 ve Python 3) aynı kabul edilir.
  10. Programların kendilerinin tekrarlanmasına gerek yoktur.
    • Yukarıdaki örnekte, birinci ve dördüncü programlar farklı olabilir.
  11. Regex'in herhangi bir sürümü kabul edilebilir, ancak tüm programlar için aynı şekilde kullanılmalıdır.
  12. Her program için toplam çıktı 100 karakteri aşamaz.
  13. Her çıktı, programı gerçekten değiştirmek için talimatlar içermelidir. Yani, döngüdeki iki ardışık program aynı olamaz.

Misal

Python -> Yakut -> Python -> ...

print "uts;Z;rint;uts;Z(?=;Z);rint"

Çıktılar:

uts;Z;rint;uts;Z(?=;Z);rint

Segmentler:

FIND     ;    REPLACE
uts      ;    Z
rint     ;    uts
Z(?=;Z   ;    rint   (breaking the first segment in two would result in invalid syntax)

Normal ifade değişikliklerini sırasıyla uygulamak bize şunları verir:

print "Z;Z;rint;Z;Z(?=;Z);rint"      # replace each "uts" with "Z"
puts "Z;Z;uts;Z;Z(?=;Z);uts"         # replace each "rint" with "uts"
puts "rint;Z;uts;rint;Z(?=;Z);uts"   # replace each "Z" followed by ";Z" with "rint"

Son satırı çalıştırmak bize bunu tekrar Python koduna dönüştürme talimatlarını verir.


Kod boyutunu kravat kırıcı olarak kullanıyorsanız, gerçekten 100 karakter sınırına ihtiyacımız var mı?
Martin Ender

@ MartinBüttner Evet; neden olmasın?
Ypnypn

Tabii, ama bundan daha uzun bir karakter \;;)
Martin Ender

C ++, C ile mutlaka uyumlu değildir
golfer9338

8
Sanırım muhtemelen döngüdeki tüm programların farklı olmasını istersiniz. Eğer yanılıyorsam, lütfen belirtin - ve açık çözüm üzerinde öncelik talep ediyorum.
Peter Taylor

Yanıtlar:


6

2 Diller: Python, Ruby; 33 29 bayt

İşte Python ve Ruby'yi yapmanın başka bir yolu, bu meydan okumadaki olandan biraz daha kısa:

Python:   print'^;puts"^.*?\\42#\\73"#'
prints:   ^;puts"^.*?\42#\73"#

Ruby:     puts"^.*?\42#\73"#print'^;puts"^.*?\\42#\\73"#'
prints:   ^.*?"#;

Karışıma PHP eklemek çok zor olmamalı .


1

2 dil: Python 2 ve Befunge-93, 77 bayt

Bu kez kuralları dikkatlice okuduktan sonra gerçek bir cevap buldum. Herhangi bir ödül kazanmaz, ancak Befunge programlamak için çok eğlencelidir.

u=u">>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u"
print u

Bu Python programının çıktıları:

>>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u

Hangi bu değişimleri verir:

FIND         REPLACE
>>>>>:#,_@   Z
print        >>>>>:#,_@
Z(?=;Z)      print
<v           Y
u            <v
Y(?=;Y)      u

Bu programı bu Befunge programına dönüştüren:

<v=<v"print;Z;>>>>>:#,_@;print;Z(?=;Z);>>>>>:#,_@;u;Y;<v;u;Y(?=;Y);<v"
>>>>>:#,_@ <v

Belki bir satır yapıp yapamayacağımı göreceğim. Açıkçası, Befunge'in bu tür bir problem için çalışmasına biraz şaşırdım.

(Bir grubu sildiğiniz ve sildiğiniz için özür dilerim; bir saniyeliğine panikliyordum çünkü programın işe yaramayabileceğini düşündüm.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.