Zuckerfreie Syntax

55

In Haskell die Listennotation:

[a,b,c]

Ist nur syntaktischer Zucker für:

a:b:c:[]

Und die Zeichenfolgennotation:

"abc"

Ist nur syntaktischer Zucker für:

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

Dies bedeutet, dass die Zeichenfolge:

"abc"

Ist das gleiche wie:

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

Aufgabe

Wenn Sie eine Zeichenfolge angeben, sollten Sie ausgeben, wie die Version ohne Syntax in Haskell aussehen würde.

Regeln

  • Sie erhalten eine Zeichenfolge mit jeder gültigen Eingabemethode. Sie sollten eine Zeichenfolge ausgeben, die :[]mit jedem Zeichen der Eingabe endet, die von umgeben 'und durch getrennt ist :. Die leere Zeichenfolge sollte ausgegeben werden [].

  • Sie können davon ausgehen, dass Sie keine zu 'maskierenden Zeichen (z. B. Zeilenumbrüche, Tabulatoren ...) erhalten und die Eingabe im druckbaren ASCII-Bereich liegt

  • Dies ist Sie sollten, die Anzahl der Bytes Ihrer Antwort zu minimieren

Testfälle

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   
Weizen-Assistent
quelle
Wird die Eingabe jemals Nicht-ASCII-Werte haben? Ihre Einschränkung für Zeichen, die maskiert werden müssen, setzt voraus, dass wir wissen, welche Zeichen maskiert werden, oder dass Ihre Liste vollständig ist.
FryAmTheEggman
@FryAmTheEggman Sie können davon ausgehen, dass sie im ASCII-Bereich liegen
Wheat Wizard
7
@totallyhuman Das sind nicht mal gültige Haskell. Wenn sie vielleicht wären, aber nett sind sie nicht, definitiv nein.
Wheat Wizard
38
Diese Frage kann alternativ mit "Diet Haskell" betitelt werden.
März,
1
@cairdcoinheringaahing Nein, "und 'sind syntaktisch unterschiedlich.
Weizen-Assistent

Antworten:

85

Haskell , 26 Bytes

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

Probieren Sie es online!

Erläuterung:

In nicht-pointfree Notation und concatMapanstelle von using =<<wird dies

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

Bei einer Zeichenfolge s, bilden wir jedes Zeichen cin einen String "'c':"mit der showFunktion , die eine String - Darstellung der meisten Haskell - Typen zurückgibt. Diese Zeichenfolgen werden verkettet und ein Finale []wird angehängt.

Obwohl von der Herausforderung nicht angefordert, funktioniert diese Antwort sogar mit korrekter Flucht, da sie showsich darum kümmert: f "'"Erträge "'\\'':[]".

Laikoni
quelle
25
Moment mal, meinst du (++'[':']':[]).((++':':[]).show=<<), nein?
Adám
11
Wenn eine Herausforderung eine Antwort von Haskell hat, stimme ich dem aus Prinzip zu. Das geht doppelt für diesen einen.
Ryan Reich
43

Haskell, 33 28 26 Bytes

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

Probieren Sie es online!

folddie angegebene pointfree Funktion von rechts in die Eingabezeichenfolge beginnend mit []. Die Funktion lautet: show char as a Haskell char, dh umgeben von 'und verkettet mit dem Ergebnis, nachdem ein vorangestellt wurde :.

Edit: @ Ørjan Johansen sparte zwei Bytes. Vielen Dank!

nimi
quelle
Ich nehme an, das heißt (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám
1
Ich denke, dies ist der anderen Haskell-Antwort (bei gleicher Byteanzahl) überlegen, da sie :zum Erstellen der Liste verwendet wird und nicht ++, obwohl beide ihre eigene Eleganz haben.
CAD97
4
Das ist ziemlich erstaunlich. Zwei separate Ansätze mit derselben Bytezahl in derselben Sprache.
J Atkin
17

JavaScript ES6, 42 40 31 Bytes

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

Ersetzt jedes Zeichen durch '<char>':und fügt []es am Ende hinzu

Probieren Sie es online!

Downgoat
quelle
1
Ich liebe das an CodeGolf. Ich wusste nie davon $&.
Steve Bennett
16

Common Lisp, 50 42 Bytes

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

Probieren Sie es online!

Reduziert durch den Kommentar von @coredump, indem readstattdessen eine Funktion definiert wird.

Renzo
quelle
1
Willkommen bei PPCG!
Martin Ender
2
Lispeln! Willkommen in der Tat :)
Olivier Dulac
@Renzo Hallo Renzo, du könntest es ein wenig verkleinern, indem du ein anonymes Lambda-Formular verwendest oder einfach read (format t"~{'~a':~}[]"(coerce(read)'list))aufrufst : (einige andere Fragen sind strenger für Ein- und Ausgaben, aber hier ist das in Ordnung)
coredump
@coredump, danke !, Ich habe den Code aktualisiert.
Renzo
11

V , 11 Bytes

Í./'&':
A[]

Probieren Sie es online!

Verwendet einen regulären Ausdruck , um jedes eingegebene Zeichen mit '':und bis zum Ende zu umgeben.A[]

nmjcman101
quelle
10

C 55 54 53 Bytes

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}
Govind Parmar
quelle
1
Sie können das Leerzeichen in entfernenchar *h
Cyoce
1
Sie können puts("[]");stattdessen eine Ausgabe mit einem nachgestellten Zeilenumbruch durchführen, um einige Bytes zu sparen.
Kritixi Lithos
rekursivs(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2
8

Python 3 , 41 38 36 Bytes

-2 Bytes dank ovs

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

Probieren Sie es online!

Stange
quelle
Whoops ... Vergessen, dass *mapexistiert ...
Mr. Xcoder
Ich war in input()den letzten 20 Minuten (im wahrsten Sinne des Wortes) von der Leere verwirrt , als es nur ein Lambda sein konnte.
Rod
@ WheatWizard oh, ich habe einen Leer-Leer-Eingang (kein Zeilenumbruch) verwendet
Rod
Sie können ersetzen "[]"mit[]
ovs
8

05AB1E , 15 12 11 10 Bytes

-3 Bytes dank carusocomputing
-1 Bytes dank Adnan
-1 Bytes dank der genialen Idee von Erik the Outgolfer

ʒ"'ÿ':"?},

Probieren Sie es 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
quelle
Anscheinend habe ich dich um 4 Sekunden geschlagen ;-)
Digitales Trauma
1
@DigitalTrauma Mit freundlichen Grüßen, als ich auf "Antwort posten" drückte.
Riley
1
Sie können das globale Array drucken, anstatt die Klammern mit 3 Byte zu verschieben. Sie können die Zeichenfolge auch interpolieren, um eine weitere vy"'ÿ':"?}¯?
Magic Octopus Urn,
@carusocomputing Ich verwende den String-Interpolator die ganze Zeit für Testsuiten, vergesse jedoch, ihn in tatsächlichem Code zu verwenden. Vielen Dank!
Riley
@carusocomputing Ich dachte, es vy"'ÿ':"}¯Jwürde für 11 funktionieren, aber Jin dieser Situation tritt es dem globalen Array bei, nicht dem gesamten Stack.
Riley
8

R, 51 Bytes

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))
tc
quelle
1
Schöne lösung! Ein paar Möglichkeiten, wie Sie ein paar Bytes sparen und dies wirklich in den Griff bekommen können. Mit der Standard-E / A-Funktion können Sie einfach eine anonyme Funktion zurückgeben oder sogar Eingaben von stdin entgegennehmen, wobei letztere viel kürzer wäre als die Verwendung scan(,'')einer Funktion.
Giuseppe
Danke, ich bin ein bisschen wie ein Neuling mit R (und Code Golf!), Habe also noch keine anonymen Funktionen darin verstanden, obwohl ich versucht habe, es ohne "Funktion" dort zu tun. scan könnte nützlich sein!
tc
ach ja, eine anonyme Funktion ist nur eine, bei der Sie sie keiner Variablen zuweisen, also löschen Sie sie einfach f<-vom Anfang Ihres Codes
Giuseppe,
paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') ist 43
Zahiro Mor
8

Pyth, 14 10 8 Bytes

j\:a`MQY

Versuche dies!

-2 Bytes dank @isaacg

Schließlich ist Pyth gut in etwas.

Erläuterung

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :
KarlKastor
quelle
@isaacg Danke! Ich habe es vergessen Mund ich weiß nicht, warum ich es nicht benutzt habe a. Jetzt sind wir mindestens 2 Bytes kürzer als alle anderen Lösungen hier!
KarlKastor
7

Perl 6 , 19 Bytes

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

Retina, 12

  • 3 Bytes gespart dank @FryAmTheEggman
.
'$ &':
$
[]

2 Stufen:

  • für jedes verbleibende Zeichen setzen Sie es ' ':um
  • []am ende hinzufügen

Probieren Sie es online aus .

Digitales Trauma
quelle
Hat dem Typ geholfen, den du 4 Sekunden geschlagen hast;).
Magic Octopus Urn
Ich habe darüber nachgedacht!
CalculatorFeline
6

Python 2 , 48 46 44 37 Bytes

-2 Bytes dank Rod. -7 Bytes dank Weizen-Assistent.

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

Probieren Sie es online!

total menschlich
quelle
1
Etwas kürzer
Wheat Wizard
Oh, ordentlich. Vielen Dank!
Totalhuman
1
Eine kürzer als lambda s:':'.join(map(repr,[*s,[]]))oder lambda s:':'.join(map(repr,s))+":[]".
Xnor
@xnor Das zweite Beispiel, das Sie angeben, scheint für den leeren Fall nicht zu funktionieren. (Die ursprüngliche Antwort sah der sehr ähnlich, aber zahlte viel, um die leere Zeichenfolge Fall zu decken)
Weizen-Assistent
6

JavaScript (ES6), 36 Byte

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

Versuch es

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

Zottelig
quelle
5

Jelly ,  11 10  8 Bytes

-1 Byte dank Christian (Verkettung entfernen ;und stattdessen implizites Drucken verwenden)

+0 Bytes (für die Kanten bei leeren String fixiert - vorher das vollständige Programm: ŒṘ€j”:“:[])

-2 Dank an Erik den Outgolfer (Verwendung panstelle von ;€since ”:ist effektiv Länge 1; Verwendung Ø[seitdem es zu einer Abkürzung geworden ist ⁾[])

ŒṘ€p”:Ø[

Probieren Sie es online!

Ein vollständiges Programm, das das Ergebnis druckt (als Link wird eine Liste mit Zeichenlisten zurückgegeben).

... aber gibt es eine Möglichkeit, mit STDIN zu sparen?

Wie?

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

PHP , 41 Bytes

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

Probieren Sie es online!

Jörg Hülsermann
quelle
4 Bytes kürzer: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956
@ user63956 brauchst es nicht zusätzlich <?mit welcher option muss es laufen? Machen Sie einen eigenen Ansatz Ich würde sagen, um Gegenstimmen zu bekommen und Titus hat in der Zwischenzeit etwas Ähnliches gemacht
Jörg Hülsermann
Es funktioniert mit der -RFlagge. Tags können auch in Konstruktionen wie eval()und geschlossen werden create_function().
user63956
4

Perl 5 , 22 Bytes

19 Byte Code + -pFlag.

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

Oder für das gleiche bytecount s/./'$&':/g;s/$/[]/.

Ganz einfach: s/./'$&':/gUmgibt jedes Zeichen mit Anführungszeichen und fügt ein Nachher hinzu :. $\wird implizit nach jedem Druck gedruckt, setzen Sie es also so, dass es []das Finale ausgibt [].

Probieren Sie es online!

Dada
quelle
4

Java (OpenJDK 8) ,86 83 76 Bytes

-3 Bytes dank @KevinCruijssen
-7 Bytes dank @FlorianSchaetz

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

Probieren Sie es online!

Schüchterner Beluga
quelle
Sie können 4 Bytes löschen. Die nacheilenden ;nicht für Lambda - Antworten gezählt werden muss, die ;nach dem }überhaupt nicht notwendig, und das {und }kann rund um die for-Schleife entfernt werden. Und Sie könnten in Java 10 4 weitere Bytes einsparen, indem Sie sowohl das Stringals auch das charin ändern var.
Kevin Cruijssen
4

Brainfuck, 68 Bytes

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

Probieren Sie es online!

daniero
quelle
Funktioniert nicht ganz mit der leeren Zeichenfolge - hat mir zwei ungültige Zeichen in Ihrem Onlinetest zurückgegeben. Ansonsten sehr schön.
NoseKnowsAll
@NoseKnowsAll Ich kann das scheinbar nicht wiederholen. Ohne Eingabe bekomme ich keine Ausgabe. Könnten Sie einen aktualisierten Link zu diesem Eingang bereitstellen?
Daniero
Das habe ich bekommen, als ich es laufen lasse :. Bei einer leeren Eingabe sollte "[]" ohne Anführungszeichen zurückgegeben werden.
NoseKnowsAll
@NoseKnowsAll Ihr Link führt zum Eingang "Hallo Welt" (Sie erhalten einen aktualisierten Link, indem Sie auf diesen Link- / Kettenknopf klicken), aber ja, ich verstehe, was Sie meinen. Ich werde das untersuchen
daniero
1
@NoseKnowsAll Los geht's, ich habe es behoben;)
daniero
3

Brain-Flak , 135 , 131 Bytes

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

Probieren Sie es online!

+1Byte für die -cFlagge.

Vielen Dank an WheatWizard für das Entfernen von sehr offensichtlichen NOOPs, die ich ohne Grund XD hatte.

DJMcMayhem
quelle
@WheatWizard> _> Ja, ich habe Sie gerade getestet ... Hahaha, danke, dass Sie darauf hingewiesen haben. Ich werde später versuchen, mehr Golf zu spielen, aber ich werde das jetzt hinzufügen lol
DJMcMayhem
3

Standard ML , 52 50 Bytes

2 Bytes gespart dank @Laikoni!

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

Probieren Sie es online!

String.translateist ein leider langer Name, aber es war 5 Byte kürzer als die Verwendung von concat, mapund explode.

musicman523
quelle
@Laikoni danke! Ich vergesse immer, dass Operatoren eine niedrigere Priorität haben als Funktionen.
musicman523
3

Cubix , 31 29 Bytes

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

Akann auch ersetzt werden i; versuchen herauszufinden, ob es eine gute Möglichkeit gibt, ein oder zwei weitere Bytes daraus herauszuholen. -2 Bytes dank MickyT! Auch von MickyT überfordert !

Passt auf einen 3x3x3 Würfel:

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

Schau es dir online an!

Probieren Sie es online!

Giuseppe
quelle
Sie können einige Bytes speichern, indem Sie für die letzte Klammer einige Inkremente verwenden. Dadurch kann das uo@[)o'U);!A?ro;o;o;os:'/u:''
Endergebnis
2

Python 2 , 47 Bytes

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

Probieren Sie es online!

Stange
quelle
Ich hatte den gleichen Ansatz, aber ich habe den [1:-1]Teil nicht herausgefunden, so dass er länger als total menschlich war. +1
Wheat Wizard
Merkwürdigerweise ist die einfache Lösung nur 3 Byte länger (in Python 3).
Mr. Xcoder
2

APL (Dyalog) , 21 19 Bytes

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

Probieren Sie es online!

'[]',⍨ die Klammern hingen an

'.' jeder Charakter

⎕R PCRE R ersetzt mit

'''&'':' ein Zitat, das Streichholz, ein Zitat und ein Doppelpunkt

Adam
quelle
2

PHP, 39 Bytes

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

Als Rohr mit laufen lassen -F.

Titus
quelle
2

Cubix , 27 Bytes

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

Probieren Sie es online!

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

Schau es dir an

Eine etwas andere Variante als Guiseppes Antwort . Dadurch werden der Doppelpunkt und das Anführungszeichen auf den Stapel gelegt. Dann durchläuft es die Eingabe, tauscht den Stapel aus und gibt ihn aus. Nur die Eingabe wird verworfen und der Doppelpunkt und das Anführungszeichen bleiben erhalten.

Sobald das Ende der Eingabe erreicht ist, wandern die IP-Wunder ein wenig um den Würfel und fügen die Klammern hinzu und geben sie aus. Es gibt ein paar redundante Befehle im Mix.

MickyT
quelle