Derotik Kurbağaların Deşifre


28

Derotik Kurbağaların Deşifre

Şimdi Puzzling.SE sonunda amfibi takıntılı şifremi kırdı , hadi şifresini çözmek için bir program ya da işlev yazalım!

(Bulmacayı sizin için şımartmadan önce bakmak istiyorsanız, yukarıdaki bağlantıyı şimdi tıklayın.)


Şifre nasıl çalışır

Neurotic Kurbağalarda O ught için Nispi bir in X M ud küvetler (kısaca "Neurotic kurbağalar"), her bir harfi, bir ya da iki kelime olarak şifrelenir:

  • İtalik olmayan bir kelimenin uzunluğu bir harfi temsil eder.
    • neurotic => 8 harf => H
    • frogs => 5 harf => E
    • perpendicular => 13 harf = M
  • İtalik içeren bir kelime aşağıdaki kelimeyi değiştirir, italik hale getirilmiş kelimenin uzunluğu tek ise 10, italik hale getirilmiş kelimenin bile uzunluğu 20 ise eklenir. Kelimenin herhangi biri veya tümü italik olabilir. Bir italik kelime bir italik olmayan kelime her zaman izler.
    • *o*ught to => tek, 2 => 12 => L
    • lo*u*nging calms => çift, 5 => 25 => Y

Her düz metin kelimesi bir şifreli metin cümlesine karşılık gelir ve her düz metin cümlesinin şifreli metin paragrafına karşılık gelir.

Giriş formatı

Programınız veya işleviniz, Markdown'da biçimlendirilmiş Nörotik Kurbağalar'da bir mesaj girmelidir. Giriş yalnızca yazdırılabilir ASCII ve yeni satırlardan oluşacaktır.

  • Kelimeler , regex ile eşleşen karakter dizileridir [A-Za-z0-9'].
    • Rakamlar ve harfler her ikisi de bir kelimenin uzunluğuna sayılır. QB64temsil eder D.
    • NOT: Kesme işaretleri bir kelimenin uzunluğuna sayılmaz . Isn'ttemsil Detmez, değil E.
  • Italicized harfler bir yıldız işareti ( *letters*) ile sarılır .
    • Bir veya daha fazla ardışık harf, kelimenin tamamına ( masseus*es*, *all*) kadar italikleştirilebilir ; Bir sözcükteki ardışık olmayan çoklu harfler de italikleştirilebilir ( g*e*n*e*rates).
    • İtalik yazılar hiçbir zaman birden fazla kelimeye yayılmaz, hiçbir zaman noktalama işareti içermez ve asla kesme işareti içermez.
    • Eşleştirilmemiş yıldız işaretleri ve çoklu bitişik yıldız işaretleri asla oluşmaz.
  • Noktalama aşağıdaki karakterlerden birini taşımalıdır: .,?!:;-()".
    • Bir cümle içindeki kelimeler, bir veya daha fazla noktalama karakteri ve / veya tek bir boşlukla ayrılır . Örnekler: *all* welcomed, toad*s*, newts, Ever*y*one--frogs, cap... bliss,they're (I
    • Cümleler bir veya daha fazla noktalama işareti ile bitiyor ve iki boşlukla ayrılıyor: Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
    • Paragraflar tek bir yeni satır ile ayrılır. (Bir paragrafın son cümlesinin sonunda hala bir veya daha fazla noktalama işareti var.)

Diğer karakterler girişte görünmez ve kullanılması gerekmez.

Kodunuz, sizin takdirinize bağlı olarak, girişin tek bir sondaki yeni satır olmasını bekleyebilir.

Çıkış biçimi

Girişin şifresini çözmenin sonucu bir veya daha fazla cümle olacaktır. Düz metinli harfler, büyük ve küçük harflerin herhangi bir birleşimi olabilir. Bir cümlenin içindeki kelimeler, tek boşluklarla ayrılmalıdır. Cümleler bir süre ile bitmeli (. ) ve tek bir boşlukla ayrılmalıdır. Son cümleden sonra bir boşluk bırakabilirsiniz. Çıktınızın tümü tek bir satırda olacak, ancak sonunda yeni bir satır gönderebilirsiniz.

Çeşitli detaylar

Kodunuz standart giriş ve çıkış yöntemlerinden herhangi birini kullanabilir. Bir liste veya başka bir veri yapısı değil çok satırlı bir dize olarak girdi almalı ve bir dize vermelidir.

Bayt cinsinden en kısa kod kazanır!

Test durumları

-->
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
<--
HELLO.

-->
Business standards all*o*w only *adult* amphibians.
<--
HINT.

-->
Rejoice, *a*ll frogs an*d* toads also!  Montgomery Sal*o*n opens up!  Ha*pp*y throng fill*s* street ecstatically!
<--
GOOD JOB PPL.

-->
I like 3.1415926535897.
IM*O*, it's a *b*la*st*, yeah!
<--
ADAM. MAN.

-->
*I*, happily, *th*anks 2 u *e*ditin*g* specific wor*ding*--clarifying a *bit*--betterment :D!
<--
QUARTATA.

-->
Perpendicular l*ou*nging calms.  *A* frog, a m*u*d cap... bliss!  Wallowing g*e*n*e*rates happiness.  Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap!  That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders!  G*e*t a wonderful shiat*s*u, or recei*v*e an other kind.  Masseus*es* are her*e* today!  Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth!  Th*e* Montgomery A*m*phibian Salon!  Come luxuriate today!
<--
MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.

4
Prenses gelin girişi için +1. Oh, ve senin yeteneğin için de.
Magic Octopus Urn

İtalik içeren bir kelimenin takip ettiği italik olmayan bir kelime mi var?
R. Kap

@ R.Kap Doğru. Bunu netleştirmek için soruyu düzelttim.
DLosc

Yanıtlar:


5

Perl, 72 bayt

#!perl -n
$x=/\*/?2-y/'//c%2:!print/ /?$':chr$x.0+y/'//c+64for/[\w*']+|  /g,' . '

Shebang'ı bir olarak sayarak girdi stdin'den alınır.

Örnek Kullanım

$ more in.dat
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
Perpendicular l*ou*nging calms.  *A* frog, a m*u*d cap... bliss!  Wallowing g*e*n*e*rates happiness.  Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap!  That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders!  G*e*t a wonderful shiat*s*u, or recei*v*e an other kind.  Masseus*es* are her*e* today!  Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth!  Th*e* Montgomery A*m*phibian Salon!  Come luxuriate today!

$ perl neurotic-frogs.pl < in.dat
HELLO. MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.

1
Bu cevabı ödül olarak alıyorum, çünkü ödül döneminin sonunda kendimden başka bir şey değil (gerçekten, her yere yaklaşan tek kişi).
DLosc

4

JavaScript (ES6), 172 169 157 150 bayt

@Neil sayesinde 10 bayt kaydedildi

x=>x.match(/[\w'*]+|\s+/g).map(y=>y[0]==" "?y[1]:y==`
`?". ":/\*/.test(y,l+=y.match(/\w/g).length)?(l=l%2*10+19,""):l.toString(36,l=9),l=9).join``+"."

Muhtemelen daha da geliştirilebilir. Tüm küçük harflerle çıkar.


i=0İçine taşıyarak 2 bayt kaydedin toString.
Neil

İlgilenmediğim halde, bu hataları düzeltmeye başladım ve şu konuya karar verdim:x=>x.replace(/([\w*']+)[^\w\n*' ]* ?( ?)/g,(_,y,z)=>/\*/.test(y,l=y.replace(/'/g ,"").length)?(i=l%2||2,""):l+i*10+9).toString(36,i=0)+z,i=0).replace(/\n|$/g,". ")
Neil

Şu anki haliyle çalışıyor gibi görünüyor.
primo

@Neil Teşekkürler. Bu 12 bayt kaydeder, ancak son test durumunda işe yaramaz. Bunun düzeltilmesi, 3 baytlık net kısalma için 9 ekler.
ETHproductions

@Neil Kurtulmak .replaceve sadece kullanarak .matchbaşka 12 bayt kurtardı.
ETHProductions

3

Python 2, 238 221 218 214 207 205 bayt

from re import*
def f(x):
 d='';m=0
 for w in split(r"[^\w\d*'~\n]+",sub('  ','~',x))[:-1]:l=len(sub("[*'~\n]",'',w));q='*'in w;d+='. '[w[0]>'}':]*(w[0]in'~\n')+chr(64+l+m)[q:];m=(2-l%2)*10*q
 print d+'.'

İşleme yapmak için çok sayıda regex kullanır. İki boşluğu dönüştürüyoruz ~ve onu işlemek için kullanıyoruz. ~ve \nözel olarak ele alınır.

En büyük karakter kazancı, forsatırdaki girdilerin ön işlenmesinden gelir ; bu kesinlikle daha fazla golf oynayabilir.

Ideone! (tüm test durumları)

DLosc sayesinde 7 bayt kaydedildi!


3

Pip , 65 64 bayt

-rsBayraklar için skor 62 bayt + 2 dir .

Flg{O{{(zy*t+#a-1)X!Y'*Na&2-#a%2}MJa@`[\w*]+`}MlRM''^sX2O". "}

Çevrimiçi deneyin!

açıklama

-rBayrak bunlardan bir liste stdin'i ve depolar tüm satırları okur g. -sBayrak alanı ayrılmış etmek listelerinin çıktı biçimini belirler.

Bu kodu okumanın en kolay yolu, dışarıdan:

Flg{...}                   For each line l in g, do:

O{...}MlRM''^sX2O". "      Translate a paragraph into a sentence of plaintext:
       lRM''               Remove apostrophe characters
            ^sX2           Split on "  " into sentences
 {...}M                    Map the below function to each sentence
O                          Output the result list, space-separated, without newline
                O". "      Output that string, without newline

{...}MJa@`[\w*]+`          Translate a sentence into a word of plaintext:
       a@`[\w*]+`          Find all matches of regex (runs of alphanumeric and *)
{...}MJ                    Map the below function to each word and join into string

(zy*t+#a-1)X!Y'*Na&2-#a%2  Translate a word into a letter of plaintext:
      #a-1                 Length of word minus 1
  y*t+                     Add 10 or 20 if y is set (see below)
(z        )                Use that number to index into lowercase alphabet
              '*Na&        Count * characters in word, logical AND with...
                   2-#a%2  2 if word is even length, 1 if odd
             Y             Yank that value into y, to modify the following word
           X!              String multiply the character by not(y)
                           If y is truthy, the word had italics, and we get ""
                           If y is falsy, the word had no italics, and we get a letter

Rakipsiz görünüyor.
primo

1

Python 2.7, 390 342 341 339 335 bayt:

from re import*
def F(i):
 W=X="";S,s=split,sub;D='[^\w\s*]';Q=lambda c,t:len(s(D,X,c.group()).split()[t])
 for m in S('\W\n',s(D+"*\w*\*\w+\*.*?(?=\s) \w+",lambda v:"a"*([20,10][Q(v,0)%2]+Q(v,1)),s("'",X,s("--"," ",i)))):
  for g in S('\W  ',m):
   for q in S('\W',g):
    W+=chr(64+len(q))
   W+=" "
  W=W[:-1]+". "
 print s("@",X,W)

Biçiminde giriş alır:

F('''Multi or Single-lined String''')

Çok daha fazla golf oynayabilir, şansım olduğu zaman yapacağım.

Tüm Test Durumlarıyla Repl.it!

Açıklama:

Girdiyi deşifre etmek için Python'un düzenli ifadelerinin yerleşik gücünü kullanır. Bu, her giriş için fonksiyonun geçtiği temel işlemdir:

  1. İlk olarak, hepsi --tek bir boşlukla değiştirilir ve her kesme işareti kaldırılır. Daha sonra, italik hale getirilmiş bileşenleri ve ilerleyen kelimeyi içeren tüm kelimeler bir dizgede eşleştirilir ve 10 + len(second word)ardışık sayılarla değiştirilir .a de ilk kelimenin uzunluğu ise sodd , aksi takdirde 20 + len(second word)ardışık as'dir. Bu, aşağıdaki normal ifadeyi kullanır:

    [^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+

    Örneğin, cümle varsa Perpendicular l*ou*nging calms., l*ou*nging calmsile değiştirilecektiraaaaaaaaaaaaaaaaaaaaaaaaa 25 veya aberi, s l*ou*ngingkarakter eşit sayıda ve calms5. sahiptir 20+5=25.

  2. Şimdi, yeni değiştirilen girdi, her bir noktalama işaretine bölün ve ardından \nparagrafları almak için bir newline ( ) işaretine bölün , ardından her paragraf, her noktalama işaretine bölünür, ardından cümleleri almak için 2 boşluk bırakılır ve son olarak, her cümle birlikte boşluk içeren herhangi bir noktalama işareti. Daha sonra, her bir kelime için (ardışık as 'nin çalışmaları dahil ), bir dizgeye , unicode kod noktasına (önceki karakterin unicode kod noktası olan ) artı olan Wharf ekleriz . Daha sonra , bir cümlenin tüm kelimeleri tükendiğinde tek bir boşluk ekleriz ve bir paragraftaki tüm cümleler bitince, bunu bir boşluk ekleriz .64A@len(word)W.

  3. Tüm giriş geçtikten sonra, son olarak, Wçıkış olduğunu stdoutdeşifre mesaj olarak.


Küçük nitpick: spec, çıktı cümlelerinin çift değil, tek boşlukla ayrıldığını söylüyor (bu değişiklik ayrıca bir bayt kazandırıyor). İlk golf önerisi: her şeyi ithal ettiğiniz için bunun yerine rekullanın . Daha genel golf önerisi: kelime olmayan veya noktalama işareti olan her şeyi tedavi etmek muhtemelen daha etkilidir . Büyük devasa karakter sınıflarında tasarruf sağlar. substr.replace*
DLosc

@DLosc Oh, benim hatam. Özelliğin çıktıdaki cümleleri 2 boşlukla ayırmak olduğunu düşündüm. Bunu düzelteceğim. Ayrıca, golf önerileri için teşekkürler! Onlarla ne yapabileceğime bir bakayım.
R. Kap

1

PHP, 196 Bayt

<?preg_match_all("#[\w*']+|  |$#m",$_GET[s],$m);foreach($m[0]as$s){if(!$s||$s=="  ")echo!$s?". ":" ";else{$l=$p+64+strlen(str_replace("'","",$s));if(!$p=strstr($s,"*")?20-$l%2*10:0)echo chr($l);}}

Eğer bir kelimenin ortasında Apostrophe olduğunu varsayabilirdim 194 Bytes

<?preg_match_all("#[\w*]+(<?=')[\w*]+|[\w*]+|  |$#m",$_GET[s],$m);foreach($m[0]as$s){if(!$s||$s=="  ")echo!$s?". ":" ";else{$l=$p+64+strlen($s);if(!$p=strstr($s,"*")?20-$l%2*10:0)echo chr($l);}}

@DLosc %0A İşlev olarak URL kodlaması yapıldı rawurlencode("\n"). Ben giriş için ve benim html sitesi dize kodlamak için otomatik olarak yapar, böylece bir textarea ile bu durumda bir form tercih
Jörg Hülsermann

@DLosc Ben php.ini içinde error_reporting açık olduğundan şüpheleniyorum. 'error_reporting (0);' ondan sonra <?. Bir hata $_GET[s]ona aittir fakat doğrudur $_GET["s"]ve bunu bildirmek ve değişkeni $p=0;döngüden önce başlatmak daha iyidir . Şimdi size sorum şu: Bir Sözcüğün ortasında, Sözcüğün ortasında sadece bir kesme işareti olduğunu söyleyebilir miyim?
Jörg Hülsermann

Birden fazla Apostrophes için @DLosc İlk cevabımı kullanmalıyım. İkinci - 2 Bayt, eğer ortadaki yalnızca bir kesme işareti ile çalışır.
Jörg Hülsermann

Sorunumun ne olduğunu çözdüm - sunucumda kısa açılış etiketleri etkin değil. İşe <?phpyaradı
DLosc

@Dlosc Ben <?gerçekte hiç kullanmadım . Kısa etiketi yalnızca buradaki gönderimde kullanıyorum. Şimdi boş bir sayfada gösterilebileceğini biliyorum.
Jörg Hülsermann

1

PHP, 231 226 228 bayt

başlangıç ​​için

<?preg_match_all("#([\w\*']+)([^\w\*']*)#",$argv[1],$m,2);foreach($m as list(,$a,$b)){$e=strlen(strtr($a,["'"=>""]))+$d;if(!$d=strstr($a,'*')?$e%2*10:0)echo chr($e+64),strpos(".$b","
")?". ":(strpos(".$b","  ")?" ":"");}echo".";

Dosyaya kaydet, rund php <scriptpath> <text>. Metin içinde yeni satırlardan çıkıp, kabuğun içinde çalışmasını sağlayın.


1
Bunu çalıştırmak için bazı talimatlar verebilir misiniz? Girdiden okunuyor gibi görünüyor $argv[1], ancak girdi yeni satırlar içerdiğinde bu yaklaşımın nasıl çalışacağını bilmiyorum. "Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"Komut satırı argümanı olarak denedim ve IFHCHCFF.çıktı aldım (yanı sıra bir Undefined variable: duyarı).
DLosc 11:16

@DLosc: Bu uyarı (bir uyarı değil) varsayılan ayarlarla orada olmamalıdır. En kolay yol, hazırlamak <?, bir dosyaya kaydetmek ve onu çağırmaktır php <filename> <string>. Bayt sayısına 2 eklemek zorunda kalabilirim.
Titus

@Titus Başlarsanız <?, 1 ile ?>.net kazanç elde etmek için de sonlandırabilirsiniz . FWIW, IFHCMFF.ilk test senaryosuna giriyorum (PHP 5.5.21 64-bit, VC14 kullanarak). Kullanımı $argnile -Faynı zamanda bir seçenek olabilir.
primo

Demek istediğim, ne php <filename> <string>zaman mümkün olduğunu anlamıyorum .<string> yeni satırlar içerdiğinde .
DLosc

@DLosc: hatayı düzeltti. Yeni hatlar için: onlardan kaçın.
Titus
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.