피클 조금


19

파이썬의 pickle 모듈 은 직렬화에 사용되므로 나중에 재구성 할 수있는 방식으로 객체를 덤프 할 수 있습니다. 이를 위해 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여기에 문자 개행이며, 줄 바꿈 실제로 언어에 중요하다.

언어와 같은 CJam GolfScript 나에 대해 잘 알고, 그들을 위해 (l/t유사을 운영 [하고 ]각각.

입력

일을 단순하게 유지하기 위해 입력은 항상 유효합니다. 특히 입력에 대해 다음을 가정 할 수 있습니다.

  • 문자열은 소문자와 공백으로 만 구성 [a-z ]되며 항상 작은 따옴표를 사용합니다.
  • 모든 문자가 위에 지정된대로 외부 문자가 없습니다. 예를 들어, 줄 바꿈은 문자열 뒤에 만 발생합니다.
  • 모든 l/t것이 일치 (하기 전에 모든 (것이 일치 l/t합니다. 또한 하나 이상이있을 것 (입니다.
  • 정확히 하나만 .있을 것이고 항상 마지막 캐릭터가 될 것입니다.

명령 행, STDIN 또는 함수 인수를 통해 입력을받을 수 있습니다. 원하는 경우 여러 줄 문자열 대신 줄 바꿈 이스케이프 된 단일 문자열을 사용할 수 있지만 답에이를 지정하십시오.

산출

출력은 최종 객체의 표현이어야하며 STDOUT에 인쇄되거나 string으로 반환되어야 합니다 . 구체적으로 특별히:

  • 문자열은 예를 들어 사이에 내용이 포함 된 작은 따옴표를 열고 닫음으로 표시됩니다 S'abc' -> 'abc'. 이 챌린지는 파이썬에서 허용 되더라도 큰 따옴표를 사용할 수 없습니다.

  • 목록은 쉼표로 구분 된 요소 [](예 :['a','b','c'] 플 의해 둘러싸여 콤마로 분리 소자 repsented하는 동안) ()(예를 들면 ('a','b','c')).

  • 공백은 중요하지 않습니다. 예 : ('a', 'b', 'c' ) . 괜찮습니다.
  • 닫는 대괄호 앞에 쉼표를 사용할 수 없습니다. 이것은 단일 언어 튜플이 표현되는 방식으로 인해 대부분의 언어에서 일을 더 쉽게 만들고 파이썬에서 목록 / 튜플을 작성하고 출력하는 것을 어렵게하기 위해 의도적으로 파이썬 구문 규칙과 다릅니다. 도전, 우리 ('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')]

규칙

  • 이것은 이므로 가장 적은 바이트의 코드가 이깁니다.
  • 파이썬 피클과 함께 작동하도록 설계된 기능은 허용되지 않습니다.

보안 참고 사항 : 실제 코드에서는 신뢰할 수있는 출처에서만 선택을 해제하거나 그렇지 않으면 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

펄, 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~


 ")("\

점프 재미! 관련된 5 가지 주요 명령, 모드 9에 대한 ASCII 코드는 다음과 같습니다.

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

이를 통해 각 작업을 자체 라인에서 처리 할 수 ​​있으며 직접 이동합니다. 또한 스택 스택을 사용하여 필요한 문자열로 래핑하기 전에 각 문자열과 중첩 목록 / 튜플을 별도로 구성합니다.


좋은 일이지만 안타깝게도 대부분의 테스트 사례에서 올바른 결과를 얻지 못하는 것 같습니다 (한 가지 경우에 대괄호가 잘못된 방법으로 보입니다)
Sp3000

0

자바 스크립트 (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))))

입력에서 여러 정규식 대체를 실행하여 유효한 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

줄리아 + 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문자열 매크로 이스케이프 시퀀스를 처리하지 않습니다.
  • 흥미롭게도 이것은 간단하게 julia 데이터 구조를 반환하는 것으로 변환 될 수 있습니다. 기본적으로 |>s 의 RHS에서 변환을 제거 tuple하고 t규칙을 추가 합니다.

안타깝게도 도움말 센터 의 규칙에 따라 골프는 골프 과제를 코딩하기위한 솔루션을 게시하기위한 요구 사항입니다.
Dennis

나는 100 %가 아니지만 더 짧은 것을 할 수 있습니다. 이것은이 언어 / 라이브러리 조합 "Julia + ParserCombinator.jl"을 사용하는 모든 솔루션을 골프화 할 수 있다는 사실을 의미합니다. 그러나 다른 한편으로, 더 짧은 순수 줄리아 솔루션이 있다는 확실한 변화가 있습니다. 이제는 그것을 써야합니다.
Lyndon White

완전히 다른 솔루션을 작성할 필요는 없습니다. 당신의 접근 을 최대한 활용하는 것으로 충분합니다. 적어도 주석은 제거해야합니다.
Dennis

바이트 수에 대한 주석 (또는 빈 줄)을 세지 않았습니다. 나는 그것이 컨벤션 인 줄
Lyndon White

예, 코드는 게시 된대로 점수가 매겨집니다 . 그래도 언 골프 / 애노테이션이있는 버전을 추가 할 수 있습니다.
데니스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.