Sintaks Bebas Gula

55

Dalam Haskell daftar notasi:

[a,b,c]

Ini hanya gula sintaksis untuk:

a:b:c:[]

Dan notasi string:

"abc"

Ini hanya gula sintaksis untuk:

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

Ini berarti bahwa string:

"abc"

Sama dengan:

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

Tugas

Diberikan string, Anda harus menampilkan seperti apa versi de-sintaks akan terlihat di Haskell.

Aturan

  • Anda akan menerima string dengan metode input yang valid, Anda harus menampilkan string yang diakhiri :[]dengan setiap karakter dari input yang dikelilingi oleh 'dan dipisahkan oleh :. String kosong harus ditampilkan [].

  • Anda dapat berasumsi bahwa Anda tidak akan menerima karakter apa pun yang memerlukan pelarian (mis. ', Baris baru, tab ...) dan input itu akan berada dalam rentang ascii yang dapat dicetak

  • Ini adalah Anda harus meminimalkan jumlah byte jawaban Anda

Uji Kasus

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   
Wisaya Gandum
sumber
Apakah input akan memiliki nilai non-ascii? Pembatasan Anda pada karakter yang perlu melarikan diri mengharuskan kami tahu karakter mana yang akan diloloskan Haskell atau menganggap daftar Anda lengkap.
FryAmTheEggman
@FryAmTheEggman Anda dapat mengasumsikan bahwa mereka berada dalam kisaran ascii
Wheat Wizard
7
@totallyhuman Itu bahkan bukan Haskell yang valid. Jika mungkin, tapi bagus tidak, jelas tidak.
Wheat Wizard
38
Pertanyaan ini dapat secara alternatif berjudul "Diet Haskell".
Maret
1
@cairdcoinheringaahing Tidak, "dan 'secara sintaksis berbeda.
Wheat Wizard

Jawaban:

85

Haskell , 26 byte

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

Cobalah online!

Penjelasan:

Dalam notasi non-pointfree dan concatMapalih-alih menggunakan =<<, ini menjadi

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

Diberikan string s, kami memetakan setiap char cke string "'c':"menggunakan showfungsi yang mengembalikan representasi string dari sebagian besar tipe Haskell. String-string itu digabungkan dan final []ditambahkan.

Meskipun tidak diminta oleh tantangan, jawaban ini bahkan berfungsi dengan benar, karena showmengurusnya: f "'"menghasilkan "'\\'':[]".

Laikoni
sumber
25
Tunggu sebentar, maksudmu (++'[':']':[]).((++':':[]).show=<<), bukan?
Adám
11
Ketika setiap tantangan memiliki jawaban Haskell, saya membatalkannya berdasarkan prinsip. Yang dua kali lipat untuk yang satu ini.
Ryan Reich
43

Haskell, 33 28 26 byte

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

Cobalah online!

foldfungsi pointfree yang diberikan dari kanan ke string input dimulai dengan []. Fungsinya adalah: menunjukkan char sebagai haskell char, yaitu dikelilingi dengan 'dan digabungkan dengan hasilnya sejauh ini setelah meletakkan :di depannya.

Sunting: @ Ørjan Johansen menyimpan dua byte. Terima kasih!

nimi
sumber
Saya kira itu artinya (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám
1
Saya pikir ini lebih unggul daripada jawaban Haskell lainnya (pada jumlah byte yang sama) karena menggunakan :untuk membangun daftar daripada ++, meskipun keduanya memiliki keanggunan sendiri.
CAD97
4
Ini agak luar biasa. Dua pendekatan terpisah yang memiliki jumlah byte yang sama dalam bahasa yang sama.
J Atkin
17

JavaScript ES6, 42 40 31 byte

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

Ganti setiap karakter dengan '<char>':, lalu tambahkan []ke bagian akhir

Cobalah online!

Downgoat
sumber
1
Saya suka ini tentang CodeGolf. Tidak pernah tahu $&.
Steve Bennett
16

Common Lisp, 50 42 byte

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

Cobalah online!

Mengurangi berkat komentar @coredump, dengan menggunakan readalih-alih mendefinisikan fungsi.

Renzo
sumber
1
Selamat datang di PPCG!
Martin Ender
2
Pelat! Selamat datang memang :)
Olivier Dulac
@Renzo Hai Renzo, Anda dapat mengecilkannya sedikit dengan menggunakan formulir lambda anonim, atau cukup menelepon read: (format t"~{'~a':~}[]"(coerce(read)'list))(beberapa pertanyaan lain adalah input dan output wrt yang lebih ketat, tetapi di sini ini baik-baik saja)
coredump
@coredump, terima kasih !, saya telah memperbarui kodenya.
Renzo
11

V , 11 byte

Í./'&':
A[]

Cobalah online!

Menggunakan regex untuk mengelilingi setiap karakter input dengan '':dan kemudian Ahabiskan []sampai akhir.

nmjcman101
sumber
10

C, 55 54 53 byte

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}
Govind Parmar
sumber
1
Anda dapat menghapus ruang dichar *h
Cyoce
1
puts("[]");Sebagai gantinya, Anda dapat melakukan output dengan baris baru tambahan untuk menyimpan beberapa byte.
Kritixi Lithos
rekursifs(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2
8

Python 3 , 41 38 36 byte

-2 bytes terima kasih kepada ovs

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

Cobalah online!

tongkat
sumber
Whoops ... Lupa yang *mapada ...
Mr. Xcoder
Saya bingung dengan yang kosong input()selama 20 menit terakhir (secara harfiah), ketika itu bisa saja lambda @. @
Rod
@WheatWizard oh, saya menggunakan input kosong-kosong (tidak ada baris baru)
Rod
Anda dapat menggantinya "[]"dengan[]
ovs
8

05AB1E , 15 12 11 10 byte

-3 byte terima kasih kepada carusocomputing
-1 byte terima kasih kepada Adnan
-1 byte terima kasih kepada Erik the Outgolfer's genius idea

ʒ"'ÿ':"?},

Cobalah online!

ʒ          # 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
Riley
sumber
Rupanya saya mengalahkan Anda 4 detik ;-)
Digital Trauma
1
@DigitalTrauma Milik Anda muncul saat saya menekan Posting Jawaban Anda.
Riley
1
Anda dapat mencetak array global alih-alih mendorong tanda kurung dengan 3 byte. Anda juga dapat menginterpolasi string untuk penghematan byte lain dengan total -3, hasil akhir 12-byte:vy"'ÿ':"?}¯?
Magic Octopus Guci
@carusocomputing Saya menggunakan interpolator string sepanjang waktu untuk test suites, tetapi lupa untuk menggunakannya dalam kode aktual. Terima kasih!
Riley
@carusocomputing saya pikir vy"'ÿ':"}¯Jakan bekerja untuk 11, tetapi Jbergabung dengan array global, bukan seluruh tumpukan dalam situasi itu.
Riley
8

R, 51 byte

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))
tc
sumber
1
Solusi bagus! Beberapa cara Anda dapat menghemat beberapa byte dan benar-benar menurunkannya. default I / O memungkinkan Anda mengembalikan fungsi anonim, atau bahkan mengambil input dari stdin, yang terakhir akan jauh lebih pendek menggunakan scan(,'')daripada fungsi.
Giuseppe
Terima kasih, saya sedikit pemula dengan R (dan kode golf!) Jadi belum cukup memahami fungsi anonim di dalamnya, meskipun saya mencoba melakukannya tanpa 'fungsi' di sana. pemindaian bisa bermanfaat!
tc
ah, baik fungsi anonim hanya satu di mana Anda tidak menetapkannya ke variabel sehingga Anda hanya akan membuang f<-dari awal kode Anda
Giuseppe
paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') adalah 43
Zahiro Mor
8

Pyth, 14 10 8 byte

j\:a`MQY

Coba ini!

-2 byte terima kasih kepada @isaacg

Akhirnya, pyth pandai dalam sesuatu.

penjelasan

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :
KarlKastor
sumber
@isaacg Terima kasih! Saya lupa Mdan saya tidak tahu mengapa saya tidak menggunakannya a. Sekarang kita setidaknya 2 byte lebih pendek dari semua solusi lain di sini!
KarlKastor
7

Perl 6 , 19 byte

{S:g|.|'$/':|~'[]'}
Sean
sumber
7

Retina, 12

  • 3 byte disimpan berkat @FryAmTheEggman
.
'$ &':
$
[]

2 tahap:

  • untuk setiap karakter yang tersisa letakkan ' ':di sekitarnya
  • tambahkan []sampai akhir

Cobalah online .

Trauma Digital
sumber
Membantu pria yang Anda kalahkan 4 detik mengikat Anda;).
Magic Gurita Guci
Saya sedang memikirkan ini!
CalculatorFeline
6

Python 2 , 48 46 44 37 byte

-2 byte terima kasih kepada Rod. -7 byte berkat Wheat Wizard.

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

Cobalah online!

benar-benar manusiawi
sumber
1
Sedikit lebih pendek
Wisaya Gandum
Oh rapi Terima kasih!
totallyhuman
1
Satu lebih pendek sebagai lambda s:':'.join(map(repr,[*s,[]]))atau lambda s:':'.join(map(repr,s))+":[]".
xnor
@ xnor Contoh kedua yang Anda berikan tampaknya tidak berfungsi untuk kasing kosong. (jawaban aslinya terlihat sangat mirip dengan itu tetapi membayar banyak untuk menutupi kasing kosong)
Wheat Wizard
6

JavaScript (ES6), 36 byte

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

Cobalah

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

Shaggy
sumber
5

Jelly ,  11 10  8 byte

-1 byte terima kasih kepada Christian (hilangkan penggabungan ;dan gunakan pencetakan implisit sebagai gantinya)

0 byte (tetap untuk kasus tepi string kosong - sebelumnya program penuh: ŒṘ€j”:“:[])

-2 Terima kasih kepada Erik the Outgolfer (digunakan psebagai pengganti ;€karena ”:secara efektif panjang 1; gunakan Ø[karena telah menjadi singkatan untuk ⁾[])

ŒṘ€p”:Ø[

Cobalah online!

Program lengkap mencetak hasilnya (sebagai tautan, ia mengembalikan daftar daftar karakter).

... tetapi apakah ada cara untuk menghemat menggunakan STDIN?

Bagaimana?

ŒṘ€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): []
Jonathan Allan
sumber
4

PHP , 41 byte

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

Cobalah online!

Jörg Hülsermann
sumber
4 byte pendek: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956
@ user63956 perlu bukan tambahan <?dengan opsi mana yang harus dijalankan? Buat pendekatan sendiri, saya akan mengatakan untuk mendapatkan upvotes dan titus telah melakukan hal yang sama untuk saat ini
Jörg Hülsermann
Ini bekerja dengan -Rbendera. Tag dapat ditutup bahkan dalam konstruksi seperti eval()dan create_function().
user63956
4

Perl 5 , 22 byte

19 byte kode + -pbendera.

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

Atau, untuk bytecount yang sama, s/./'$&':/g;s/$/[]/.

Cukup lurus ke depan: s/./'$&':/gmengelilingi setiap karakter dengan tanda kutip dan tambahkan :setelah. $\dicetak secara implisit setelah setiap cetak, jadi mengaturnya untuk []menampilkan hasil akhir [].

Cobalah online!

Dada
sumber
4

Java (OpenJDK 8) ,86 83 76 byte

-3 byte terima kasih kepada @KevinCruijssen
-7 byte terima kasih kepada @FlorianSchaetz

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

Cobalah online!

Bashful Beluga
sumber
Anda dapat menjatuhkan 4 byte. Trailing ;tidak harus dihitung untuk jawaban lambda, ;setelah }itu tidak diperlukan sama sekali, dan {dan }dapat dihapus di sekitar for-loop. Dan Anda bisa menghemat 4 byte lagi di Jawa 10 mengubah baik Stringdan charuntuk var.
Kevin Cruijssen
4

brainfuck, 68 byte

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

Cobalah online!

daniero
sumber
Tidak cukup berfungsi dengan string kosong - mengembalikan saya dua karakter yang tidak valid dalam pengujian online Anda. Sangat bagus, jika tidak.
NoseKnowsAll
@NoseKnowsAll Sepertinya saya tidak bisa meniru itu; Tanpa input, saya tidak mendapatkan output. Bisakah Anda memberikan tautan yang diperbarui dengan input itu?
daniero
Inilah yang saya dapatkan ketika saya menjalankannya :. Dengan input kosong, itu harus mengembalikan "[]" tanpa tanda kutip.
NoseKnowsAll
@NoseKnowsAll Tautan Anda masuk ke input "hello world" (dapatkan tautan yang diperbarui dengan menekan tombol tautan / rantai itu), tapi ya, saya mengerti maksud Anda. Saya akan melihat ke dalam itu
daniero
1
@NoseKnowsAll Here you go, saya memperbaikinya;)
daniero
3

Brain-Flak , 135 , 131 byte

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

Cobalah online!

+1byte untuk -cbendera.

Terima kasih kepada WheatWizard karena telah menghapus NOOP yang sangat jelas yang saya miliki tanpa alasan XD.

DJMcMayhem
sumber
@WheatWizard> _> Ya, saya baru saja menguji Anda ... Hahaha, terima kasih telah menunjukkan itu. Saya akan mencoba bermain golf nanti, tapi saya akan menambahkannya sekarang lol
DJMcMayhem
3

Standar ML , 52 50 byte

Disimpan 2 byte berkat @Laikoni!

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

Cobalah online!

String.translateadalah nama sayangnya panjang, tapi 5 byte lebih pendek daripada menggunakan concat, mapdan explode.

musicman523
sumber
@Laikoni terima kasih! Saya selalu lupa bahwa operator memiliki prioritas lebih rendah daripada fungsi.
musicman523
3

Cubix , 31 29 byte

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

Ajuga bisa diganti i; mencoba mencari tahu apakah ada cara yang baik untuk memeras satu atau dua byte dari ini. -2 byte terima kasih kepada MickyT! Juga kalah oleh MickyT !

Cocok pada kubus 3x3x3:

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

Tonton secara online!

Cobalah online!

Giuseppe
sumber
Anda dapat menyimpan beberapa byte, dengan menggunakan beberapa peningkatan untuk braket terakhir. Ini memungkinkan intinya sedikit dikompresiuo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT
2

Python 2 , 47 byte

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

Cobalah online!

tongkat
sumber
Saya memiliki pendekatan yang sama tetapi saya tidak mengetahui [1:-1]bagian itu jadi itu lebih lama daripada total manusia. +1
Wheat Wizard
Aneh bahwa solusi sepele hanya 3 byte lebih lama (dengan Python 3).
Tn. Xcoder
2

APL (Dyalog) , 21 19 byte

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

Cobalah online!

'[]',⍨ tanda kurung ditambahkan

'.' setiap karakter

⎕R PCRE R di- eplaced dengan

'''&'':' kutipan, korek api, kutipan dan titik dua

Adm
sumber
2

PHP, 39 byte

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

Jalankan sebagai pipa dengan -F.

Titus
sumber
2

Cubix , 27 byte

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

Cobalah online!

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

Lihat saja

Variasi yang sedikit berbeda dari jawaban Guiseppe . Ini menempatkan titik dua dan mengutip pada tumpukan. Kemudian loop melalui input, menukar dan mengeluarkan stack. Hanya input yang dihapus dan titik dua dan kutipan dipertahankan.

Setelah akhir input tercapai, IP akan bertanya-tanya di sekitar kubus sedikit, menambah dan mengeluarkan tanda kurung. Ada beberapa perintah yang berlebihan dalam campuran.

MickyT
sumber