Bu sitede, tercüman etiketinde çeşitli dillerin uygulanmasını içeren birçok sorun vardı . Ancak, pratikte hepsi kimsenin kullanmadığı ezoterik dillerdi. Buradaki kullanıcıların çoğunun zaten bildiği pratik bir dil için bir tercüman yapma zamanı. Evet, başlığı okumakta sorun yaşıyorsanız kabuk betiğidir (sahip olduğunuzdan değil). (evet, bu zorluğu kasıtlı olarak yaptım, çünkü GolfScript ve Befunge gibi her şeyi kazanan dillerden sıkıldım, bu yüzden daha pratik programlama dilinin daha yüksek kazanma şansına sahip olduğu bazı zorlukları koydum)
Ancak, kabuk betiği nispeten büyük bir dildir, bu yüzden sizden uygulamayı istemeyeceğim. Bunun yerine, küçük bir kabuk komut dosyası işlevselliği alt kümesi yapacağım.
Karar verdiğim altküme şu altküme:
- Programları yürütme (programlar tek tırnaklara izin verilse bile yalnızca harf içerir)
- Program argümanları
- Tek tırnak (tek tırnak hariç, boşluk dahil, yazdırılabilir ASCII karakterlerini kabul etme)
- Tırnaksız dizeler (ASCII harflerine, sayılarına ve tirelerine izin verilir)
- borular
- Boş ifadeler
- Yeni satırla ayrılmış birden fazla ifade
- Sondaki / öndeki / çoklu alanlar
Bu görevde, STDIN'den girişi okumalı ve istenen her komutu çalıştırmalısınız. POSIX uyumlu işletim sistemini güvenli bir şekilde kabul edebilirsiniz, bu nedenle Windows ile taşınabilirliğe veya bunun gibi bir şeye gerek yoktur. Diğer programlara aktarılmayan programların STDIN'den okumayacağını güvenle varsayabilirsiniz. Komutların var olacağını güvenle varsayabilirsiniz. Başka hiçbir şeyin kullanılmayacağını güvenle varsayabilirsiniz. Bazı güvenli varsayımlar bozulursa, her şeyi yapabilirsiniz. En fazla 15 argümanı ve 512 karakterin altındaki satırları güvenli bir şekilde kabul edebilirsiniz (açık bellek ayırma veya benzeri bir şeye ihtiyacınız varsa - hala küçük olsalar bile, C için küçük kazanma şansı vereceğim). Dosya tanımlayıcılarını temizlemeniz gerekmez.
Programları istediğiniz zaman (tam hattı aldıktan sonra veya STDIN bittikten sonra) yürütmenize izin verilir. İstediğiniz yaklaşımı seçin.
Kabuğunuzu test etmenizi sağlayan basit test çantası (üçüncü komuttan sonra sondaki boşluklara dikkat edin):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
Yukarıdaki program aşağıdaki sonucu vermelidir:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Komut için herhangi bir argümanınız olmadığı sürece kabuğun kendisini yürütmenize izin verilmez (bu istisna, sadece argüman konduğunda kabukta komut çalıştıran Perl için yapıldı system
, ancak bu istisnayı başkaları için kötüye kullanmaktan çekinmeyin karakterleri kaydedecek şekilde yapabiliyorsanız) veya çalıştırdığınız komut kabuğun kendisidir. Birçok dilde system
kabuk yürüten işlevlere sahip olduğundan, bu muhtemelen bu zorluktaki en büyük sorundur . Bunun yerine, programları doğrudan çağıran subprocess
Python'daki modül gibi dil API'lerini kullanın . Bu yine de güvenlik için iyi bir fikir ve güvenli olmayan bir kabuk oluşturmak istemez misiniz? Bu büyük olasılıkla PHP'yi durdurur, ancak yine de seçilecek başka diller vardır.
Eğer kabuk komut programı yapacağız, kullanmak için izin verilmez eval
, source
ya da .
(bir fonksiyonu değil, bir karakter, gibi). Bence bu meydan okumayı çok kolaylaştıracaktı.
Akıllı kural ihlaline izin verilir. Açıkça izin vermediğim pek çok şey var, ama hala emin değilim hala yapmadığım şeyleri yapma izniniz var. Bazen insanların kurallarımı nasıl yorumladığına şaşırıyorum. Ayrıca, bahsetmediğim herhangi bir şey için her şeyi yapabileceğinizi unutmayın. Örneğin, değişkenleri kullanmaya çalışırsam, sabit diski silebilirsiniz (ama lütfen yapmayın).
Codegolf olduğu için en kısa kod kazanır.