Bu program yazdırılamayan karakterlerle dolu, bu yüzden burada bir hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Not: Bu, negatif sayıları giremeyen sayısal bir giriş yordamı kullanır, bu nedenle bu gönderim yalnızca negatif olmayan tamsayılarla sınırlıdır.
Polis ve soyguncunun karşılaştığı zorluklarla ilgili bir sorun , kodun açıklamalarını yazmamanızdır (kırılmasını zorlaştırmak için). Öte yandan, bu, benim başımın belaya girmesine gerek olmadığı anlamına geliyor.
Dil olarak 7'yi seçtim çünkü özellikle sıkıştırılmış gösterimde, okuması oldukça zor ve neden yazılan 8 bitlik programlarda gezinmekle başa çıkmak zorunda olanların sadece benim olması gerektiğini anlamıyorum . 3 bit kodlama. İyi şanslar!
açıklama
Şimdi programın kırıldığına göre (kaba kuvvetle, ne yazık ki; bu kısa çözümlerde her zaman bir tehlikedir), ne aldığımı da açıklayabilirim. Bu aslında programı okuyarak çözülebilirdi; Bunu çok daha zorlaştırabilirdim, ama kaba kuvvet çatlakları olduğunda kötü bir fikir gibi geldi.
Programı daha doğal bir kodlamayla temsil ederek başlayacağız. ; Her zamanki gibi, kalın sayılar (bir programda Temsil değildir hepsi hemen çalışır komutları gösterir 6ve 7ancak 2etmek 5, unbolded sayılar onların kaçtı eşdeğerleri (temsil değildir) 0için 5orijinal programda Temsil bunların tümü; notu bu 0bir kaçtı 6ve 1kaçtı 7):
112 7 1 7 34002 77 023 67 13303
7 program kaynağında mevcut olan komutlar dizisi, temelde sadece orijinal yığını temsil eden bir hazır bilgi olduğu anlamına gelir (sadece kaçan komutlarla yapabileceğiniz başka hiçbir şey yoktur 6ve 7). Yani bir programın yapacağı ilk şey, yığına bir sürü şey itmek. Programın çalışmasından sonra yığının nasıl göründüğü aşağıda açıklanmaktadır ( |7'de her zamanki gibi yığın öğelerini ayırır):
772 | 7 | 34662 | 023 | 73363
Son yığın elemanı daha sonra çalıştırılacak kod (yığın üzerinde kalırken) olmak üzere kopyalanır. Olduğu gibi, bu kodun programın tek kısmı; her şey sadece veridir. İşte onun için çevirdiği şey:
73363
7 Yığına boş bir eleman itin
3 Üst yığın elemanını çıkarın , elemanı aşağıdan atın
73 Bunların birleşik etkisi: üst yığın elemanını atın
3 Üst yığın elemanını çıkarın, elemanı aşağıdan atın
6 Üst yığın elemanından kaçın, sonra Aşağıdaki elemana ekle
3 Üst elek elemanını çıkar, aşağıdaki elemana at
Başka bir deyişle, bu çoğunlukla sadece bir grup I / O talimatıdır. Bunu detaylı olarak inceleyelim:
7373363hala yığının en üstünde olanı atar .
3çıktılar 023ve atar 34662. Böylece 34662, programın diğer sürümünde ihtiyaç duyulan baytları depolamak için kullanılan bir yorum olduğu görülebilir . 023Çıktı ne zaman gelince, G / Ç formatı 0'ı (tamsayılar) seçer, daha sonra 23uygulamanın bir tamsayı girmesini isteyen bir yönergedir (7'de, giriş isteyen özel kodlar yazarak giriş yaparsınız). Girdi, aşağıdaki yığın elemanının kopyaları yapılarak yapılır, örneğin giriş tamsayısı 10 ise, bir sonraki yığın elemanı (şu anda 7) olacaktır 7777777777. Bu nedenle, kullanıcıdan girdiyi ondalık olarak kabul ediyoruz, ancak birleşik olarak depolanıyor.
6üst yığın elemanının kaçar (her bir örneğini değiştirmek 7için 1, tamamen oluşan şeritler bu olduğunu 7s öncelenir), daha önce yığın elemanı için ekler ( 772). Yani verilerimiz artık bir şeylere benziyor 7721111111111.
- Son olarak, söz
3konusu yığın öğesini çıkarır (ve varsayılan başlangıç yığınının parçası olan boş bir yığın öğesi çıkar). Onun değeri sayısını alınarak hesaplanır 1s ve 7s ve sayısını çıkararak 0s ve 6s. ( 2Ortada çoğu durumda yoksayılır; dizenin sonunda ise yok sayılmak yerine izleyen bir yeni satır olur, ancak PPCG kuralları bunu önemsemez.) Bu nedenle çıktı orijinaldir giriş artı 2.
Bu noktada, yığında yararlı bir şey yoktur ve programdaki hiçbir şey yoktur, bu yüzden program sona erer.
Bunu nasıl tersine çeviririz? Bu değişen basit bir mesele 11için 00biz doğrusu yüksek 2'den, bu 2 alt hale girişine karakterleri prepending ediyoruz böylece. Bir var 00elverişli gizli sekiz sekizlik rakam biz takas basitçe yapabilirsiniz programında (şimdiye sekizlik rakam ve bayt birbirleri ile bir hizaya), bu yüzden ilgili daha 11başlangıcında.