Tafsirkan Pengulangan!


11

Tantangan ini adalah yang pertama dari seri dua tantangan tentang Pengulangan. Yang kedua akan segera bangun.

Dalam bahasa yang disebut Pengulangan (sesuatu yang baru saja saya buat), ada string tak terbatas 12345678901234567890...dengan 1234567890pengulangan selamanya.

Sintaks berikut tersedia untuk nomor keluaran:

  • +-*/: Ini menyisipkan operator ke dalam string angka berulang.
    • Contoh:
      • +-> 1+2= 3( +Menyisipkan +antara 1dan 2)
      • +*-> 1+2*3= 1+6= 7(Sama seperti di atas, kecuali dua operator digunakan sekarang)
      • /-> 1/2= 0(Pengulangan menggunakan pembagian integer)
      • //-> 1/2/3= 0/3= 0(Pengulangan menggunakan "asosiasi kiri" dengan banyak pengurangan dan pembagian)
    • Setiap operator dimasukkan sehingga memiliki satu digit di sebelah kirinya, kecuali ada c(lihat di bawah).
  • c: Digabungkan dengan digit berikutnya dalam string.
    • Contoh:
      • c+-> 12+3= 15( c"Terus" 1dan menggabungkannya dengan digit berikutnya 2,, untuk membentuk 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): Kurung untuk memproses angka.
    • Contoh:
      • (c+)*-> (12+3)*4= 15*4= 60(Pengulangan menggunakan urutan operasi)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: Lewati angka (menghapus nomor dari string yang tak terbatas).
    • s+-> 2+3= 5( smelompati 1)
    • csc-> 124( cConcats pertama 1dan 2, slompatan 3, dan final cconcat 12ke 4)
    • +s+-> 7(Yang pertama +menambahkan 1dan 2membuat 3, smelompat 3, dan final +menambahkan 3untuk 4membuat 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

Dalam contoh di atas, hanya jumlah digit terbatas dalam string tak hingga yang digunakan. Jumlah digit yang digunakan setara dengan number of operators, concats and skips + 1.

Tugas Anda adalah, ketika diberi string kode Pengulangan, hasilkan output.

Contoh input dan output adalah:

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

Ini kode golf, jadi kode terpendek dalam byte menang!

Spesifikasi:

  • Anda dijamin hasilnya tidak akan pernah melampaui 2^31-1.
  • Anda juga dijamin bahwa input hanya akan terdiri dari simbol +-*/cs().
  • Program kosong akan menampilkan 1.

Bagaimana dengan ~s? Jangan biarkan kami menggantung.
Robert Fraser

@RobertFraser Whoops, itu adalah kesalahan - c awalnya ~, tetapi tampaknya saya belum memperbaikinya sepenuhnya.
clismique

1
@TonHospel Ooh, Anda punya poin bagus di sana. Simbol "s" pada dasarnya menghapus nomor yang dikaitkan dengan dari string tak terbatas sama sekali, jadi itu adalah ya untuk kedua skenario.
clismique

2
Spesifikasi Anda namun mengatakan s+adalah 2+3sebagai contoh pertama. Dan masih sterus menggangguku. Saya bertanya-tanya bagaimana caranya +s()+mengembang. Jika 1+(2)+4kemudian (datang sebelum 2tetapi syang datang bahkan sebelum yang (tampaknya masih melompat 3, tidak 2. Namun jika hasilnya adalah 1+(3)+4maka efek dari stergantung pada apa yang datang setelah itu (bandingkan dengan +s+)
Ton Hospel

1
scApakah 23dan s+ini 1+3? Apakah smelewatkan 1sekarang atau 2? Semua contoh menggunakan operasi pertama pada operan 1dan 2... begitu juga scseharusnya 13.
Titus

Jawaban:


4

JavaScript (ES6), 110 byte

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

Sangat sederhana, tetapi divisi integer menambah 25 byte. Untuk beberapa alasan, regex di JS tidak dapat mencocokkan awal string dan karakter pertama, sehingga menambahkan beberapa byte juga.

Bagaimana itu bekerja

  1. Tambahkan spasi ke input.
  2. Tambahkan digit berikutnya untuk setiap karakter (kecuali )) yang tidak segera sebelum a (.
  3. Hapus masing-masing c, digit + sdi awal ( 1s2-> 2), dan masing-masing s+ digit ( 3s4-> 3).
  4. Ubah setiap operasi divisi menjadi int-divisi ( 1/2-> (1/2|0)).
  5. Evaluasi dan kembali.

Oke ... program Anda memiliki bug ... ss+kembali 6, ketika itu dimaksudkan untuk kembali 7(Keduanya slewati 1dan 2, jadi +tambah 3dan 4).
clismique

@ Qwerp-Derp Terima kasih, sudah diperbaiki.
ETHproduksi

Sesuatu seperti /^|,|$/ghanya akan cocok sekali di awal karena kedua pertandingan akan memiliki indeks yang sama. $tidak memiliki masalah yang sama karena kecocokan memiliki indeks yang lebih besar daripada kecocokan lainnya yang mungkin.
Neil

0

Batch, 332 byte

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

Perilaku smembuat ini sangat canggung. (Mungkin csharus mengevaluasi ke 13dan -ske -2?) Variabel:

  • s string input (dihapus secara eksplisit karena set / p tidak mengubah variabel jika Anda tidak memasukkan apa pun)
  • eekspresi parsial dalam aritmatika integer normal (yang dapat kita berikan set/asebagai bentuk eval)
  • d digit berikutnya dari deretan digit tanpa batas
  • rsisi kanan operator terbaru. Kami tidak dapat menyatukan ini segera karena (harus diutamakan, tetapi kami harus menyimpannya sehingga stidak akan menambahnya. Untungnya itu akhirnya membuat penanganannya )sedikit lebih mudah.
  • c karakter saat ini.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.