Şekersiz Sözdizimi


55

Haskell'de liste gösterimi:

[a,b,c]

Sadece sözdizimsel şeker mi:

a:b:c:[]

Ve dize notasyonu:

"abc"

Sadece sözdizimsel şeker mi:

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

Bu dize anlamına gelir:

"abc"

Aynıdır:

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

Görev

Bir dize verildiğinde, sözdizimi kaldırılmış sürümün Haskell'de nasıl görüneceğini göstermelisiniz.

kurallar

  • Herhangi bir geçerli giriş yöntemiyle bir dize alacaksınız, :[]çevrili 've çevrili olan girişten gelen her karakterle biten bir dize çıkarmalısınız :. Boş dizge çıktı vermelidir [].

  • Çıkış gerektiren herhangi bir karakter (örneğin ', yeni satırlar, sekmeler ...) almayacağınızı ve bu girişin yazdırılabilir ascii aralığında olacağını varsayabilirsiniz.

  • Bu , cevabınızın bayt sayısını en aza indirmeyi hedeflemelisiniz

Test Kılıfları

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

Giriş hiç ascii olmayan değerlere sahip olacak mı? Kaçmayı gerektiren karakterler üzerindeki kısıtlamanızın, Haskell'in hangi karakterlerden kaçacağını bilmesini veya listenizin ayrıntılı olduğunu varsaymamızı gerektirir.
FryAmTheEggman

@FryAmTheEggman Ascii aralığında olduklarını varsayabilirsin
Wheat Wizard

7
@totallyhuman Bunlar geçerli Haskell bile değil. Eğer belki, ama güzellerse, kesinlikle hayır.
Buğday Sihirbazı,

38
Bu soru alternatif olarak "Diyet Haskell" başlıklı olabilir.
Mart Ho,

1
@cairdcoinheringaahing Hayır "ve 'sözdizimsel olarak farklı.
Buğday Sihirbazı

Yanıtlar:


85

Haskell , 26 bayt

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

Çevrimiçi deneyin!

Açıklama:

Noktasız gösterimde ve kullanım concatMapyerine =<<, bu olur

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

Bir dize göz önüne alındığında s, her char, harita cbir dizeye "'c':"kullanarak showen Haskell türlerinin bir dize temsilini döndürür işlevi. Bu dizeler bitiştirilmiş ve son[] eklenir.

Bu zorluğun gerektirmemesine rağmen, bu cevap doğru kaçma ile bile çalışır, çünkü showbununla ilgilenir: f "'"verim "'\\'':[]".


25
Bekle bir dakika (++'[':']':[]).((++':':[]).show=<<), hayır mı?
Adám

11
Herhangi bir meydan okuma bir Haskell cevabına sahip olduğunda, bunu prensipten mahrum bıraktım. Bunun için iki katına çıkar.
Ryan Reich,

43

Haskell, 33 28 26 bayt

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

Çevrimiçi deneyin!

foldverilen noktasuz işlev, sağdan başlayarak giriş dizgisine girer []. İşlev şudur: char'i bir Haskell karakteri olarak göster, yani etrafına bir satır 'yerleştirdikten sonra sonuçla sarılmış ve birleştirilmiş :.

Düzenleme: @ Ørjan Johansen iki bayt kaydetti. Teşekkürler!


Sanırım bu demek oluyor (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám

1
Her ikisi de kendi zarafetine sahip olsa :da listeyi oluşturmaktan dolayı diğer Haskell cevabından (aynı byte sayısında) daha üstün olduğunu düşünüyorum ++.
CAD97

4
Bu oldukça şaşırtıcı. Aynı byte sahip iki ayrı yaklaşım aynı dilde sayılır.
J Atkin



16

Ortak Lisp, 50 42 bayt

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

Çevrimiçi deneyin!

readBir fonksiyon tanımlamak yerine, @coredump'un yorumu sayesinde azaltıldı .


1
PPCG'ye Hoşgeldiniz!
Martin Ender

2
Lisp! Gerçekten hoş geldiniz :)
Olivier Dulac

@Renzo Merhaba Renzo, anonim bir lambda formu kullanarak ya da sadece okuyarak çağırarak biraz küçültebilirsiniz: (format t"~{'~a':~}[]"(coerce(read)'list))(diğer bazı sorular girdiler ve çıktılar bakımından daha katıdır, ancak işte bu iyidir)
coredump

@ coredump, teşekkürler !, Kodu güncelledim.
Renzo


10

C, 55 54 53 bayt

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

1
boşlukları kaldırabilirsinizchar *h
Cyoce

1
Bunun puts("[]");yerine, bazı baytları kaydetmek için izleyen bir yeni satırla çıkış yapmak için yapabilirsiniz .
Kritixi Lithos 14:17

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


8

05AB1E , 15 12 11 10 bayt

Carusocomputing
-1 -1 bayt sayesinde Adnan Bayt sayesinde -3 bayt
, Outgolfer'in dehası fikri Erik sayesinde

ʒ"'ÿ':"?},

Çevrimiçi deneyin!

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

Görünüşe göre 4 saniye ile seni
Digital Trauma 19

1
@DigitalTrauma Cevabınızı Gönder düğmesine basarken belirir.
Riley,

1
Parantezleri 3 baytla itmek yerine genel diziyi yazdırabilirsiniz. Ayrıca, toplam 3, son sonuç 12 bayt için dize başka bir bayt tasarrufuna enterpolasyonu yapabilirsiniz:vy"'ÿ':"?}¯?
Magic Octopus Urn

@carusocomputing Test takımları için her zaman string interpolator'ı kullanıyorum, ancak gerçek kodda kullanmayı unutma. Teşekkürler!
Riley,

@carusocomputing vy"'ÿ':"}¯J11 için işe yarayacağını düşündüm , ama Jbu durumda tüm yığını değil, global diziye katılıyor.
Riley,

8

R, 51 bayt

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

1
Güzel çözüm! Birkaç byte tasarruf yapmanın ve bunu gerçekten azaltmanın birkaç yolu. varsayılan I / O sadece isimsiz bir işlev döndürmenizi veya scan(,'')bir işlev yerine kullanımı çok daha kısa olan stdin'den girdi almanızı sağlar .
Giuseppe

Teşekkürler, R (ve kod golf!) İle ilgili bir sorunum yok, bu yüzden içinde 'anonim' işlemler yapmayı denememe rağmen, henüz anonim işlevleri anlamadım. tarama faydalı olabilir!
tc

ah, peki anonim bir işlev, onu bir değişkene atayamazsınız, bu yüzden f<-kodunuzun başından
Giuseppe

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

8

Pyth, 14 10 8 bayt

j\:a`MQY

Bunu dene!

@İsaacg sayesinde -2 bayt

Son olarak, pyth bir şeyde iyidir.

açıklama

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

@isaacg Teşekkürler! Unuttum Mve neden kullanmadığımı bilmiyorum a. Şimdi buradaki diğer çözümlerden en az 2 bayt daha kısayız!
KarlKastor



6

Python 2 , 48 46 44 37 bayt

Rod sayesinde -2 bayt. Buğday Sihirbazı sayesinde -7 bayt.

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

Çevrimiçi deneyin!



Oh, temiz. Teşekkürler!
tamamen insan

1
Bir lambda s:':'.join(map(repr,[*s,[]]))veya daha kısa lambda s:':'.join(map(repr,s))+":[]".
xnor

@xnor Verdiğiniz ikinci örnek boş dava için işe yaramaz gibi görünüyor. (Orijinal cevap buna çok benziyordu ama boş sicim kasasını kapsaması için çok para ödedi)
Buğday Sihirbazı


6

JavaScript (ES6), 36 bayt

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

Dene

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


5

Jöle ,  11 10  8 bayt

Christian sayesinde -1 bayt (bitiştirmeyi kaldırın ;ve bunun yerine örtük yazdırmayı kullanın)

+ 0 bayt (boş bir dize kenar durum için sabit - daha önce tam program: ŒṘ€j”:“:[])

-2 Outgolfer erik sayesinde (kullanımı pyerine ;€beri ”:etkin bir uzunluğu 1; kullanımı Ø[bu için kestirme bir uygulama haline geldiğinden ⁾[])

ŒṘ€p”:Ø[

Çevrimiçi deneyin!

Sonucu basan tam bir program (link olarak karakter listelerinin bir listesini döndürür).

... ama STDIN kullanarak tasarruf yapmanın bir yolu var mı?

Nasıl?

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

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

Çevrimiçi deneyin!


4 bayt kısa: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956

@ user63956 <?, hangi seçeneğin çalıştırılması gerektiğini gerektirmiyor mu? Kendi yaklaşımınızı yaratın diyebilirim ki titiz ve titus bu arada benzer bir şey yaptı
Jörg Hülsermann

-RBayrakla çalışır . Etiketler, eval()ve gibi yapılarda bile kapatılabilir create_function().
user63956

4

Perl 5 , 22 bayt

19 bayt kodu + -pbayrak.

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

Veya, aynı bayt için s/./'$&':/g;s/$/[]/.

Oldukça dümdüz: s/./'$&':/gHer karakteri tırnak işareti ile çevreleyen ve :sonrasını ekleyin . $\Her bir baskıdan sonra örtük bir şekilde basılır, bu nedenle []finalin çıktısına ayarlanır [].

Çevrimiçi deneyin!


4

Java (OpenJDK 8) ,86 83 76 bayt

@KevinCruijssen sayesinde -3 bayt @FlorianSchaetz
sayesinde -7 bayt

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

Çevrimiçi deneyin!


4 bayt bırakabilirsiniz. Arka ;lambda cevaplar sayılması zorunda değildir, ;sonra }hiç gerekli değildir, ve {ve }dongu etrafında çıkarılabilir. Ve değişen hem Java 10'da 4 daha bayt kurtarabilecek Stringve chariçin var.
Kevin Cruijssen

4

brainfuck, 68 bayt

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

Çevrimiçi deneyin!


Boş dizeyle pek çalışmaz - çevrimiçi testinizde bana geçerli olmayan iki karakter döndürdü. Aksi takdirde çok güzel.
NoseKnowsTüm

@NoseKnowsTüm çoğaltmak gibi görünmüyor; Giriş olmadan çıkış alamıyorum. Bu girişle güncellenmiş bir bağlantı verebilir misiniz?
daniero

Bu onu çalıştırdığınızda ne var . Boş bir girişte, tırnak işaretleri olmadan "[]" döndürülmelidir.
NoseKnowsTüm

@NoseKnowsAll Bağlantınız "merhaba dünya" girişine gider (bu bağlantı / zincir düğmesine basarak güncellenmiş bir bağlantı elde edin), ama evet, ne demek istediğinizi anlıyorum. Ona bakacağım
daniero

1
@NoseKnowsAll Oraya gittin, ben düzelttim;)
daniero

3

Brain-Flak , 135 , 131 bayt

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

Çevrimiçi deneyin!

+1-cbayrak için bayt .

WheatWizard'a, sebepsiz yere XD'ye sahip olduğum çok açık NOOP'leri çıkardığı için teşekkür ederiz.


@WheatWizard> _> Evet, sadece seni test ediyordum ... Hahaha, bunu gösterdiğin için teşekkürler. Daha sonra golf oynamayı deneyeceğim, ama şimdi şunu ekleyeceğim: lol
DJMcMayhem

3

Standart ML , 52 50 bayt

@Likonik sayesinde 2 bayt kaydedildi!

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

Çevrimiçi deneyin!

String.translateBir maalesef uzun adıdır, ancak 5 bayt kullanmaktan daha kısaydı concat, mapve explode.


@Likonik teşekkürler! Operatörlerin fonksiyonlardan daha düşük önceliğe sahip olduğunu daima unutuyorum.
musicman523

3

Cubix , 31 29 bayt

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

Aayrıca ikame edilebilir i; Bundan bir veya iki bayt sıkmak için iyi bir yol olup olmadığını anlamaya çalışıyorum. MickyT sayesinde -2 bayt! Ayrıca MickyT tarafından aşıldı !

3x3x3 küp üzerine uyar:

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

Online izleyin!

Çevrimiçi deneyin!


Son ayraç için birkaç artış kullanarak birkaç bayttan tasarruf edebilirsiniz. Bu, en alt satırın biraz sıkıştırılmasına izin veriyoruo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT




2

PHP, 39 bayt

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

İle boru olarak çalıştırın -F.



2

Cubix , 27 bayt

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

Çevrimiçi deneyin!

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

Çalıştırılmasını izle

Guiseppe'nin cevabından biraz farklı bir varyasyon . Bu kolonu ve alıntıyı yığına koyar. Sonra giriş boyunca dolaşır, yığını değiştirir ve çıkarır. Sadece girdi hurdaya çıkarılır ve sütun ve alıntı korunur.

Girişin sonuna gelindiğinde IP, küpün biraz etrafını dolaşarak parantezleri ekleyip çıkarır. Karışımda birkaç gereksiz komut vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.