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':[]   

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 "'\\'':[]".


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!


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!


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.


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.


10

C, 55 54 53 byte

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

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

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

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),'[]'))

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 :

@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



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!



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>


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): []

4

PHP , 41 byte

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

Cobalah online!


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!


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!


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!


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.


@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.


@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!


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

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



2

PHP, 39 byte

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

Jalankan sebagai pipa dengan -F.



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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.