Menguraikan Katak Neurotik

28

Menguraikan Katak Neurotik

Sekarang, Puzzling.SE akhirnya telah memecahkan sandi saya yang terobsesi dengan amfibi , mari kita menulis sebuah program atau fungsi untuk mendekripsi!

(Jika Anda ingin melihat puzzle sebelum merusaknya, klik tautan di atas sekarang.)


Cara kerja sandi

Dalam neurotik Katak O ught Untuk Rel sebuah x di M ud Baths ( "neurotik Katak" untuk pendek), setiap huruf dienkripsi sebagai satu atau dua kata:

  • Panjang kata yang tidak dicetak miring mewakili huruf.
    • neurotic => 8 huruf => H
    • frogs => 5 huruf => E
    • perpendicular => 13 huruf = M
  • Kata yang berisi huruf miring mengubah kata berikut, menambahkan 10 jika kata yang dicetak miring itu ganjil atau 20 jika kata yang dicetak miring itu panjangnya bahkan. Setiap atau semua kata mungkin dicetak miring. Kata yang dicetak miring selalu diikuti oleh kata yang tidak dicetak miring.
    • *o*ught to => aneh, 2 => 12 => L
    • lo*u*nging calms => datar, 5 => 25 => Y

Setiap kata plaintext sesuai dengan kalimat ciphertext, dan setiap kalimat plaintext sesuai dengan paragraf ciphertext.

Masukkan format

Program atau fungsi Anda harus memasukkan pesan dalam Neurotic Frogs, yang diformat dalam Markdown. Input hanya akan terdiri dari ASCII yang dapat dicetak dan baris baru.

  • Kata - kata adalah kumpulan karakter yang cocok dengan regex [A-Za-z0-9'].
    • Angka dan huruf sama-sama diperhitungkan dalam panjang kata. QB64mewakili D.
    • CATATAN: Apostrof tidak dihitung terhadap panjang kata. Isn'tmewakili D, bukan E.
  • Huruf yang dicetak miring dibungkus dengan sepasang tanda bintang ( *letters*).
    • Satu atau lebih huruf berurutan dapat dicetak miring, hingga seluruh kata ( masseus*es*, *all*); beberapa huruf yang tidak berurutan dalam sebuah kata juga dapat dicetak miring ( g*e*n*e*rates).
    • Miring tidak pernah mencakup banyak kata, tidak pernah menyertakan tanda baca, dan tidak pernah menyertakan tanda kutip.
    • Tanda bintang yang tidak berpasangan dan beberapa tanda bintang yang berdekatan tidak akan pernah terjadi.
  • Tanda baca adalah salah satu karakter berikut: .,?!:;-()".
    • Kata-kata dalam kalimat dipisahkan oleh satu atau lebih karakter tanda baca dan / atau satu spasi. Contoh: *all* welcomed, toad*s*, newts, Ever*y*one--frogs, cap... bliss,they're (I
    • Kalimat diakhiri dengan satu atau lebih karakter tanda baca dan dipisahkan oleh spasi ganda: Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
    • Paragraf dipisahkan oleh satu baris baru. (Kalimat terakhir paragraf masih memiliki satu atau lebih karakter tanda baca di akhir.)

Karakter lain tidak akan muncul dalam input dan tidak perlu ditangani.

Kode Anda mungkin, atas kebijakan Anda, mengharapkan input memiliki satu baris tambahan.

Format output

Hasil mendekripsi input akan menjadi satu atau lebih kalimat. Letters of plaintext dapat berupa kombinasi huruf besar dan kecil. Kata-kata dalam kalimat harus dipisahkan oleh spasi tunggal. Kalimat harus diakhiri dengan titik ( .) dan dipisahkan oleh satu spasi. Anda dapat menampilkan spasi tambahan setelah kalimat terakhir. Output Anda semua akan berada di satu baris, tetapi Anda dapat menampilkan baris tambahan.

Detail lain-lain

Kode Anda dapat menggunakan metode input dan output standar apa saja. Itu harus menerima input sebagai string multiline, bukan daftar atau struktur data lainnya, dan itu harus menampilkan string.

Kode terpendek dalam byte menang!

Uji kasus

-->
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.
DLosc
sumber
4
+1 untuk input pengantin putri. Oh, dan untuk keahlian Anda, itu juga.
Magic Octopus Urn
Apakah kata yang berisi huruf miring dijamin diikuti oleh kata yang tidak mengandung huruf miring?
R. Kap
@ R.Kap Benar. Saya telah mengedit pertanyaan untuk menjelaskannya.
DLosc

Jawaban:

5

Perl, 72 byte

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

Menghitung shebang sebagai satu, input diambil dari stdin.

Contoh Penggunaan

$ 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.
primo
sumber
1
Saya memberikan hadiah untuk jawaban ini, karena ini adalah yang terpendek pada akhir periode hadiah selain saya sendiri (memang, satu-satunya yang datang dekat).
DLosc
4

JavaScript (ES6), 172 169 157 150 byte

Disimpan 10 byte berkat @Neil

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``+"."

Mungkin bisa lebih ditingkatkan. Output di semua huruf kecil.

Produksi ETH
sumber
Simpan 2 byte dengan memindahkan i=0ke toString.
Neil
Karena ketertarikan, saya mencoba memperbaiki bug-bug itu dan menghasilkan ini: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
Tampaknya bekerja dalam bentuk saat ini.
Primo
@Neil Terima kasih. Itu menghemat 12 byte, tetapi tidak bekerja pada test case terakhir. Memperbaiki itu menambahkan 9 untuk pemendekan bersih 3 byte.
ETHproduksi
@ Neil Menyingkirkan .replacedan hanya menggunakan .matchdisimpan 12 byte lagi.
ETHproduksi
3

Python 2, 238 221 218 214 207 205 byte

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+'.'

Menggunakan banyak regex untuk melakukan pemrosesan. Kami mengubah ruang ganda menjadi ~dan menggunakannya untuk memprosesnya. ~dan \nditangani secara khusus.

Keuntungan karakter terbesar berasal dari preprocessing input di for baris; ini pasti bisa bermain golf lebih lanjut.

Ide itu! (semua kasus uji)

Disimpan 7 byte berkat DLosc!

Tembaga
sumber
3

Pip , 65 64 byte

Skornya adalah 62 byte kode + 2 untuk -rsbendera.

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

Cobalah online!

Penjelasan

The -rbendera membaca semua lini stdin dan toko daftar mereka dalam g. Itu-s bendera menetapkan format output dari daftar ruang yang dipisahkan.

Cara termudah untuk membaca kode ini adalah dari luar di:

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
DLosc
sumber
Tampaknya tak terkalahkan.
Primo
1

Python 2.7, 390 342 341 339 335 byte:

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)

Mengambil input dalam format:

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

Dapat bermain golf lebih banyak, yang akan saya lakukan setiap kali saya mendapat kesempatan.

Repl.it dengan Semua Kasing Uji!

Penjelasan:

Menggunakan kekuatan luar biasa dari ekspresi reguler Python bawaan untuk menguraikan input. Ini adalah proses mendasar yang dilalui fungsi untuk setiap input:

  1. Pertama, semua --diganti dengan satu ruang, dan setiap tanda kutip dihapus. Kemudian, semua kata yang mengandung komponen yang dicetak miring dan kata yang melanjutkannya dicocokkan dalam satu string dan diganti dengan 10 + len(second word)jumlah berturut-turut ajika panjang kata pertama odd, dan 20 + len(second word)berturut - turut asebaliknya. Ini menggunakan ekspresi reguler berikut:

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

    Misalnya, jika kita memiliki kalimat Perpendicular l*ou*nging calms., l*ou*nging calmsakan diganti dengan aaaaaaaaaaaaaaaaaaaaaaaaa, atau 25 adetik, karena l*ou*ngingmemiliki jumlah karakter genap dan calms5 20+5=25..

  2. Sekarang, input yang baru dimodifikasi dibagi pada setiap tanda baca diikuti oleh baris baru ( \n) untuk mendapatkan paragraf, maka setiap paragraf dibagi pada setiap tanda baca diikuti oleh 2 spasi untuk mendapatkan kalimat, dan akhirnya, setiap kalimat dibagi menjadi kata bersama tanda baca apa pun termasuk spasi. Kemudian, untuk setiap kata (termasuk proses berturut-turut a), kami menambahkan ke string Whuruf yang sesuai dengan titik kode unicode 64(titik kode unicode karakter sebelumnya A, yaitu @) ditambah len(word). Kami kemudian menambahkan satu spasi untuk Wsekali semua kata dari kalimat telah habis, dan ketika semua kalimat dalam paragraf habis, kami menambahkan .diikuti oleh satu ruang.

  3. Akhirnya, setelah seluruh input telah melalui, Wadalah output stdoutsebagai pesan yang diuraikan.

R. Kap
sumber
Minor nitpick: spec mengatakan kalimat keluaran dipisahkan oleh spasi tunggal, bukan ganda (perubahan ini juga menghemat satu byte). Saran golf awal: karena Anda mengimpor semuanya dari re, gunakan subalih-alih str.replace. Saran bermain golf yang lebih umum: mungkin lebih efisien untuk memperlakukan semua yang bukan kata atau *tanda baca. Menghemat kelas karakter besar besar.
DLosc
@Dosc, Oh, salahku. Saya pikir specnya adalah untuk memisahkan kalimat dalam output dengan 2 spasi. Saya akan memperbaikinya. Juga, terima kasih atas saran golfnya! Saya akan melihat apa yang bisa saya lakukan dengan itu.
R. Kap
1

PHP, 196 Bytes

<?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);}}

Jika saya dapat berasumsi bahwa hanya ada satu Apostrof di tengah kata 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);}}
Jörg Hülsermann
sumber
@DLosc Itu urlencode %0A sebagai fungsi rawurlencode("\n"). Saya lebih suka dalam hal ini formulir dengan textarea untuk input dan situs html saya membuatnya secara otomatis untuk menyandikan string
Jörg Hülsermann
@Dosc Aku curiga error_reporting di php.ini aktif. coba 'error_reporting (0);' setelah itu <?. Satu kesalahan termasuk $_GET[s]berfungsi tetapi yang benar adalah $_GET["s"]dan lebih baik untuk mendeklarasikan dan menginisialisasi variabel $p=0;sebelum loop. Sekarang pertanyaan saya pada Anda adalah: Dapatkah saya menganggap bahwa dalam satu kata hanya satu tanda kutip di tengah kata?
Jörg Hülsermann
@ Dosc untuk beberapa Apostrof saya harus menggunakan jawaban pertama saya. Yang kedua - 2 Bytes hanya berfungsi dengan satu Apostroph di tengah jika kata.
Jörg Hülsermann
Saya menemukan apa masalah saya - server saya tidak mengaktifkan tag pembuka pendek. Berubah untuk <?phpbekerja.
DLosc
@ Dlosc Saya tidak pernah menggunakan <?dalam kenyataan. Saya menggunakan tag pendek hanya di posting saya di sini. Sekarang saya tahu bahwa itu bisa ulang di halaman kosong.
Jörg Hülsermann
1

PHP, 231 226 228 byte

sebagai permulaan

<?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".";

Simpan ke file, rund php <scriptpath> <text>. Kabur baris baru dalam teks untuk membuatnya bekerja dalam shell.

Titus
sumber
1
Bisakah Anda memberikan beberapa instruksi untuk menjalankan ini? Sepertinya itu membaca input dari $argv[1], tetapi saya tidak tahu bagaimana pendekatan itu akan bekerja ketika input berisi baris baru. Saya mencoba "Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"sebagai argumen baris perintah dan mendapatkan IFHCHCFF.untuk keluaran (serta Undefined variable: dperingatan).
DLosc
@Dosc: Pemberitahuan itu (bukan peringatan) seharusnya tidak ada di sana dengan pengaturan default. Cara termudah adalah dengan menambahkan <?, menyimpannya ke file dan memanggilnya dengan php <filename> <string>. Saya mungkin harus menambahkan 2 ke jumlah byte.
Titus
@Titus Jika Anda mulai dengan <?, Anda juga dapat mengakhiri dengan ?>., untuk keuntungan bersih untuk 1. FWIW, saya dapatkan IFHCMFF.untuk test case pertama (menggunakan PHP 5.5.21 64-bit, VC14). Menggunakan $argndengan -Fjuga bisa menjadi pilihan.
primo
Maksud saya adalah, saya tidak melihat bagaimana php <filename> <string>mungkin ketika <string>bisa berisi baris baru.
DLosc
@Dosc: memperbaiki bug. Untuk baris baru: lepas dari mereka.
Titus