บิตของผักดอง


19

โมดูลดองเกิลของไพ ธ อนใช้สำหรับการทำให้เป็นอนุกรมทำให้สามารถทิ้งวัตถุในลักษณะที่สามารถสร้างขึ้นใหม่ได้ในภายหลัง สำหรับสิ่งนี้ pickle ใช้ภาษาสแต็กพื้นฐานอย่างง่าย

เพื่อให้เข้าใจง่ายเราจะติดต่อกับชุดย่อยของภาษานี้:

(              Push a mark to the stack
S'abc'\n       Push a string to the stack (here with contents 'abc')
l              Pop everything up to the last mark, wrapping all but the mark in a list
t              Pop everything up to the last mark, wrapping all but the mark in a tuple
.              Terminate the virtual machine

งานของคุณคือการใช้ภาษาชุดย่อยนี้ โปรดทราบว่า\nนี่คือการขึ้นบรรทัดใหม่ตามตัวอักษรและการขึ้นบรรทัดใหม่มีความสำคัญต่อภาษา

สำหรับผู้ที่คุ้นเคยกับภาษา GolfScript หรือ CJam (และl/tดำเนินการในลักษณะเดียวกัน[และ]ตามลำดับ

อินพุต

เพื่อให้สิ่งต่าง ๆ ง่ายอินพุตจะถูกต้องเสมอ โดยเฉพาะอย่างยิ่งคุณอาจสมมติสิ่งต่อไปนี้เกี่ยวกับอินพุต:

  • สตริงจะประกอบด้วยตัวอักษรและช่องว่างเล็ก ๆ[a-z ]เท่านั้นและจะใช้เครื่องหมายคำพูดเดี่ยวเสมอ
  • จะไม่มีตัวอักษรที่ไม่เกี่ยวข้องกับคำสั่งทั้งหมดตามที่ระบุไว้ข้างต้น ตัวอย่างเช่นนี่หมายความว่าการขึ้นบรรทัดใหม่จะเกิดขึ้นหลังจากสตริงเท่านั้น
  • ทุกคนl/tมีการจับคู่(ก่อนหน้าและทุกคน(มีการจับคู่l/tหลังจากนั้น (นอกจากนี้ยังจะเป็นที่หนึ่งอย่างน้อย
  • จะมีหนึ่งอย่างแน่นอน.และมันจะเป็นตัวละครสุดท้ายเสมอ

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

เอาท์พุต

เอาท์พุทควรจะเป็นตัวแทนของวัตถุสุดท้ายพิมพ์ไป STDOUT หรือกลับเป็นสตริง โดยเฉพาะ:

  • S'abc' -> 'abc'สตริงโดยมีตัวแทนเปิดและปิดราคาเดียวที่มีเนื้อหาในระหว่างเช่น คุณไม่สามารถใช้เครื่องหมายคำพูดคู่สำหรับความท้าทายนี้ได้แม้ว่าจะได้รับอนุญาตใน Python ก็ตาม

  • รายการจะถูกแสดงด้วยองค์ประกอบที่คั่นด้วยเครื่องหมายจุลภาคล้อมรอบด้วย[](เช่น['a','b','c']) ในขณะที่ tuples จะถูก repsented โดยองค์ประกอบที่คั่นด้วยเครื่องหมายจุลภาคล้อมรอบด้วย()(เช่น('a','b','c'))

  • ช่องว่างไม่สำคัญเช่น('a', 'b', 'c' )ไม่เป็นไร
  • คุณไม่สามารถใช้เครื่องหมายจุลภาคก่อนวงเล็บปิด โปรดทราบว่านี่คือเจตนาที่แตกต่างจากกฎไวยากรณ์ของ Python เพื่อให้ง่ายขึ้นสำหรับภาษาส่วนใหญ่และเพื่อให้ยากขึ้นในการสร้างรายการ / tuple ใน Python จากนั้นให้เอาท์พุทเนื่องจากวิธีการแสดง tuple องค์ประกอบเดียว (สำหรับสิ่งนี้ ความท้าทายที่เราต้องการ('a')ตรงข้ามกับ('a',))

ตัวอย่าง

ข้อความด้านบนอาจดูน่ากลัว แต่ตัวอย่างต่อไปนี้ควรทำให้สิ่งต่าง ๆ ชัดเจนขึ้น

(l.

เอาต์พุตที่เป็นไปได้: []

(t.

เอาต์พุตที่เป็นไปได้: ()

(S'hello world'
l.

เอาต์พุตที่เป็นไปได้: ['hello world']

(S'string one'
S'string two'
S'string three'
t.

เอาต์พุตที่เป็นไปได้: ('string one', 'string two', 'string three')

(S'a'
(S'b'
S'c'
lt.

เอาต์พุตที่เป็นไปได้: ('a',['b','c'])

((S'a'
S'b'
(lS'c'
t(S'd'
tl.

เอาต์พุตที่เป็นไปได้: [('a', 'b', [], 'c'), ('d')]

((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.

เอาต์พุตที่เป็นไปได้: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]

กฎระเบียบ

  • นี่คือดังนั้นโค้ดในจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ
  • ไม่อนุญาตให้ใช้ฟังก์ชันใด ๆ ที่ออกแบบมาเพื่อทำงานกับ Python

หมายเหตุด้านความปลอดภัย: ในรหัสจริงปลดเฉพาะแหล่งที่มาที่คุณเชื่อถือหรืออื่น ๆ ที่คุณอาจได้รับความcos\nsystem\n(S'rm -rf'\ntR.ประหลาดใจที่น่ารังเกียจ


ไม่S'abc'\nผลักดันabcหรือ'abc'?
CalculatorFeline

คำตอบ:


4

CJam, 63

q{"Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
 0:T; C+"35/T=S/(C#=~}fC

ลองออนไลน์

คำอธิบาย:

q        read the input
{…}fC    for each character C in the input
  "…"    push that long string, containing code to handle various cases
  35/    split it into (two) parts of length 35
  T=     get the T'th part; T is 1 when parsing a string and 0 otherwise
          (T is initially 0 by default)
  S/     split by space into an array of strings
  (      take out the first item (containing special characters to check)
  C#     find the index of C in that string
  =      get the corresponding string from the array
          (when C is not found, # returns -1 which gets the last array item)
  ~      execute that string

ตอนนี้สตริงยาวที่มีโค้ดส่วนต่าง ๆ แต่ละส่วนมีอักขระสองสามตัวเพื่อตรวจสอบและบล็อกสำหรับจัดการแต่ละส่วนและตัวพิมพ์เริ่มต้น

ส่วนแรก: Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [

Slt      special characters to check
######## first block, corresponding to character 'S'
1:T;     set T=1, causing the next characters to be processed with the 2nd part
L        push an empty string/array, which will be used to collect the string
######## second block, corresponding to character 'l'
]        end array
',*      join with commas
'[\+     prepend a '['
']+      append a ']'
######## third block, corresponding to character 't'
]        end array
',*      join with commas
'(\+     prepend a '('
')+      append a ')'
######## last block, corresponding to other characters (practically, '(' and '.')
[        start array

ส่วนที่สอง: (newline) 0:T; C+

newline  special characters to check (only one)
######## first block, corresponding to newline
0:T;     set T=0, switching back to the first part
######## last block, corresponding to any other character (including apostrophe)
C+       append the character to the collecting string

3

Perl, 149 ไบต์

ฉันมีความรู้สึกไม่ดีว่านี่เป็นความพยายามที่ไม่ดี แต่ต่อไปนี้:

$/=$,;$"=",";@s=[];/^\(/?$s[@s]=[]:{$p=/S(.*')/?$1:/l|t/?($l="@{pop@s}")|/l/?"[$l]":"($l)":0,push@{$s[-1]},$p}for<>=~/([(lt]|S.*?\n)/g;print$s[0][0];

ต้องบันทึกสคริปต์ในไฟล์และรับข้อมูลจาก STDIN

คำอธิบาย:

# Set the input record separator to undef so that <> reads all lines at
# once
$/=$,;
# Ensure that elements of lists printed in quotes are separated by commas
$"=",";

# The stack. Initialise the bottom element with an empty array
@s=[];

# Tokens are extracted in the for loop a few lines below. Copied here for
# clarity: Read the entire input and iterate over all valid tokens of the
# pickle language
# for <>=~/([(lt]|S.*?\n)/g;
# the token is a mark - push an empty array to the stack
/^\(/ ? $s[@s]=[]
      # token is a string, push it inside the stack top
      : {$p=/S(.*')/ ? $1
                     # otherwise, remove the top and create list or tuple
                     # from it and push it inside the top element
                     : /l|t/ ? ($l="@{pop@s}") | /l/ ? "[$l]"
                                                     : "($l)"
                             : 0 # dummy value
                             # pushing of the string/list/tuple actually
                             # happens here
                             , push@{$s[-1]},$p} 
# read the entire input at once and iterate over all valid tokens
for <>=~/([(lt]|S.*?\n)/g;

# in the end, the bottom element of the stack will be an array with just one
# element which is the string representation of the object
print$s[0][0];

0

> <>, 88 ไบต์

^"][">}r]
~rl?!;o11.
^0\!\
 &</\?[1&~?=1l","
 1/\ii:"'"=?v44.
>i9%0$.     >r]i~


 ")("\

สนุกกับการกระโดด! ใช้ความจริงที่ว่ารหัส ASCII สำหรับ 5 คำสั่งหลักที่เกี่ยวข้องคือ mod 9 คือ:

S -> 2
l -> 0
t -> 8
( -> 4
. -> 1

สิ่งนี้ช่วยให้แต่ละการดำเนินการได้รับการจัดการในสายของตัวเองซึ่งจะถูกข้ามไปยังโดยตรง ยังใช้สแต็กของสแต็คเพื่อสร้างแต่ละสตริงและรายการ / tuple ที่ซ้อนกันแยกกันก่อนที่จะทำการห่อด้วยอักขระที่ต้องการ


งานดี แต่น่าเสียดายที่ฉันไม่ได้รับผลลัพธ์ที่ถูกต้องสำหรับกรณีทดสอบส่วนใหญ่ (วงเล็บดูเหมือนจะผิดวิธีสำหรับสิ่งหนึ่ง)
Sp3000

0

JavaScript (ES6), 199 ไบต์

s=>(q=x=>(o=[],x.slice(0,-1).map(v=>o=[...o,v.map?q(v):`'${v}'`]),x.pop()<"m"?`[${o}]`:`(${o})`),q(eval(s[r="replace"](/\(/g,"[")[r](/[tl](?![\w ]+'\n)/g,"'$&'],")[r](/S('.+')/g,"$1,").slice(0,-2))))

รัน regex หลายอันแทนที่บนอินพุตเพื่อเปลี่ยนเป็นโค้ด JS ที่ถูกต้องจากนั้นแยกวิเคราะห์

ตัวอย่างการทดสอบ

f=
s=>(q=x=>(o=[],x.slice(0,-1).map(v=>o=[...o,v.map?q(v):`'${v}'`]),x.pop()<"m"?`[${o}]`:`(${o})`),q(eval(s[r="replace"](/\(/g,"[")[r](/[tl](?![\w ]*'\n)/g,"'$&'],")[r](/S('.+')/g,"$1,").slice(0,-2))))
<select oninput="I.value=this.selectedIndex?this.value.replace(/\\n/g,'\n'):'';O.innerHTML=this.selectedIndex?f(I.value):''"><option>---Tests---<option>(l.<option>(t.</option><option>(S'hello world'\nl.<option>(S'string one'\nS'string two'\nS'string three'\nt.<option>(S'a'\n(S'b'\nS'c'\nlt.<option>((S'a'\nS'b'\n(lS'c'\nt(S'd'\ntl.<option>((S'a'\n((S'b'\nt(S'c'\nlS'd'\n(((ltlS'e'\nS'f'\nlS'g'\ntl.</select><br>
<textarea rows=10 cols=20 id=I></textarea><br><button onclick="O.innerHTML=f(I.value)">Run</button><br><pre id=O></pre>


0

Julia + ParserCombinator.jl 306 240

ด้วยชุดการแก้ไขล่าสุดของฉันฉันไม่คิดว่าโซลูชันจูเลียบริสุทธิ์จะสั้นลงอีกต่อไป

using ParserCombinator
v=join
j(t)=v(t,",")
a=Delayed()
s=E"S'"+Star(p".")+Drop(Equal("'\n"))|>x->"'$(v(x))'"
i=Star(a)|E""
l=E"("+i+E"l"|>x->"[$(j(x))]"
t=E"("+i+E"t"|>x->"($(j(x)))"
a.matcher=s|l|t
f(x)=parse_one(x,a+E".")|>first

นั่นเป็นเรื่องที่น่าสนใจ ฉันคิดว่ารหัสมีคารมคมคายพอสมควร

  • การจัดรูปแบบผลลัพธ์เสร็จสิ้นเมื่อสร้างรุ่น
  • a l, i, tและsมีพื้น CFG กฎ
  • f เป็นฟังก์ชั่นที่เรียกว่ามันมาพร้อมกันทั้งหมด
  • Drop(Equal("'\n"))เป็นที่น่ารำคาญ - ที่นึกคิดจะเขียนเป็นE"\n"แต่Eแมโครสตริงไม่ได้จัดการลำดับหนี
  • สิ่งที่น่าสนใจนี้สามารถถูกแปลงเป็นโครงสร้างข้อมูลจูเลียกลับไปเล็กน้อยโดยทั่วไปแล้วจะเป็นการลบการแปลงใน RHS ของ|>s และเพิ่มtupleสำหรับtกฎ

น่าเสียดายตามกฎในศูนย์ช่วยเหลือของเราการเล่นกอล์ฟเป็นข้อกำหนดสำหรับการโพสต์วิธีแก้ไขปัญหาการตีกอล์ฟ
Dennis

ฉันไม่ได้ 100% ฉันสามารถทำสิ่งที่สั้นกว่านี้ได้ นี่คือ golfed เพื่อ exent ว่าวิธีการแก้ปัญหาใด ๆ โดยใช้ชุดนี้ / ห้องสมุด "Julia + ParserCombinator.jl" สามารถ golfed แต่ในทางกลับกันมีการเปลี่ยนแปลงที่มั่นคงว่ามีวิธีแก้ปัญหาจูเลียบริสุทธิ์สั้นกว่า .... ตอนนี้ฉันต้องเขียนมัน
Lyndon White

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

ฉันไม่ได้นับความคิดเห็น (หรือบรรทัดว่าง) ที่มีต่อจำนวนไบต์ ฉันคิดว่าเป็นการประชุมฉันคิดว่าฉันคิดผิด
Lyndon White

ใช่รหัสคะแนนเป็นโพสต์ คุณสามารถเพิ่มรุ่นที่ไม่ได้แต่ง / ใส่คำอธิบายประกอบได้ตลอดเวลา
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.