ไวยากรณ์ปราศจากน้ำตาล


55

ใน Haskell สัญลักษณ์รายการ:

[a,b,c]

เป็นเพียงน้ำตาลประโยคสำหรับ:

a:b:c:[]

และสัญกรณ์สตริง:

"abc"

เป็นเพียงน้ำตาลประโยคสำหรับ:

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

ซึ่งหมายความว่าสตริง:

"abc"

เหมือนกับ:

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

งาน

รับสายคุณควรส่งออกสิ่งที่รุ่น de- ไวยากรณ์จะมีลักษณะเช่นใน Haskell

กฎระเบียบ

  • คุณจะได้รับสตริงโดยวิธีการป้อนข้อมูลที่ถูกต้องคุณควรเอาท์พุทสตริงลงท้ายด้วย:[]ด้วยตัวอักษรจากการป้อนข้อมูลที่ล้อมรอบไปด้วยทุกและแยกจากกันโดย' สตริงที่ว่างเปล่าควรเอาท์พุท:[]

  • คุณสามารถสันนิษฐานได้ว่าคุณจะไม่ได้รับอักขระใด ๆ ที่ต้องมีการหลบหนี (เช่นการ'ขึ้นบรรทัดใหม่แท็บ ... ) และข้อมูลนั้นจะอยู่ในช่วง ascii ที่พิมพ์ได้

  • นี่คือคุณควรตั้งเป้าเพื่อลดจำนวนไบต์ของคำตอบของคุณ

กรณีทดสอบ

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

อินพุตจะมีค่าที่ไม่ใช่ ASCII หรือไม่? ข้อ จำกัด ของคุณเกี่ยวกับตัวละครที่ต้องหลบหนีเราต้องการทราบว่าตัวละครตัวไหนที่ Haskell จะหลบหนีหรือคิดว่ารายการของคุณหมดจด
FryAmTheEggman

@FryAmTheEggman คุณสามารถสรุปได้ว่าพวกเขาอยู่ในช่วง ascii
Wheat Wizard

7
@tallyallyhuman เหล่านั้นไม่ถูกต้องแม้แต่ Haskell หากพวกเขาอาจจะ แต่ดีที่พวกเขาไม่ได้ไม่แน่นอน
ข้าวสาลีตัวช่วยสร้าง

38
คำถามนี้อาจตั้งชื่ออีกนัยหนึ่งว่า "ไดเอทแฮสเคลล์"
March Ho

1
@cairdcoinheringaahing ไม่ "และ'มีความแตกต่างทางไวยากรณ์
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


85

Haskell , 26 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

ในรูปแบบที่ไม่ใช่ประเด็นและใช้concatMapแทน=<<สิ่งนี้จะกลายเป็น

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

รับสตริงsเราจับคู่อักขระแต่ละตัวcกับสตริง"'c':"โดยใช้showฟังก์ชั่นซึ่งจะคืนค่าการแทนสตริงของประเภท Haskell ส่วนใหญ่ สตริงเหล่านั้นถูกต่อกันและสุดท้าย[]จะถูกต่อท้าย

แม้ว่าจะไม่ได้รับการร้องขอจากความท้าทายที่คำตอบนี้แม้จะทำงานร่วมกับหนีที่เหมาะสมเพราะshowจะดูแลมัน: อัตราผลตอบแทนf "'""'\\'':[]"


25
เดี๋ยวก่อนคุณหมายถึง(++'[':']':[]).((++':':[]).show=<<)ไม่
อดัม

11
เมื่อความท้าทายใด ๆ มีคำตอบของ Haskell ฉันก็ถอนมันออกจากหลักการ นั่นจะเพิ่มเป็นสองเท่าสำหรับอันนี้
Ryan Reich

43

Haskell, 33 28 26 ไบต์

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

ลองออนไลน์!

foldฟังก์ชั่น pointfree []รับจากขวาเข้ามาในสายป้อนที่เริ่มต้นด้วย ฟังก์ชั่นคือ: แสดงถ่านเป็นถ่าน Haskell เช่นล้อมรอบด้วย'และเชื่อมต่อกับผลลัพธ์จนถึงหลังจากวาง:ด้านหน้า

แก้ไข: @ Ørjan Johansen บันทึกสองไบต์ ขอบคุณ!


(++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[])ฉันคิดว่านั่นหมายความว่า
อดัม

1
ฉันคิดว่านี่ดีกว่าคำตอบ Haskell อื่น ๆ (ในจำนวนไบต์เดียวกัน) เนื่องจากใช้:เพื่อสร้างรายการมากกว่า++แม้ว่าทั้งสองจะมีความสง่างามของตัวเอง
CAD97

4
มันค่อนข้างน่าทึ่ง วิธีการแยกกันสองวิธีที่มีจำนวนไบต์เท่ากันในภาษาเดียวกัน
J Atkin


17

JavaScript ES6, 42 40 31 ไบต์

s=>s.replace(/./g,"'$&':")+"[]"

แทนที่แต่ละอักขระด้วย'<char>':แล้วเพิ่ม[]ไปยังจุดสิ้นสุด

ลองออนไลน์!


1
ฉันชอบสิ่งนี้เกี่ยวกับ CodeGolf $&ไม่เคยรู้เกี่ยวกับ
Steve Bennett

16

เสียงกระเพื่อมสามัญ50 42 ไบต์

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

ลองออนไลน์!

ลดลงเนื่องจากความคิดเห็นของ @coredump โดยใช้readแทนการกำหนดฟังก์ชัน


1
ยินดีต้อนรับสู่ PPCG!
Martin Ender

2
ชัด! ยินดีต้อนรับแน่นอน :)
Olivier Dulac

@Renzo Hi Renzo คุณอาจหดตัวลงเล็กน้อยโดยใช้แบบฟอร์มการแลมบ์ดาที่ไม่ระบุชื่อหรือเพียงโทรอ่าน: (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

Python 3 , 41 38 36 ไบต์

-2 ไบต์ต้องขอบคุณ ovs

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

ลองออนไลน์!


อ๊ะ ... ลืมไปว่า*mapมีอยู่ ...
นาย Xcoder

ฉันงงงวยกับความว่างเปล่าinput()ในช่วง 20 นาทีที่ผ่านมา (ตามตัวอักษร) เมื่อเป็นแลมบ์ดา @. @
Rod


@WheatWizard โอ้ผมก็ใช้ที่ว่างเปล่าว่างเปล่า (ไม่มีการขึ้นบรรทัดใหม่) นำเข้า
ร็อด

คุณสามารถแทนที่"[]"ด้วย[]
ovs

8

05AB1E , 15 12 11 10 ไบต์

-3 ไบต์ขอบคุณ carusocomputing
-1 ไบต์ขอบคุณ Adnan
-1 ไบต์ขอบคุณ Eius the Outgolfer

ʒ"'ÿ':"?},

ลองออนไลน์!

ʒ          # 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 ของคุณโผล่ขึ้นมาขณะที่ฉันกดโพสต์คำตอบของคุณ
Riley

1
คุณสามารถพิมพ์อาร์เรย์ส่วนกลางแทนการกดวงเล็บด้วย 3 ไบต์ นอกจากนี้คุณยังสามารถแก้ไขสตริงสำหรับการประหยัดไบต์อื่นรวม -3 ผลสุดท้าย 12 ไบต์:vy"'ÿ':"?}¯?
Magic Octopus Urn

@carusocomputing ฉันใช้ interpolator สตริงตลอดเวลาสำหรับชุดทดสอบ แต่ลืมที่จะใช้มันในรหัสจริง ขอบคุณ!
Riley

@carusocomputing ฉันคิดว่าvy"'ÿ':"}¯Jจะใช้งานได้ 11 แต่Jเข้าร่วมอาร์เรย์ทั่วโลกไม่ใช่กองทั้งหมดในสถานการณ์นั้น
Riley

8

R, 51 ไบต์

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

1
ทางออกที่ดี! สองสามวิธีที่คุณสามารถบันทึกไบต์และทำให้สิ่งนี้แย่ลง I / O เริ่มต้นช่วยให้คุณเพียงแค่ส่งคืนฟังก์ชั่นที่ไม่ระบุชื่อหรือแม้กระทั่งรับอินพุตจาก stdin ซึ่งส่วนหลังจะสั้นกว่าการใช้scan(,'')ฟังก์ชั่นแทน
Giuseppe

ขอบคุณ, ฉันเพิ่งรู้จัก newb กับ R (และ code golf!) ดังนั้นฉันจึงยังไม่เข้าใจฟังก์ชั่นที่ไม่ระบุชื่อแม้ว่าฉันจะพยายามทำโดยไม่มีฟังก์ชั่น 'อยู่ที่นั่น สแกนอาจมีประโยชน์!
tc

อ่าฟังก์ชั่นนิรนามเป็นเพียงหนึ่งในสิ่งที่คุณไม่ได้กำหนดให้กับตัวแปรดังนั้นคุณเพียงแค่ปล่อยf<-โค้ดตั้งแต่ต้น
Giuseppe

paste0 (gsub ('(.)', "'\\ 1':", สแกน (, "")), '[]') คือ 43
Zahiro Mor

8

Pyth, 14 10 8 ไบต์

j\:a`MQY

ลองนี้สิ!

-2 ไบต์ต้องขอบคุณ @isaacg

ในที่สุด 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


7

เรติน่า 12

  • บันทึก 3 ไบต์ด้วย @FryAmTheEggman
.
'$ &':
$
[]

2 ขั้นตอน:

  • สำหรับตัวละครที่เหลือแต่ละตัวจะนำมา' ':ล้อมรอบมัน
  • เพิ่ม[]ไปยังจุดสิ้นสุด

ลองมันออนไลน์


ช่วยคนที่คุณเอาชนะด้วย 4 วินาทีให้คุณ;)
Magic Octopus Urn

ฉันคิดถึงสิ่งนี้!
CalculatorFeline

6

Python 2 , 48 46 44 37 ไบต์

-2 ไบต์ต้องขอบคุณ Rod -7 ไบท์ขอบคุณข้าวสาลีวิซาร์ด

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

ลองออนไลน์!



โอ้เรียบร้อย ขอบคุณ!
มนุษย์

1
หนึ่งสั้นลงหรือlambda s:':'.join(map(repr,[*s,[]])) lambda s:':'.join(map(repr,s))+":[]"
xnor

@xnor ตัวอย่างที่สองที่คุณให้ดูเหมือนจะไม่ทำงานสำหรับกรณีที่ว่างเปล่า (คำตอบเดิมดูคล้ายกันมาก แต่จ่ายมากเพื่อครอบคลุมกรณีสตริงว่างเปล่า)
Wheat Wizard



5

เจลลี่ ,  11 10  8 ไบต์

-1 ไบต์ขอบคุณ Christian (ลบการต่อข้อมูล;และใช้การพิมพ์โดยนัยแทน)

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

PHP , 41 ไบต์

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

ลองออนไลน์!


4 for(;~$c=$argn[$i++];)echo"'$c':"?>[]ไบต์สั้น:
user63956

@ user63956 ไม่จำเป็นต้องใช้<?ตัวเลือกใดเพิ่มเติมที่จะต้องใช้ สร้างวิธีการของตัวเองฉันจะบอกว่าให้ upvotes และติตัสได้ทำสิ่งที่คล้ายกันในระหว่างนี้
JörgHülsermann

มันทำงานกับ-Rธง แท็กสามารถปิดได้แม้ในการก่อสร้างเช่นและeval() create_function()
user63956

4

Perl 5 , 22 ไบต์

19 ไบต์ของรหัสเมือง + -pธง

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

หรือสำหรับ bytecount s/./'$&':/g;s/$/[]/เดียวกัน

ค่อนข้างตรงไปข้างหน้า: s/./'$&':/gล้อมรอบอักขระแต่ละตัวด้วยเครื่องหมายคำพูดและเพิ่ม:หลัง $\จะถูกพิมพ์โดยปริยายหลังจากแต่ละพิมพ์เพื่อให้การตั้งค่าให้ออกผลลัพธ์สุดท้าย[][]

ลองออนไลน์!


4

Java (OpenJDK 8) ,86 83 76 ไบต์

-3 ไบต์ขอบคุณ @KevinCruijssen -7 ไบต์ขอบคุณ@FlorianSchaetz

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

ลองออนไลน์!


คุณสามารถปล่อย 4 ไบต์ การลาก;ไม่จำเป็นต้องนับสำหรับคำตอบแลมบ์ดา;หลังจาก}นั้นไม่จำเป็นเลยและ{และ}สามารถลบออกได้รอบ ๆ ลูป และคุณสามารถบันทึก 4 ไบต์อื่น ๆ ใน Java 10 การเปลี่ยนแปลงทั้งในStringและเพื่อchar var
Kevin Cruijssen

4

brainfuck, 68 ไบต์

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

ลองออนไลน์!


ใช้งานไม่ได้กับสตริงว่าง - ส่งคืนอักขระที่ไม่ถูกต้องสองตัวในการทดสอบออนไลน์ของคุณ ดีมากมิฉะนั้น
NoseKnowsAll

@NoseKnowsAll ฉันดูเหมือนจะไม่สามารถทำซ้ำได้ ไม่มีอินพุตฉันไม่ได้เอาต์พุต คุณสามารถให้ลิงค์ปรับปรุงกับอินพุตนั้นได้หรือไม่
daniero

นี่คือสิ่งที่ฉันได้รับเมื่อฉันใช้มัน : หากมีอินพุตว่างคุณควรส่งคืน "[]" โดยไม่มีเครื่องหมายคำพูด
NoseKnowsAll

@NoseKnowsAll ลิงก์ของคุณไปที่อินพุต "hello world" (รับลิงก์ที่อัปเดตโดยกดปุ่มลิงค์ / ปุ่มลูกโซ่) แต่ใช่ฉันได้รับสิ่งที่คุณหมายถึง ฉันจะดูว่า
daniero

1
@NoseKnows ทั้งหมดคุณไปฉันแก้ไขมัน)
daniero

3

Brain-Flak , 135 , 131 bytes

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

ลองออนไลน์!

+1ไบต์สำหรับ-cธง

ขอบคุณ WheatWizard ที่ลบ NOOPs ที่เห็นได้ชัดมากที่ฉันไม่มีเหตุผล XD


@Weateatizard> _> ใช่ฉันแค่ทดสอบคุณ ... ฮ่าฮ่าฮ่าขอบคุณที่ชี้ให้เห็น ฉันจะลองเล่นกอล์ฟในภายหลัง แต่ฉันจะเพิ่มเข้าไปในตอนนี้ฮ่า ๆ ๆ
DJMcMayhem

3

มาตรฐาน ML , 52 50 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @Laikoni!

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

ลองออนไลน์!

String.translateเป็นที่น่าเสียดายที่ชื่อยาว แต่ก็ 5 ไบต์สั้นกว่าการใช้concat, และmapexplode


@Laikoni ขอบคุณ! ฉันมักจะลืมว่าผู้ประกอบการมีความสำคัญต่ำกว่าฟังก์ชั่น
musicman523

3

Cubix , 31 29 ไบต์

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

Aยังสามารถทดแทนสำหรับi; พยายามหาว่ามีวิธีที่ดีในการบีบไบต์อื่นหรือสองจากนี้ -2 ไบต์ต้องขอบคุณ MickyT! นอกจากนี้ยังoutgolfed โดย MickyT !

พอดีกับลูกบาศก์ 3x3x3:

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

ดูออนไลน์!

ลองออนไลน์!


คุณสามารถบันทึกสองสามไบต์โดยใช้การเพิ่มขึ้นสองครั้งสำหรับวงเล็บสุดท้าย สิ่งนี้ทำให้บรรทัดล่างถูกบีบอัดเล็กน้อยuo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT

2

Python 2 , 47 ไบต์

lambda a:`list(a)+[[]]`.replace(', ',':')[1:-1]

ลองออนไลน์!


ฉันมีวิธีการแบบเดียวกัน แต่ฉันไม่ได้เข้าใจ[1:-1]ส่วนนี้ดังนั้นจึงนานกว่ามนุษย์ทั้งหมด +1
ตัวช่วยสร้างข้าวสาลี

แปลกที่โซลูชันเล็ก ๆ น้อย ๆนั้นมีความยาวเพียง 3 ไบต์ (ใน Python 3)
นาย Xcoder





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.