Cú pháp không đường


55

Trong Haskell ký hiệu danh sách:

[a,b,c]

Chỉ là cú pháp đường cho:

a:b:c:[]

Và ký hiệu chuỗi:

"abc"

Chỉ là cú pháp đường cho:

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

Điều này có nghĩa là chuỗi:

"abc"

Giống như:

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

Bài tập, nhiệm vụ

Đưa ra một chuỗi, bạn sẽ xuất ra phiên bản không cú pháp sẽ trông như thế nào trong Haskell.

Quy tắc

  • Bạn sẽ nhận được một chuỗi theo bất kỳ phương thức nhập hợp lệ nào, bạn nên xuất một chuỗi kết thúc :[]bằng mọi ký tự từ đầu vào được bao quanh 'và phân tách bằng :. Chuỗi rỗng sẽ xuất ra [].

  • Bạn có thể cho rằng bạn sẽ không nhận được bất kỳ ký tự nào yêu cầu thoát (ví dụ: 'dòng mới, tab ...) và đầu vào đó sẽ nằm trong phạm vi ascii có thể in được

  • Đây là bạn nên cố gắng giảm thiểu số byte trong câu trả lời của mình

Các trường hợp thử nghiệm

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

Đầu vào bao giờ sẽ có giá trị không ascii? Hạn chế của bạn đối với các ký tự yêu cầu thoát hoặc yêu cầu chúng tôi biết nhân vật nào Haskell sẽ thoát hoặc giả sử danh sách của bạn là đầy đủ.
FryAmTheEggman

@FryAmTheEggman Bạn có thể cho rằng họ đang ở trong phạm vi ascii
Wheat Wizard

7
@totallyhuman Những người thậm chí không hợp lệ Haskell. Nếu họ có thể, nhưng tốt đẹp thì không, chắc chắn là không.
Phù thủy lúa mì

38
Câu hỏi này có thể được đặt tên khác là "Diet Haskell".
Tháng 3 ngày

1
@cairdcoinheringaahing Không, "'về mặt cú pháp thì khác nhau.
Thuật sĩ lúa mì

Câu trả lời:


85

Haskell , 26 byte

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

Hãy thử trực tuyến!

Giải trình:

Trong ký hiệu không dùng điểm và sử dụng concatMapthay vì =<<, điều này trở thành

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

Đưa ra một chuỗi s, chúng ta ánh xạ mỗi char cthành một chuỗi "'c':"bằng cách sử dụng showhàm trả về một đại diện chuỗi của hầu hết các loại Haskell. Những chuỗi đó được nối và một trận chung kết []được nối thêm.

Mặc dù không được yêu cầu bởi thử thách, câu trả lời này thậm chí còn hoạt động với lối thoát thích hợp, bởi vì hãy showquan tâm đến nó: f "'"sản lượng "'\\'':[]".


25
Đợi một chút, ý bạn là (++'[':']':[]).((++':':[]).show=<<)không?
Adám

11
Khi bất kỳ thử thách nào có câu trả lời của Haskell, tôi sẽ đưa nó ra khỏi nguyên tắc. Điều đó tăng gấp đôi cho cái này.
Ryan Reich

43

Haskell, 33 28 26 byte

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

Hãy thử trực tuyến!

foldhàm pointfree đã cho từ bên phải vào chuỗi đầu vào bắt đầu bằng []. Hàm này là: hiển thị char dưới dạng char Haskell, nghĩa là được bao quanh 'và nối với kết quả cho đến nay sau khi đặt :trước nó.

Chỉnh sửa: @ rjan Johansen đã lưu hai byte. Cảm ơn!


Tôi cho rằng điều đó có nghĩa (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám

1
Tôi nghĩ rằng điều này tốt hơn so với câu trả lời Haskell khác (có cùng số byte) do sử dụng :để xây dựng danh sách hơn là ++, mặc dù cả hai đều có sự thanh lịch riêng.
CAD97

4
Điều này là khá tuyệt vời. Hai cách tiếp cận riêng biệt có cùng số byte trong cùng một ngôn ngữ.
J Atkin



16

Lisp thường gặp, 50 42 byte

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

Hãy thử trực tuyến!

Giảm nhờ nhận xét của @coredump, bằng cách sử dụng readthay vì xác định hàm.


1
Chào mừng đến với PPCG!
Martin Ender

2
Lisp! Chào mừng thực sự :)
Olivier Dulac

@Renzo Xin chào Renzo, bạn có thể thu nhỏ nó một chút bằng cách sử dụng biểu mẫu lambda ẩn danh hoặc gọi đơn giản là đọc: (format t"~{'~a':~}[]"(coerce(read)'list))(một số câu hỏi khác là đầu vào và đầu ra nghiêm ngặt hơn, nhưng ở đây vẫn ổn)
coredump

@coredump, cảm ơn!, Tôi đã cập nhật mã.
Renzo


10

C, 55 54 53 byte

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

1
bạn có thể xóa khoảng trống trongchar *h
Cyoce

1
puts("[]");Thay vào đó, bạn có thể thực hiện để xuất ra một dòng mới để lưu một số byte.
Kritixi Lithos

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

8

Python 3 , 41 38 36 byte

-2 byte nhờ vào lò nướng

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

Hãy thử trực tuyến!


Rất tiếc ... Quên điều đó *maptồn tại ...
Ông Xcoder

Tôi đã bối rối bởi sự trống rỗng input()trong 20 phút qua (theo nghĩa đen), khi đó chỉ có thể là một lambda @. @
Rod


@WheatWizard oh, tôi đã sử dụng đầu vào trống rỗng (không có dòng mới)
Rod

Bạn có thể thay thế "[]"bằng[]
ovs

8

05AB1E , 15 12 11 10 byte

-3 byte nhờ tính năng carusocomputing
-1 byte nhờ Adnan
-1 byte nhờ vào ý tưởng thiên tài của Erik the Outgolfer

ʒ"'ÿ':"?},

Hãy thử trực tuyến!

ʒ          # 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

Rõ ràng tôi đã đánh bại bạn 4 giây ;-)
Chấn thương kỹ thuật số

1
@DigitalTrauma Yours bật lên khi tôi đang nhấn Đăng câu trả lời của bạn.
Riley

1
Bạn có thể in mảng toàn cầu thay vì đẩy dấu ngoặc với 3 byte. Bạn cũng có thể nội suy chuỗi để tiết kiệm byte khác với tổng số -3, kết quả cuối cùng là 12 byte:vy"'ÿ':"?}¯?
Bạch tuộc ma thuật Urn

@carusocomputing Tôi luôn luôn sử dụng bộ nội suy chuỗi cho các bộ thử nghiệm, nhưng quên sử dụng nó trong mã thực tế. Cảm ơn!
Riley

@carusocomputing Tôi nghĩ vy"'ÿ':"}¯Jsẽ hoạt động cho 11, nhưng Jtham gia vào mảng toàn cầu, không phải toàn bộ ngăn xếp trong tình huống đó.
Riley

8

R, 51 byte

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

1
Giải pháp tốt đẹp! Một vài cách bạn có thể lưu một số byte và thực sự làm được điều này. I / O mặc định cho phép bạn trả về một hàm ẩn danh hoặc thậm chí lấy đầu vào từ stdin, cái sau sẽ ngắn hơn nhiều khi sử dụng scan(,'')thay vì hàm.
Giuseppe

Cảm ơn, là một chút mới với R (và mã golf!) Vì vậy vẫn chưa nắm bắt được các chức năng ẩn danh trong đó, mặc dù tôi đã cố gắng thực hiện mà không có 'chức năng' trong đó. quét có thể hữu ích!
tc

à, một hàm ẩn danh chỉ là một hàm mà bạn không gán nó cho một biến để bạn chỉ cần thả f<-từ đầu mã của mình
Giuseppe

paste0 (gsub ('(.)', "'\\ 1':", quét (, "")), '[]') là 43
Zahiro Mor

8

Bình thường, 14 10 8 byte

j\:a`MQY

Thử đi!

-2 byte nhờ @isaacg

Cuối cùng, pyth là tốt ở một cái gì đó.

giải trình

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

@isaacg Cảm ơn bạn! Tôi quên mất Mvà tôi không biết tại sao tôi không sử dụng a. Bây giờ chúng tôi ngắn hơn ít nhất 2 byte so với tất cả các giải pháp khác ở đây!
KarlKastor



6

Python 2 , 48 46 44 37 byte

-2 byte nhờ Rod. -7 byte nhờ Wheat Wizard.

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

Hãy thử trực tuyến!



Ồ, gọn gàng. Cảm ơn!
hoàn toàn là

1
Một ngắn hơn như lambda s:':'.join(map(repr,[*s,[]]))hoặc lambda s:':'.join(map(repr,s))+":[]".
xnor

@xnor Ví dụ thứ hai bạn đưa ra dường như không hoạt động cho trường hợp trống. (câu trả lời ban đầu trông rất giống với câu trả lời nhưng được trả rất nhiều để bao trả cho trường hợp chuỗi trống)
Wheat Wizard


6

JavaScript (ES6), 36 byte

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

Thử nó

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


5

Thạch ,  11 10  8 byte

-1 byte nhờ Christian (loại bỏ nối ;và thay vào đó sử dụng in ngầm)

+0 byte (cố định cho trường hợp cạnh của chuỗi rỗng - trước đó là chương trình đầy đủ ŒṘ€j”:“:[]:)

-2 nhờ Erik the Outgolfer (sử dụng pthay ;€”:có hiệu quả là độ dài 1; sử dụng Ø[vì nó đã trở thành tốc ký ⁾[])

ŒṘ€p”:Ø[

Hãy thử trực tuyến!

Một chương trình đầy đủ in kết quả (dưới dạng liên kết, nó trả về một danh sách các danh sách các ký tự).

... nhưng có cách nào để tiết kiệm bằng STDIN không?

Làm sao?

ŒṘ€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

PHP , 41 byte

<?=preg_filter("#.#","'$0':",$argn)."[]";

Hãy thử trực tuyến!


4 byte ngắn hơn : for(;~$c=$argn[$i++];)echo"'$c':"?>[].
dùng63956

@ user63956 cần nó không phải là bổ sung <?với tùy chọn nào phải được chạy? Thực hiện một cách tiếp cận riêng tôi sẽ nói để có được upvote và Titus đã làm một cái gì đó tương tự trong thời gian đó
Jörg Hülsermann

Nó hoạt động với -Rcờ. Các thẻ có thể được đóng ngay cả trong các công trình như eval()create_function().
dùng63956

4

Perl 5 , 22 byte

19 byte mã + -pcờ.

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

Hoặc, cho cùng một bytecount , s/./'$&':/g;s/$/[]/.

Khá thẳng về phía trước: s/./'$&':/gbao quanh mỗi ký tự với dấu ngoặc kép và thêm một :sau. $\được in ngầm sau mỗi lần in, do đó, đặt nó thành []đầu ra cuối cùng [].

Hãy thử trực tuyến!


4

Java (OpenJDK 8) ,86 83 76 byte

-3 byte nhờ @KevinCruijssen
-7 byte nhờ @FlorianSchaetz

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

Hãy thử trực tuyến!


Bạn có thể thả 4 byte. Các dấu vết ;không cần phải được tính cho các câu trả lời lambda, ;sau đó }không cần thiết, {}có thể được loại bỏ xung quanh vòng lặp for. Và bạn có thể lưu thêm 4 byte trong Java 10 thay đổi cả Stringcharthành var.
Kevin Cruijssen

4

Brainfuck, 68 byte

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

Hãy thử trực tuyến!


Không hoàn toàn hoạt động với chuỗi trống - trả lại cho tôi hai ký tự không hợp lệ trong bài kiểm tra trực tuyến của bạn. Rất đẹp, nếu không.
NoseKnowsTất cả

@NoseKnowsTất cả tôi dường như không thể sao chép điều đó; Không có đầu vào, tôi không nhận được đầu ra. Bạn có thể cung cấp một liên kết cập nhật với đầu vào đó?
daniero

Đây là những gì tôi nhận được khi tôi chạy nó :. Với một đầu vào trống, nó sẽ trả về "[]" mà không có dấu ngoặc kép.
NoseKnowsTất cả

@NoseKnowsTất cả liên kết của bạn đi đến đầu vào "hello world" (nhận liên kết được cập nhật bằng cách nhấn nút liên kết / chuỗi đó), nhưng vâng, tôi hiểu ý của bạn. Tôi sẽ xem xét điều đó
daniero

1
@NoseKnowsTất cả bạn đi, tôi đã sửa nó;)
daniero

3

Brain-Flak , 135 , 131 byte

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

Hãy thử trực tuyến!

+1byte cho -ccờ.

Cảm ơn WheatWizard vì đã loại bỏ các NOOP rất rõ ràng mà tôi không có lý do XD.


@WheatWizard> _> Vâng, tôi chỉ đang kiểm tra bạn ... Hahaha, cảm ơn vì đã chỉ ra điều đó. Tôi sẽ cố gắng chơi gôn sau, nhưng tôi sẽ thêm nó ngay bây giờ lol
DJMcMayhem

3

ML chuẩn , 52 50 byte

Đã lưu 2 byte nhờ @Laikoni!

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

Hãy thử trực tuyến!

String.translatelà một cái tên không may dài, nhưng là 5 byte ngắn hơn so với sử dụng concat, mapexplode.


@Laikoni cảm ơn! Tôi luôn quên rằng các toán tử có quyền ưu tiên thấp hơn các hàm.
sĩ523

3

Khối , 31 29 byte

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

Acũng có thể được thay thế cho i; cố gắng tìm hiểu xem có cách nào tốt để ép một hoặc hai byte khác không. -2 byte nhờ MickyT! Cũng vượt xa MickyT !

Phù hợp với khối lập phương 3x3x3:

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

Xem nó trực tuyến!

Hãy thử trực tuyến!


Bạn có thể lưu một vài byte, bằng cách sử dụng một vài gia số cho dấu ngoặc cuối cùng. Điều này cho phép dòng dưới cùng được nén một chútuo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT


2

APL (Dyalog) , 21 19 byte

'[]',⍨'.'R'''&'':'

Hãy thử trực tuyến!

'[]',⍨ dấu ngoặc được nối vào

'.' mỗi nhân vật

⎕R PCRE R được đặt với

'''&'':' một trích dẫn, trận đấu, một trích dẫn và dấu hai chấm



2

PHP, 39 byte

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

Chạy như ống với -F.



2

Khối , 27 byte

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

Hãy thử trực tuyến!

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

Xem nó chạy

Một biến thể hơi khác với câu trả lời của Guiseppe . Điều này đặt dấu hai chấm và trích dẫn trên ngăn xếp. Sau đó, nó lặp qua đầu vào, hoán đổi và xuất ra ngăn xếp. Chỉ đầu vào được loại bỏ và dấu hai chấm và dấu ngoặc kép được giữ lại.

Khi kết thúc đầu vào đạt được các kỳ quan IP xung quanh khối một chút, thêm và xuất các dấu ngoặc. Có một vài lệnh dư thừa trong hỗn hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.