Syntaxe sans sucre

55

En Haskell la notation de liste:

[a,b,c]

Est-ce juste du sucre syntaxique pour:

a:b:c:[]

Et la notation de chaîne:

"abc"

Est-ce juste du sucre syntaxique pour:

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

Cela signifie que la chaîne:

"abc"

Est le même que:

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

Tâche

Avec une chaîne de caractères, vous devriez indiquer à quoi ressemblerait la version sans syntaxe dans Haskell.

Règles

  • Vous recevrez une chaîne par n'importe quelle méthode d'entrée valide. Vous devez générer une chaîne se terminant :[]par chaque caractère de l'entrée entouré 'et séparé par :. La chaîne vide devrait sortir [].

  • Vous pouvez supposer que vous ne recevrez pas de caractères nécessitant une évasion (par exemple ', des nouvelles lignes, des tabulations ...) et que la saisie sera dans la plage imprimable ascii

  • Ceci est le vous devriez viser à minimiser le nombre d'octets de votre réponse

Cas de test

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   
Assistant de blé
la source
L'entrée aura-t-elle jamais des valeurs non-ASCII? Votre restriction sur les caractères nécessitant un échappement nécessite que nous sachions quels caractères Haskell échappera ou supposera que votre liste est exhaustive.
FryAmTheEggman
@FryAmTheEggman Vous pouvez supposer qu'ils se trouvent dans la gamme ascii
Wheat Wizard
7
@totallyhuman Celles-ci ne sont même pas valides Haskell. S'ils l'étaient peut-être, mais gentils, ils ne le sont pas, certainement pas.
Wheat Wizard
38
Cette question peut aussi être intitulée "Diet Haskell".
Mars Ho
1
@cairdcoinheringaahing Non, "et 'sont syntaxiquement différents.
Wheat Wizard

Réponses:

85

Haskell , 26 octets

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

Essayez-le en ligne!

Explication:

En notation non-pointfree et en utilisant concatMapau lieu de =<<, cela devient

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

Étant donné une chaîne s, nous mappons chaque caractère cà une chaîne en "'c':"utilisant la showfonction qui retourne une représentation sous forme de chaîne de la plupart des types Haskell. Ces chaînes sont concaténées et une finale []est ajoutée.

Bien que cela ne soit pas demandé par le défi, cette réponse fonctionne même avec une évasion correcte, car elle en showprend soin: les f "'"rendements "'\\'':[]".

Laikoni
la source
25
Attends une minute, tu veux dire (++'[':']':[]).((++':':[]).show=<<), non?
Adám
11
Lorsque tout défi a une réponse Haskell, je l’inverse par principe. Cela va double pour celui-ci.
Ryan Reich
43

Haskell, 33 28 26 octets

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

Essayez-le en ligne!

foldla fonction sans point donnée de la droite dans la chaîne de saisie commençant par []. La fonction est la suivante: affiche char comme un caractère Haskell, c’est-à-dire entouré 'et concaténé avec le résultat jusqu’à présent après avoir placé un :devant.

Edit: @ Ørjan Johansen a sauvegardé deux octets. Merci!

nimi
la source
Je suppose que cela signifie (++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[]).
Adám
1
Je pense que cela est supérieur à l’autre réponse de Haskell (au même nombre d’octets) en raison de l’utilisation :de la liste plutôt que de celle-ci ++, bien que les deux aient leur propre élégance.
CAD97
4
C'est plutôt incroyable. Deux approches distinctes qui ont le même nombre d'octets dans la même langue.
J Atkin
17

JavaScript ES6, 42 40 31 octets

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

Remplace chaque caractère par '<char>':, puis ajoute []à la fin

Essayez-le en ligne!

Downgoat
la source
1
J'aime ça à propos de CodeGolf. Jamais su à propos de $&.
Steve Bennett
16

Common Lisp, 50 42 octets

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

Essayez-le en ligne!

Réduit grâce au commentaire de @coredump, en utilisant readau lieu de définir une fonction.

Renzo
la source
1
Bienvenue chez PPCG!
Martin Ender
2
Zézayer! Bienvenue en effet :)
Olivier Dulac
Salut @Renzo Renzo, vous pouvez réduire un peu en utilisant une forme anonyme lambda, ou simplement appeler lecture: (format t"~{'~a':~}[]"(coerce(read)'list))(d'autres questions sont plus strictes entrées et sorties WRT, mais ici cela est bien beau)
coredump
@coredump, merci !, j'ai mis à jour le code.
Renzo
11

V , 11 octets

Í./'&':
A[]

Essayez-le en ligne!

Utilise une expression rationnelle pour entourer chaque caractère saisi, '':puis se Atermine []à la fin.

nmjcman101
la source
10

C, 55 54 53 octets

s(char*h){while(*h)printf("'%c':",*h++);puts("[]");}
Govind Parmar
la source
1
vous pouvez supprimer cet espacechar *h
Cyoce
1
Vous pouvez faire puts("[]");une sortie avec un retour à la ligne de fin pour sauvegarder quelques octets.
Kritixi Lithos
récursives(char*h){*h?printf("'%c':",*h++),s(h):puts("[]");}
l4m2
8

Python 3 , 41 38 36 octets

-2 octets grâce aux ovs

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

Essayez-le en ligne!

Barre
la source
Oups ... Oublié qui *mapexiste ...
M. Xcoder
Le vide m'a laissé perplexe input()pendant les 20 dernières minutes (littéralement), alors qu'il pourrait s'agir simplement d'un lambda @. @
Rod
@ WheatWizard oh, j'utilisais une entrée vide-vide (pas de nouvelle ligne)
Rod
Vous pouvez remplacer "[]"par[]
OVS
8

05AB1E , 15 12 11 10 octets

-3 octets grâce à carusocomputing
-1 octet grâce à Adnan
-1 octet grâce à l'idée géniale d'Erik the Outgolfer

ʒ"'ÿ':"?},

Essayez-le en ligne!

ʒ          # 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
la source
Apparemment, je vous ai battu de 4 secondes ;-)
Digital Trauma
1
@DigitalTrauma Yours est apparu alors que j'appuyais sur Poster votre réponse.
Riley
1
Vous pouvez imprimer le tableau global au lieu de pousser les crochets avec 3 octets. Vous pouvez également interpoler la chaîne pour économiser un autre octet, pour un total de -3. Le résultat final est de 12 octets:vy"'ÿ':"?}¯?
Urne Magic Octopus
@carusocomputing J'utilise l'interpolateur de chaîne tout le temps pour les suites de tests, mais j'oublie de l'utiliser dans le code réel. Merci!
Riley
@carusocomputing, je pensais que vy"'ÿ':"}¯Jcela fonctionnerait pour 11, mais Jrejoint le tableau global, pas toute la pile dans cette situation.
Riley
8

R, 51 octets

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))
tc
la source
1
Belle solution! Quelques façons de sauvegarder des octets et d’obtenir cela vraiment. Les E / S par défaut vous permettent de simplement renvoyer une fonction anonyme, ou même de prendre une entrée de stdin, cette dernière étant beaucoup plus courte si vous utilisiez scan(,'')une fonction.
Giuseppe
Merci, je suis un peu novice avec R (et le code golf!), Donc je n’ai pas encore tout à fait saisi les fonctions anonymes, même si j’essayais de le faire sans "fonction". scan pourrait être utile!
tc
ah, eh bien, une fonction anonyme est juste une fonction dans laquelle vous ne l'attribuez pas à une variable, vous devez donc simplement laisser tomber f<-le début du code
Giuseppe
paste0 (gsub ('(.)', "'\\ 1':", scan (, "")), '[]') est
égal à
8

Pyth, 14 10 8 octets

j\:a`MQY

Essaye ça!

-2 octets grâce à @isaacg

Enfin, pyth est bon à quelque chose.

explication

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :
KarlKastor
la source
@isaacg Merci! J'ai oublié Met je ne sais pas pourquoi je n'ai pas utilisé a. Maintenant, nous avons au moins 2 octets plus courts que toutes les autres solutions ici!
KarlKastor
7

Perl 6 , 19 octets

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

Rétine, 12

  • 3 octets sauvés grâce à @FryAmTheEggman
.
'$ &':
$
[]

2 étapes:

  • pour chaque personnage restant mis ' ':autour
  • ajouter []à la fin

Essayez-le en ligne .

Trauma numérique
la source
A aidé le gars que vous avez battu de 4 secondes à vous égaler;).
Urne Magic Octopus
Je pensais à ça!
CalculatriceFeline
6

Python 2 , 48 46 44 37 octets

-2 octets grâce à Rod. -7 octets grâce à Wheat Wizard.

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

Essayez-le en ligne!

totalement humain
la source
1
Légèrement plus court
Wheat Wizard
Oh, chouette. Merci!
totalement humain
1
Un plus court que lambda s:':'.join(map(repr,[*s,[]]))ou lambda s:':'.join(map(repr,s))+":[]".
xnor
@xnor Le deuxième exemple que vous donnez ne semble pas fonctionner pour le cas vide. (La réponse originale ressemblait beaucoup à cela, mais payait beaucoup pour couvrir le cas de chaîne vide)
Wheat Wizard
6

JavaScript (ES6), 36 octets

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

L'essayer

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

Hirsute
la source
5

Jelly ,  11 10  8 octets

-1 octet grâce à Christian (supprime la concaténation ;et utilise plutôt l'impression implicite)

+0 octets (fixée au boîtier de bord d'une chaîne vide - préalablement le programme complet: ŒṘ€j”:“:[])

-2 grâce à Erik the Outgolfer (utiliser pà la place de ;€depuis ”:est en réalité longueur 1; utiliser Ø[car il est devenu raccourci pour ⁾[])

ŒṘ€p”:Ø[

Essayez-le en ligne!

Un programme complet imprimant le résultat (sous forme de lien, il renvoie une liste de listes de caractères).

... mais existe-t-il un moyen de sauvegarder en utilisant STDIN?

Comment?

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

PHP , 41 octets

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

Essayez-le en ligne!

Jörg Hülsermann
la source
4 octets plus court: for(;~$c=$argn[$i++];)echo"'$c':"?>[].
user63956
@ user63956 n'en a pas besoin de plus <?avec quelle option doit-il être exécuté? Faites une approche personnelle, je dirais pour obtenir des votes positifs et titus ont fait quelque chose de similaire dans l'intervalle
Jörg Hülsermann
Cela fonctionne avec le -Rdrapeau. Les tags peuvent être fermés même dans des constructions telles que eval()et create_function().
user63956
4

Perl 5 , 22 octets

19 octets de code + -pdrapeau.

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

Ou, pour le même bytecount, s/./'$&':/g;s/$/[]/.

Assez simple: s/./'$&':/gentoure chaque caractère avec des guillemets et ajoute un :après. $\est implicitement imprimé après chaque impression, il faut donc le paramétrer pour []produire la finale [].

Essayez-le en ligne!

Dada
la source
4

Java (OpenJDK 8) ,86 83 76 octets

-3 octets grâce à @KevinCruijssen
-7 octets grâce à @FlorianSchaetz

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

Essayez-le en ligne!

Beluga timide
la source
Vous pouvez supprimer 4 octets. La fin ;ne doit pas être comptée pour les réponses lambda, ;après le }n'est pas nécessaire du tout, et le {et }peut être supprimé autour de la boucle for. Et vous pourriez économiser 4 octets supplémentaires dans Java 10 en changeant les Stringet charen var.
Kevin Cruijssen
4

brainfuck, 68 octets

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

Essayez-le en ligne!

Daniero
la source
Ne fonctionne pas vraiment avec la chaîne vide - m'a renvoyé deux caractères non valides dans votre test en ligne. Très bien, sinon.
NoseKnowsAll
@NoseKnowsAll Je n'arrive pas à reproduire cela. Sans entrée je n'obtiens aucune sortie. Pourriez-vous fournir un lien mis à jour avec cette entrée?
daniero
Voilà ce que je suis quand je le lance . Avec une entrée vide, il devrait retourner "[]" sans les guillemets.
NoseKnowsAll
@NoseKnowsAll Votre lien mène à l'entrée "hello world" (obtenez un lien mis à jour en appuyant sur ce bouton lien / chaîne), mais oui, je comprends ce que vous voulez dire. Je vais regarder dans ça
daniero
1
@NoseKnowsAll Voilà, je l'ai corrigé;)
daniero
3

Brain-Flak , 135 , 131 octets

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

Essayez-le en ligne!

+1octet pour le -cdrapeau.

Merci à WheatWizard d’avoir supprimé les NOOP très évidents que j’avais sans raison XD.

DJMcMayhem
la source
@WheatWizard> _> Ouais, je viens de te tester ... Hahaha, merci de l'avoir signalé. J'essaierai de
jouer
3

ML standard , 52 50 octets

2 octets sauvés grâce à @Laikoni!

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

Essayez-le en ligne!

String.translateest un nom malheureusement long, mais était 5 octets plus court que d' utiliser concat, mapet explode.

musicman523
la source
@ Laikoni merci! J'oublie toujours que les opérateurs ont une priorité inférieure à celle des fonctions.
musicman523
3

Cubix , 31 29 octets

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

Apeut également être substitué à i; essayer de savoir s’il existe un bon moyen de presser un ou plusieurs octets supplémentaires. -2 octets grâce à MickyT! Également surpassé par MickyT !

Convient à un cube 3x3x3:

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

Regardez-le en ligne!

Essayez-le en ligne!

Giuseppe
la source
Vous pouvez enregistrer quelques octets en utilisant quelques incréments pour le dernier crochet. Cela permet de compresser un peu le résultat uo@[)o'U);!A?ro;o;o;os:'/u:''
final
2

Python 2 , 47 octets

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

Essayez-le en ligne!

Barre
la source
J'avais la même approche mais je n'avais pas [1:-1]compris la partie, donc c'était plus long que totalement humain. +1
Wheat Wizard
Étrange que la solution triviale ne soit que 3 octets de plus (en Python 3).
M. Xcoder le
2

APL (Dyalog) , 21 19 octets

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

Essayez-le en ligne!

'[]',⍨ les crochets annexés à

'.' chaque personnage

⎕R PCRE R eplaced avec

'''&'':' une citation, le match, une citation et un colon

Adam
la source
2

PHP, 39 octets

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

Courez comme un tuyau avec -F.

Titus
la source
2

Cubix , 27 octets

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

Essayez-le en ligne!

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

Regarde le courir

Une variation légèrement différente de la réponse de Guiseppe . Cela met le côlon et la citation sur la pile. Ensuite, il boucle l’entrée, permute et sort la pile. Seules les entrées sont supprimées et les deux points et la citation sont conservés.

Une fois que la fin de la saisie est atteinte, l’adresse IP s’interroge un peu autour du cube, ajoutant et affichant les crochets. Il y a quelques commandes redondantes dans le mélange.

MickyT
la source