무설탕 구문


55

Haskell에서 목록 표기법 :

[a,b,c]

다음에 대한 구문 설탕입니다.

a:b:c:[]

그리고 문자열 표기법 :

"abc"

다음에 대한 구문 설탕입니다.

['a','b','c']

이것은 문자열이 다음을 의미합니다.

"abc"

와 같다:

'a':'b':'c':[]

태스크

문자열이 주어지면 하스켈에서 구문이 바뀐 버전을 출력해야합니다.

규칙

  • 당신은 어떤 유효한 입력 방법으로 문자열을 받게됩니다 출력으로 끝나는 문자열해야 당신이 :[]입력으로 둘러싸인에서 모든 문자 '에 의해 구분 :. 빈 문자열이 출력되어야합니다 [].

  • 이스케이프가 필요한 문자 (예 : 줄 '바꿈, 탭 등)가없고 입력이 인쇄 가능한 ASCII 범위에 있다고 가정 할 수 있습니다.

  • 이것은 답변의 바이트 수를 최소화하는 것을 목표로하는 입니다.

테스트 사례

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   

입력에 ASCII가 아닌 값이 있습니까? 이스케이프가 필요한 문자에 대한 제한은 Haskell이 이스케이프 할 문자를 알고 있거나 목록이 철저하다고 가정합니다.
FryAmTheEggman 2016 년

@FryAmTheEggman 당신은 그들이 ascii 범위에 있다고 가정 할 수 있습니다
밀 마법사

7
@totallyhuman 유효한 하스켈조차도 아닙니다. 그들이 어쩌면 좋았지 만, 그렇지 않다면, 확실히 아닙니다.
밀 마법사

38
이 질문의 제목은 "다이어트 하스켈"입니다.
March Ho

1
아니 @cairdcoinheringaahing, "'구문 다르다.
밀 마법사

답변:


85

하스켈 , 26 바이트

(++"[]").((++":").show=<<)

온라인으로 사용해보십시오!

설명:

포인트가없는 표기법이 아닌을 concatMap대신 하여 사용 =<<하면

f s = concatMap(\c-> show c ++ ":")s ++ "[]"

문자열이 주어지면 대부분의 Haskell 유형의 문자열 표현을 반환하는 함수를 사용하여 s각 문자 c를 문자열에 매핑 합니다. 해당 문자열이 연결되고 마지막 이 추가됩니다."'c':"show[]

도전에 의해 요구되지는 않지만 있기 때문에,이 답변도 적절한 이스케이프와 함께 작동 show이 돌봐 : f "'"수율을 "'\\'':[]".


25
잠깐만 (++'[':']':[]).((++':':[]).show=<<), 아니?
Adám

11
챌린지에 Haskell 답변이 있으면 원칙적으로 반대합니다. 이것은 두 배로갑니다.
Ryan Reich

43

하스켈, 33 28 26 바이트

foldr((.(':':)).shows)"[]"

온라인으로 사용해보십시오!

fold오른쪽에서 입력 문자열로 지정된 pointfree 함수로 시작합니다 []. 이 기능은 다음과 같습니다 : char를 Haskell char로 표시합니다. 즉 ', 결과 :를 앞에 넣은 후 결과에 둘러싸여 있습니다.

편집 : @ Ørjan Johansen은 2 바이트를 저장했습니다. 감사!


나는 그것이 의미한다고 생각한다 (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám

1
둘 다 자신의 우아함이 있지만 :목록이 아닌 목록 을 작성 하는 데 사용 하기 때문에 동일한 바이트 수로 다른 Haskell 답변보다 우수하다고 생각합니다 ++.
CAD97

4
이것은 다소 놀랍습니다. 동일한 언어에서 동일한 바이트 수를 갖는 두 가지 별도의 접근 방식.
J Atkin



16

공통 리스프, 50 42 바이트

(format t"~{'~a':~}[]"(coerce(read)'list))

온라인으로 사용해보십시오!

read함수를 정의하는 대신 사용하여 @coredump의 주석 덕분에 줄었습니다 .


1
PPCG에 오신 것을 환영합니다!
Martin Ender 2016 년

2
리스프! 정말로 환영합니다 :)
Olivier Dulac

@Renzo 안녕하세요 Renzo, 당신은 익명의 람다 양식을 사용하거나 간단히 read :를 호출하여 약간 축소 할 수 있습니다 (format t"~{'~a':~}[]"(coerce(read)'list))(다른 질문은 더 엄격한 wrt 입력 및 출력이지만 여기에는 괜찮습니다)
coredump

@coredump, 감사합니다! 코드를 업데이트했습니다.
Renzo


10

C, 55 54 53 바이트

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}

1
공간을 제거 할 수 있습니다char *h
Cyoce

1
당신이 할 수있는 puts("[]");몇 바이트를 저장하는 후행 개행 문자로 출력하는 대신.
Kritixi Lithos

재귀s(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2

8

파이썬 3 , 41 38 36 바이트

ovs 덕분에 -2 바이트

print(*map(repr,input()),[],sep=':')

온라인으로 사용해보십시오!


으악 ... *map존재를 잊어 버렸습니다 .
Mr. Xcoder

나는 input()람다 @. @ 일 수있을 때 지난 20 분 동안 (문자 그대로) 공란 에 당황했습니다 .
Rod


@WheatWizard 아, 비어있는 빈 줄을 사용하지 않았습니다
Rod

당신은 대체 할 수 "[]"[]
OVS

8

05AB1E , 15 12 11 10 바이트

carusocomputing 덕분에 -3 바이트
Adnan 덕분에
-1 바이트-Outgolfer의 천재적인 아이디어 덕분에 -1 바이트

ʒ"'ÿ':"?},

온라인으로 사용해보십시오!

ʒ          # Filter out every character that the following code doesn't return 1 for
 "'ÿ':"?   #   Print the string 'ÿ': with ÿ replaced by this character
        }  # End for
         , # No character returned 1 so an empty array is left on the stack. Print that

분명히 나는 ​​4 초 당신을 이겼습니다 ;-)
Digital Trauma

1
귀하의 답변 게시를 누르면 @DigitalTrauma Yours가 나타납니다.
Riley

1
대괄호를 3 바이트로 누르지 않고 전역 배열을 인쇄 할 수 있습니다. 총 -3의 최종 결과 12 바이트에 대해 다른 바이트 절약을 위해 문자열을 보간 할 수도 있습니다.vy"'ÿ':"?}¯?
Magic Octopus Urn

@carusocomputing 테스트 스위트에는 항상 문자열 보간기를 사용하지만 실제 코드에서는 사용하지 않는 것이 좋습니다. 감사!
Riley

@ carusocomputing vy"'ÿ':"}¯J11에서 작동 한다고 생각 했지만 J해당 상황의 전체 스택이 아닌 전역 배열에 합류했습니다.
Riley

8

R, 51 바이트

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))

1
좋은 해결책! 몇 가지 바이트를 절약하고 실제로 줄일 수있는 몇 가지 방법. 기본 I / O를 사용하면 익명 함수를 반환하거나 stdin에서 입력을받을 수도 있습니다. stdin에서 scan(,'')함수 대신 사용 하는 것이 훨씬 짧습니다 .
주세페

고마워, R (및 코드 골프!)이있는 새로운 것이므로 익명 함수를 아직 파악하지는 못했지만 거기에 '함수'없이 시도하려고했지만. 스캔이 유용 할 수 있습니다!
tc

아, 익명 함수는 변수에 할당하지 않는 함수일 뿐이므로 f<-코드의 시작 부분에서 코드를 삭제하면 됩니다.
Giuseppe

paste0 (gsub ( '(.)', " '\\ 1':", scan (, "")), '[]')은 43
Zahiro Mor

8

Pyth, 14 10 8 바이트

j\:a`MQY

이 시도!

@isaacg 덕분에 -2 바이트

마지막으로, pyth는 무언가를 잘합니다.

설명

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :

@isaacg 감사합니다! 잊어 버렸 M는데 왜 내가 사용하지 않았는지 모르겠습니다 a. 이제 우리는 다른 모든 솔루션보다 최소 2 바이트 짧습니다!
KarlKastor



6

파이썬 2 , 48 46 44 37 바이트

Rod 덕분에 -2 바이트 Wheat Wizard 덕분에 -7 바이트

lambda s:':'.join(map(repr,s)+['[]'])

온라인으로 사용해보십시오!



오, 깔끔 해요 감사!
완전히 인간적인

1
lambda s:':'.join(map(repr,[*s,[]]))또는로 짧은 하나 lambda s:':'.join(map(repr,s))+":[]".
xnor

@xnor 두 번째 예제는 빈 경우에 작동하지 않는 것 같습니다. (원래의 답변은 그것과 매우 비슷해 보였지만 빈 문자열 케이스를 덮기 위해 많은 돈을 지불했습니다)
Wheat Wizard


6

자바 스크립트 (ES6), 36 바이트

s=>s?`'${[...s].join`':'`}':[]`:"[]"

시도 해봐

f=
s=>s?`'${[...s].join`':'`}':[]`:"[]"
oninput=_=>o.innerText=f(i.value);o.innerText=f(i.value="abc")
<input id=i><pre id=o>


5

젤리 ,  11 10  8 바이트

Christian 덕분에 -1 바이트 (연결을 제거 ;하고 대신 암시 적 인쇄 사용)

0 바이트 (빈 문자열의 가장자리 경우에 고정 - 이전에 전체 프로그램 : ŒṘ€j”:“:[])

-2 Outgolfer 에릭 감사는 (사용하는 p대신에, ;€사람은 ”:유효 길이가 1이고; 사용 Ø[이 축약되었다 이후 ⁾[])

ŒṘ€p”:Ø[

온라인으로 사용해보십시오!

결과를 인쇄하는 전체 프로그램 (링크로 문자 목록을 리턴 함).

...하지만 STDIN을 사용하여 저장하는 방법이 있습니까?

어떻게?

ŒṘ€p”:Ø[ - Main link: list of characters, s  e.g. "Hey"
ŒṘ€      - Python representation for €ach    [["'",'H',"'"],["'",'e',"'"],["'",'y',"'"]]
    ”:   - literal character = ':'
   p     - Cartesian product                 [["'",'H',"'",':'],["'",'e',"'",':'],["'",'y',"'",':']]
         - implicit print (no newline): 'H':'e':'y':
      Ø[ - literal list of characters        ['[',']']
         - implicit print (no newline): []


4

펄 5 , 22 바이트

19 바이트의 코드 + -p플래그.

s/./'$&':/g;$\="[]"

또는 동일한 바이트 수에 대해 s/./'$&':/g;s/$/[]/.

매우 간단합니다 : s/./'$&':/g각 문자를 따옴표로 묶고 :뒤에 추가하십시오 . $\각 인쇄 후에 암시 적으로 인쇄되므로 []final 로 출력 하도록 설정하십시오 [].

온라인으로 사용해보십시오!


4

자바 (오픈 JDK 8) ,86 83 76 바이트

@KevinCruijssen 덕분에 -3 바이트 @FlorianSchaetz 덕분에
-7 바이트

s->{String b="";for(char c:s.toCharArray()){b+="'"+c+"':";};return b+"[]";};

온라인으로 사용해보십시오!


4 바이트를 삭제할 수 있습니다. 후행는 ;람다의 답을 계산 할 필요가 없습니다의 ;애프터는 }전혀 필요하지 않습니다, 그리고 {와는 }에 대한 루프 주위에 제거 할 수 있습니다. 그리고 당신은 변화 모두 자바 (10)의 4 바이트 이상 절약 할 수 Stringchar에가 var.
Kevin Cruijssen

4

brainfuck, 68 바이트

+[-->+[<]>-]>>,[<.>.<.>>-[>+<+++++++++]>+.[-]<<,]-[+[+<]>>+]<+++.++.

온라인으로 사용해보십시오!


빈 문자열로 작동하지 않습니다-온라인 테스트에서 유효하지 않은 두 문자를 반환했습니다. 그렇지 않으면 아주 좋습니다.
NoseKnows 모두

@NoseKnowsAll 나는 그것을 복제 할 수없는 것; 입력이 없으면 출력이 없습니다. 해당 입력으로 업데이트 된 링크를 제공 할 수 있습니까?
daniero

이것이 내가 그것을 실행할 때 얻은 것 입니다. 입력이 비어 있으면 따옴표없이 "[]"를 반환해야합니다.
NoseKnows 전체

@NoseKnowsAll 귀하의 링크는 "hello world"입력으로갑니다 (링크 / 체인 버튼을 눌러 업데이트 된 링크를 얻습니다). 네, 그렇습니다. 나는
그것에

1
@NoseKnowsAll 당신이 간다, 나는 그것을 고쳤다;)
daniero

3

Brain-Flak , 135 , 131 바이트

{({}<>)<>}(((((((()()()()()){})){}{}())){}{})[()()])<>{<>(((((((()()()){}()){}){}()){})[(((()()()){})){}{}()])<>)({}<({}<>)>)<>}<>

온라인으로 사용해보십시오!

+1-c플래그의 바이트

XD가 없었던 명백한 NOOP를 제거해 준 WheatWizard에게 감사합니다.


@WheatWizard> _> 그래, 난 단지 당신을 테스트하고 있었다 ... Hahaha, 지적 해 주셔서 감사합니다. 나는 나중에 더 골프를하려고 노력할 것이다. 그러나 나는 이제 그것을 추가 할 것이다. lol
DJMcMayhem

3

표준 ML , 52 50 바이트

@Laikoni 덕분에 2 바이트를 절약했습니다!

fn s=>String.translate(fn c=>"'"^str c^"':")s^"[]"

온라인으로 사용해보십시오!

String.translate불행하게도 긴 이름이지만, 5 바이트를 사용하는 것보다 짧았다 concat, map그리고 explode.


@Laikoni 감사합니다! 나는 연산자가 함수보다 우선 순위가 낮다는 것을 항상 잊는다.
musicman523

3

Cubix , 31 29 바이트

uo@[)o'U);!A?ro;o;o;os:'/u:''

A또한 치환 될 수 있고 i; 다른 바이트를 짜내는 좋은 방법이 있는지 알아 내려고 노력했습니다. MickyT 덕분에 -2 바이트! 또한 MickyT에 의해 outgolfed !

3x3x3 큐브에 적합 :

      u o @
      [ ) o
      ' U )
; ! A ? r o ; o ; o ; o
s : ' / u : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

온라인으로보십시오!

온라인으로 사용해보십시오!


마지막 대괄호에 몇 증분을 사용하여 몇 바이트를 저장할 수 있습니다. 이것은 결론을 약간 압축 할 수있게합니다uo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT




2

PHP, 39 바이트

<?while(~$c=$argn[$i++])echo"'$c':"?>[]

로 파이프로 실행하십시오 -F.



2

Cubix , 27 바이트

uosW?U.iv":'"^soso;os@o[]'/

온라인으로 사용해보십시오!

      u o s
      W ? U
      . i v
" : ' " ^ s o s o ; o s
@ o [ ] ' / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

달려 봐

Guiseppe의 답변 과 약간 다른 변형 . 이것은 콜론과 따옴표를 스택에 넣습니다. 그런 다음 입력을 반복하여 스택을 교환하고 출력합니다. 입력 만 폐기되고 콜론과 따옴표는 유지됩니다.

입력의 끝에 도달하면 IP는 큐브 주위를 조금 궁금해 괄호를 추가하고 출력합니다. 믹스에는 몇 가지 중복 명령이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.