String Manipulation Interpreter


11

สรุป

มีการสร้างภาษาการจัดการสตริงใหม่โดยใช้เฉพาะอักขระ$+#-!*|@>! งานของคุณคือการใช้ล่ามให้กับมันในไม่กี่ไบต์เท่าที่จะทำได้

อินพุต

สตริงซึ่งเป็นบรรทัดเดียวของภาษานี้ สิ่งนี้สามารถดำเนินการได้ในวิธีที่สมเหตุสมผล (stdin, พารามิเตอร์ฟังก์ชัน, อาร์กิวเมนต์บรรทัดคำสั่ง ฯลฯ ) หรือเป็นตัวแปรที่กำหนดไว้ล่วงหน้า หากโปรแกรมขอการป้อนข้อมูลจากผู้ใช้ให้ยอมรับการป้อนข้อมูลจากผู้ใช้ทั้งหมดที่ร้องขอจาก stdinและไม่มีอะไรเพิ่มเติมดูด้านล่าง คุณอาจคิดว่ามันเป็นโปรแกรมที่ถูกต้อง

เอาท์พุต

สิ่งที่ภาษาจะออกข้อกำหนดรายละเอียดด้านล่าง คุณต้องส่งออกสตริงในลักษณะที่สมเหตุสมผล (stdout, ฟังก์ชั่นเอาท์พุท ฯลฯ ) หรือค่าตัวแปร เมื่อภาษาออกมาอย่างชัดเจนต้องไปที่ stdout ช่องโหว่มาตรฐานถูกแบน

ข้อมูลจำเพาะภาษา

การประมวลผลและไวยากรณ์

ภาษามีรูปแบบของการประมวลผลที่ง่ายมากเนื่องจากมีการจัดการสตริงเท่านั้น: เริ่มต้นด้วยสตริงว่าง ( "") และเปลี่ยนด้วยแต่ละคำ คำประกอบด้วยหนึ่งหรือสองส่วน: ฟังก์ชั่น (ด้านล่าง) ตามด้วยอาจเป็นพารามิเตอร์ (ด้านล่าง) ซึ่งแก้ไขพฤติกรรมของมัน ข้อกำหนดถูกคั่นด้วยไพพ์ ( |) คุณอาจคิดว่ามันจะไม่เป็นโปรแกรมเปล่าและไม่มีคำใดจะว่างเปล่า คุณควรส่งออกค่าในตอนท้ายของโปรแกรม

ฟังก์ชั่น

ภาษามีเพียง 6 ฟังก์ชันดังที่แสดงด้านล่าง แต่ละฟังก์ชั่นยอมรับพารามิเตอร์หนึ่งหรือศูนย์

  • + เชื่อมสตริง (ใช้พารามิเตอร์สตริงเดียวเชื่อมต่อกับค่าปัจจุบัน)
  • ! กลับลำดับอักขระของค่าปัจจุบัน (ไม่มีพารามิเตอร์)
  • * ทำซ้ำสตริง (รับพารามิเตอร์จำนวนเต็มหนึ่งพารามิเตอร์ทำซ้ำค่าปัจจุบันที่หลาย ๆ ครั้ง)
  • - ลบค่าที่เกิดขึ้นทั้งหมด (ใช้พารามิเตอร์สตริงเดียวลบสิ่งที่เกิดขึ้นทั้งหมดออกจากค่าปัจจุบัน)
  • $ [หลอก -] สับค่าปัจจุบันแบบสุ่ม (ไม่มีพารามิเตอร์)
  • <ส่งออกมูลค่าปัจจุบันไปที่stdout(ไม่มีพารามิเตอร์)

ค่า

เหล่านี้เป็นค่าที่อาจถูกส่งผ่านไปยังฟังก์ชั่นซึ่งแสดงโดย regex ที่จะตรงกับพวกเขา:

  • @[^|]*สตริงตัวอักษรรวมถึงตัวละครอื่น ๆ นอกเหนือจากท่อ อาจว่างเปล่า
  • #[0-9]+ ตัวอักษรจำนวนเต็ม
  • >stdinบรรทัดถัดไปของ หากใช้กับ*ให้แปลงเป็นจำนวนเต็ม

กรณีทดสอบ

╔════════════════════════╤═════════════╤══════════════╗
║code                    │input        │output        ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|!|+@hello|*>         │13           │31hello31hello║
║                        │2            │              ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|+@abcdefg|$          │hello        │hcloeebafdlg  ║
╟────────────────────────┼─────────────┼──────────────╢
║+@how areyou|-@o|->     │w            │h areyu       ║
╟────────────────────────┼─────────────┼──────────────╢
║+@out|<|*#3             │             │out           ║
║                        │             │outoutout     ║
╟────────────────────────┼─────────────┼──────────────╢
║+>                      │what ever 345│what ever 345 ║
╟────────────────────────┼─────────────┼──────────────╢
║+@$pe<i@l|<|-@$pe<i@l|+>│A|$o $pe<!@| │$pe<i@l       ║
║                        │             │A|$o $pe<!@|  ║
╟────────────────────────┼─────────────┼──────────────╢
║<|+>|!|<                │input text   |              ║
║                        │             │txet tupni    ║ 
║                        │             │txet tupni    ║
╟────────────────────────┼─────────────┼──────────────╢
║+@>#                    │             |>#            ║
╚════════════════════════╧═════════════╧══════════════╝

โปรดทราบว่ากรณีทดสอบ 2 เป็นแบบสุ่มดังนั้นการเปลี่ยนแปลงของอักขระในนั้นจึงถูกต้อง นอกจากนี้เอาต์พุตในตารางจะถูกคั่นด้วยการขึ้นบรรทัดใหม่ แต่โปรแกรมของคุณไม่จำเป็นต้องทำเช่นเดียวกัน ค่าสุดท้ายในแต่ละกรณีคือผลลัพธ์สุดท้าย

ล่ามไพ ธ อนตัวอย่าง (Un-golfed)

ลองออนไลน์! IMO ดีกว่าถ้าคุณเรียกใช้ผ่าน IDLE หรืออะไรก็ตามที่คุณใช้ (ฉันเล่นมันลงไปที่ 424 ไบต์หลังจากนั้น แต่ฉันแน่ใจว่าคุณสามารถทำได้ดีกว่า)


2
การอนุญาตให้อินพุตให้อยู่ในตัวแปรอยู่แล้วนั้นไม่ใช่มาตรฐานเช่นเดียวกับการอนุญาตให้เอาต์พุตเป็นหนึ่ง
Jonathan Allan

ตัวอย่างของคุณดูเหมือนจะพิมพ์ขึ้นบรรทัดใหม่ทุกครั้งที่<พบ เป็นข้อบังคับหรือไม่
ศูนย์รวมแห่งอวิชชา

โปรแกรมจะมีการขึ้นบรรทัดใหม่หรือไม่ เพราะถ้าทำได้สามารถทำให้คำตอบของ Chas Brown เป็นโมฆะ
ศูนย์รวมแห่งความไม่รู้

2
สำหรับคำถามในอนาคตของคุณโปรดพิจารณาหลีกเลี่ยงยุ่งยาก I / O รูปแบบ การ จำกัด อินพุตให้ stdin มีค่าใช้จ่ายเพิ่มเป็นไบต์ในบางภาษาและไม่ได้นำมาซึ่งความท้าทายมากมาย
Arnauld

1
@digEmAll ฉันเพิ่งเพิ่มเข้าไปได้+@>#อย่างไร ฉันใช้#เช่นกัน
อาร์ทิมิสยังไม่ไว้วางใจ SE

คำตอบ:


3

ทับทิม -palF\| , 146 142 ไบต์

r='';$F.map{|i|x=i[1]!=?>?i[2..-1]:gets.chomp;eval %w[r.reverse! r*=x.to_i 0 $><<r r=r.chars.shuffle*'' r.gsub!x,'' r+=x][i[0].ord*5%11]};$_=r

ลองออนไลน์!

ท่าเรือ Chas บราวน์ตอบหลาม ห้ามพิมพ์บรรทัดใหม่หลังจากเอาต์พุต

ตามปกติเวอร์ชัน Ruby 2.6 จะสั้นลง 2 ไบต์พร้อมการจัดทำดัชนีช่วงไม่มีที่สิ้นสุด ( i[2..])


6

R , 287 286 273 269 ​​ไบต์

function(C,x='',`[`=gsub,`!`=intToUtf8,`?`=utf8ToInt){for(k in el(strsplit(C,'\\|'))){B=eval(parse(t='^.'['','(?<=.)>$'['readLines(,1)','[@#](.+)'['"\\1"',k],,T]]));x=switch((?substr(k,1,1))%%13-2,strrep(x,B),paste0(x,B),,B['',x,f=T],!rev(?x),print(x),,!sample(?x))};x}

ลองออนไลน์!

  • -1 ต้องขอบคุณ @Kirill L.
  • -4 ขอบคุณ @Giuseppe

รหัสที่ไม่ได้ควบคุมและคำอธิบาย:

function(C){                                      # C is the string manipulation expression
  x = ''                                          # initialize x = ''
  tokens = el(strsplit(C,'\\|'))                  # split C by pipe '|'
  for(k in tokens){                               # for each token k
    arg2 = k
    arg2 = gsub('[@#](.+)','"\\1"',k)             # replace @X or #X with "X" (in quotes)
    arg2 = gsub('(?<=.)>$','"readLines(,1)"',
                 arg2,perl=T)                     # replace > with readLines(,1)
    arg2 = gsub('^.','',arg2)                     # remove the first character
    B = eval(parse(t=arg2))                       # evaluate the string : this will be our 
                                                  # second argument B
    A = substr(k,1,1)                             # take the first character : 
                                                  # i.e. the main command (+,-,! etc)
    x = switch(A,                                 # switch on the main command, execute the 
            '+'=paste0(x,B),                      # corresponding expression and 
            '!'=intToUtf8(rev(utf8ToInt(x))),     # store the result into x
            '*'=strrep(x,B),                      # Note: in the actual code we switch on
            '-'=B['',x,f=T],                      # the utf8 value MOD 13-2 of the command
            '$'=intToUtf8(sample(utf8ToInt(x))),
            '<'=print(x)
        )
    }
    x                                             # return x (and print it implicitly)
}

3

Python 2 , 215 219 209 208 ไบต์

from random import*
I=raw_input;o=''
for t in I().split('|'):p=t[1:]=='>'and I()or t[2:];exec"o=o[::-1] o*=int(p) 0 print(o) o=''.join(sample(o,len(o))) o=o.replace(p,'') o+=p".split()[ord(t[0])*5%11]
print o

ลองออนไลน์!

-4 เพราะraw_inputเป็นสิ่งจำเป็น

9 ไบต์ขอบคุณที่ศูนย์รวมแห่งความไม่รู้ ; 1 ไบต์จากAscii เท่านั้น


อินพุตอื่นที่ไม่ใช่โปรแกรมต้องมาจาก stdin ตามที่ระบุในคำถาม
อาร์ทิมิสยังคงไม่ไว้ใจ SE

ผมใช้งูหลาม 3 raw_inputแต่เท่าที่ผมได้ตระหนักถึงการใช้งานของการป้อนข้อมูลที่ต้องใช้ ถูกต้องฉันถ้าฉันผิด ..
อาร์ทิมิสยังไม่ไว้วางใจ SE

อ้างอิงจาก Py 2.7 docs: input([prompt])เทียบเท่ากับ eval (raw_input (prompt)) ฟังก์ชันนี้ไม่พบข้อผิดพลาดของผู้ใช้ หากอินพุตไม่ถูกต้องทางไวยากรณ์ syntaxError จะถูกเพิ่ม
อาร์ทิมิสยังไม่ไว้วางใจ SE

ดังนั้นปัญหาที่คุณเพิ่มขึ้นคืออะไรที่นี่ซึ่งจะต้องใส่สตริงการป้อนข้อมูล - แทนที่จะเป็นคำที่ไม่แสดงในสถานการณ์ที่แท้จริง 'stdin อีกครั้งโดยทั่วไปกฎ I / O เป็นบิตหละหลวม; แต่ฉันจะแก้ไข
Chas Brown

ขอบคุณที่เปลี่ยน คุณสามารถบันทึกไม่กี่ไบต์โดยเปลี่ยนเป็น Python 3 และใช้รหัสเก่าของคุณ + 3 ไบต์สำหรับวงเล็บ แต่ ... +1 ต่อไป
อาร์ทิมิสยังไม่ไว้วางใจ SE



1

Javascript, 292 267 ไบต์

f=(p)=>{c='';p.split`|`.map(l=>{v=l.substr(2);v=l[1]=='#'?parseInt(v):l[1]=='>'?prompt():v;c={'+':_=>c+v,'-':_=>c.split(v).join``,'*':_=>c.repeat(v),'$':_=>[...c].sort(_=>.5-Math.random()).join``,'!':_=>[...c].reverse().join``,'<':_=>alert(c)||c}[l[0]]();});return c}

JSFiddle


กรณีทดสอบ 6 ไม่ได้ผล ...
อาร์ทิมิสยังไม่ไว้ใจ SE

1
@ArtemisFowl ขอบคุณ regex ทำงานไม่ถูกต้องและเปลี่ยนเป็น split .. เข้าร่วมบันทึกสองไบต์
Johan du Toit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.