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

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


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!


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!


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.


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


10

C, 55 54 53 octets

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

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!


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

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

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 :

@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



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!



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>


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

4

PHP , 41 octets

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

Essayez-le en ligne!


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!


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!


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!


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.


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


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


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

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



2

PHP, 39 octets

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

Courez comme un tuyau avec -F.



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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.