Voici un défi relativement simple pour vous.
Avec une chaîne de longueur N , affichez la chaîne en avant, puis en arrière, puis en avant, puis en arrière, etc. N fois. Par exemple, si votre contribution était
Hello!
Vous devriez produire:
Hello!!olleHHello!!olleHHello!!olleH
Vous pouvez également éventuellement sortir une nouvelle ligne de fin.
Votre soumission peut être un programme complet ou une fonction, et vous pouvez saisir les entrées et les sorties dans un format raisonnable . Par exemple, vous pouvez prendre IO de STDIN / STDOUT, des arguments de fonction et une valeur renvoyée, d'un fichier, etc. Vous pouvez supposer en toute sécurité que la chaîne d'entrée ne sera pas vide et ne contiendra que de l'ASCII imprimable. Vous devez sortir la nouvelle chaîne sur une seule ligne. Ainsi, par exemple, si la sortie du dernier exemple était
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
Ce ne serait pas une solution valable!
Voici quelques autres cas de test:
Input:
a
Output:
a
Input:
abcd
Output:
abcddcbaabcddcba
Input:
OK!
Output:
OK!!KOOK!
Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184
Input:
PPCG
Output:
PPCGGCPPPPCGGCPP
Input:
42
Output:
4224
Classements
Comme il s’agit d’un défi de code-golf , les échappatoires standard sont interdites et la réponse la plus courte en octets l’emporte! Cependant , il s’agit également d’ un concours visant à obtenir la réponse la plus courte dans une langue donnée. Bien qu'il soit peu probable qu'une réponse Java batte une réponse en perl ou dans un langage de golf, il est toujours très impressionnant de disposer de la réponse Java la plus courte. Donc, vous pouvez utiliser ce classement pour voir à la fois
La réponse la plus courte de toutes les langues, et
La réponse la plus courte dans chaque langue.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=93261,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
olleH
, nonelloH
?Réponses:
Vim,
39, 34 frappes5 octets sauvés grâce à @Lynn!
Voici un gif de ce qui se passe en direct: (Notez que ce gif est d'une version précédente depuis que je n'ai pas encore eu le temps de le réenregistrer).
Et voici une explication de la façon dont cela fonctionne:
Sur une note de côté,
Y
saisit une nouvelle ligne, ce qui est généralement une caractéristique odieuse. C'est probablement la toute première fois qu'il enregistre plusieurs octets!la source
:%s/\n<cr>
, vous pouvez fairev{gJ
pour sauvegarder trois octets.@q
est vide au début, non? ou@q
avant l'enregistrement arrêter ferait quelque chose d'arbitraire. (Cela m'amène à mon vim trivium préféré que je viens de citer: tout le monde sait que quitter vim est aussi simple que:q<CR>
ça, mais comment pouvez-vous fermer et sauvegarder tous vos fichiers? Facile: justeqqqqqZZ@qq@q
!)@q
d'être vide. Pourquoi ne pas simplement faire à la:wqa
place? Vous voulez aussi savoir comment générer une fractale dans vim?qqqqq<C-w>v<C-w>n@qq@q
: DPython, 40 octets
Une fonction récursive. Ajoute la chaîne d'entrée
s
à la fonction de l'inverse jusqu'à ce que le compteuri
dépasse la longueur des
.la source
lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]
d'un octet.f = lambda s : ''.join([s[((-1)**(i//len(s)) <= 0)*(len(s)-1)+(-1)**(i//len(s))*(i%len(s))] for i in range(len(s)*len(s))])
mais c'est 136 octets selonsys.sizeof
, curieusement c'est la même taille quef = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Brain-Flak ,
418378228 octetsCeci est mon chef-d'œuvre Brain-Flak. Ce n'est peut-être pas bien joué, mais le défi est le plus difficile que j'ai jamais rencontré.
Essayez-le en ligne!
Explication
Cette explication est maintenant un peu dépassée, mais elle explique quand même assez bien le programme.
Cette explication sera un peu différente de mon processus d’explication habituel. Je vais expliquer comment je suis arrivé à ce résultat plutôt que d'expliquer le résultat dans l'ordre. Ici ça va:
Rouleau
Après avoir travaillé un peu sur le problème, je suis arrivé avec ce code:
Ce code (où n est le littéral d’un nombre donné, par exemple
()()
) prend l’élément en haut de la pile et le déplace vers le bas de n étapes. Avec n comme hauteur de pile, cela effectuera une pile "roll". c'est-à-dire déplacer l'élément du haut vers le bas de la pile. Voici comment cela fonctionne:Nous plaçons l'endroit où nous souhaitons déplacer l'élément de moins un sur la pile. Pourquoi moins un? Je ne sais pas si ça marche comme ça.
On boucle ensuite jusqu'à ce que ce nombre atteigne zéro en gardant trace de la boucle avec un
()
.Chaque fois que nous faisons une boucle, nous sélectionnons l’élément supérieur et le déplaçons sous celui-ci vers l’autre pile. Cela met le nombre en haut à sa place.
Tout ce que nous avons à faire maintenant, c'est de remettre les chiffres que nous avons reculés. Nous passons en mode hors pile et poussons le nombre de points de la boucle.
Nous lançons en boucle décrémentant le nombre nouvellement poussé jusqu'à ce qu'il atteigne zéro. A chaque fois, on avance d'un numéro.
Sens inverse
J'ai ensuite modifié le lancer pour faire un reverse stack complet:
Encore une fois, n représente la profondeur de l'inverse. C'est-à-dire que les n premiers éléments de la pile seront inversés. Comment ça marche:
Le revers n'est qu'un rouleau enroulé de manière fantaisiste. On fait simplement rouler le haut de la pile n fois en décrémentant la profondeur du rouleau d'une fois.
Dupliquer
La duplication en place est difficile. Vraiment dur. Après avoir compris comment inverser la pile, il fallait encore beaucoup d'efforts pour trouver l'algorithme de duplication.
C'est ici:
C'est un peu gros, mais voici comment cela fonctionne:
Commencez par appuyer sur n. n est la profondeur du duplicata. Nous ouvrons également deux parenthèses. Celles-ci nous permettent de stocker la valeur du n dans la portée jusqu'à ce que nous en ayons besoin.
Ensuite, on boucle n fois à chaque fois en poussant deux fois la valeur supérieure de la pile vers la pile. Cela crée les doublons initiaux pour chaque numéro de la pile.
Nous avons maintenant deux copies de chaque numéro sur la pile. Nous devons les séparer en deux groupes.
Nous passons donc hors pile et rappelons l’un des ns sauvegardés au début.
Nous faisons une boucle n fois.
Chaque fois que nous déplaçons une copie vers la pile principale.
Et roulez une copie au bas de la pile. (Cela suppose que la pile hors pile était vide pour commencer par faire en sorte que cette copie ne soit pas empilée)
Une fois que cela est fait, nous avons divisé l'original en deux groupes: "l'original" et une copie hors pile (la copie est en réalité inversée). Donc, nous déplaçons simplement la copie vers la pile principale et nous pouvons en finir.
Programme squelette
Maintenant que j'ai créé tous les éléments du programme, il ne me reste plus qu'à les insérer dans un cadre.
Le cadre double le texte d'un pouce en moins par rapport à la hauteur de la pile, en utilisant dupliquer.
Et puis inverse la pile par incréments décroissants de la hauteur initiale de la pile de n ^ 2-n à 0.
la source
Gelée ,
43 octetsEssayez-le en ligne! ou Vérifiez tous les cas de test.
Enregistré un octet grâce à @ Maltysen .
Explication
la source
L
PHP,
5452 octets(49 octets, mais ne fonctionne pas si la chaîne contient '0')
(52 octets)
(54 octets)
la source
str_pad
. joli!2sable , 3 octets
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne!
la source
Ruby, 39 octets
Je suce à Ruby. L'aide au golf est appréciée.
Ruby est un très bon langage pour cela à cause de
.reverse!
Explication
J'espérais que ce serait simple comme:
mais à cause de la restriction standard et du challenge, c'est plus long.
Ce qui
s.reverse!
est très utiles.reverse!
est fondamentalements = s.reverse!
, ce qui signifie qu'il mute égalements
.Ce que chaque section du programme fait est décrit ci-dessous:
Le point
s.reverse!
positif est que chaque fois qu’il est évalué, la chaîne est inversée. Donc, comme il remplace la chaîne.s
est modifié!la source
-p
drapeau, vous pouvez économiser 4 octets:$_.reverse!;gsub(/./){$_.reverse!}
.chomp
bien sur la$_
? il semble inclure la nouvelle ligne pour le momentruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txt
oùfile.txt
est une ligne sans la nouvelle ligne: V Quoi qu'il en soit, si vous décidez de ne pas le faire, vous n'avez pas besoin de parens sur le lambda, donc ça->s
marches.gsub(/./){s.reverse!.reverse}
Perl, 24 octets
Comprend +2 pour
-lp
Donnez votre avis sur STDIN:
rev.pl
:Étonnamment, cela n’utilise pas l’
reverse
opérateur intégré . Ce nom est tellement long, toutes les solutions auxquelles je pourrais penserreverse
sont au moins 1 octet plus long.la source
J,
138 octets5 octets sauvés grâce aux miles!
C'est un 5 train avec les verbes suivants:
La fourchette intérieure est composée de
]
(identité),;
(lien) et|.
(inversion). Observer:Les deux verbes extérieurs forment le reste du train.
#
est, dans ce cas, la taille de l’argument, c’est-à-dire la longueur. Le verbe qui les relie est;@$
ou estravel
terminéreshape
. Observer:Ancienne solution.
Assez simple.
|.
est inverse, et^:
est une conjonction de pouvoir, qui répète son verbe à gauche (main droite) # de fois. Lorsque le bon argument est un verbe, ce verbe est appelé sur l'argument. Le verbe droit dans ce cas va de zéro (i.
) à la longueur (#
). Lorsque élevés dans un tableau, les résultats intermédiaires sont conservés. Tout ce qui reste à faire est d’aplatir le tableau,
.Résultats intermédiaires
la source
<@#
#;@$];|.
qui encadre l'initiale et l'inverse, remodèle les cordes encadrées et les rase ensembleJavaScript (ES 6),
5950 octets9 octets grâce à Hedi et Huntro.
fonction récursive.
Inverser la chaîne prend presque la moitié de la taille (
2522 octets!) ...Pourquoi n’existe-t-il pas une méthode native pour cela?
la source
s[n]?...
lieu den<s.length?...
[...s]
place des.split``
f=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)
qui serait aussi meilleur avec une meilleure fonction pour la plageSyntaxError: Unexpected token )
JS n'a pas de retour de chaîne natif.SyntaxError: Invalid or unexpected token
pour votre deuxième suggestion. Dans quel navigateur cela fonctionne-t-il?Minkolang , 17 octets:
Essayez-le ici!
Explication
la source
8088 Assembly, IBM PC DOS,
2928 octetsAssemblé,
xxd
vidage:Liste non assemblée:
Programme exécutable autonome PC DOS. Chaîne d'entrée via la ligne de commande, la sortie est console.
la source
Pip ,
11 à10 octetsEssayez-le en ligne!
Explication:
la source
Haskell,
403632 octetsExemple:
Encore plus court (crédit à Damien):
s >> [s, inverser s] cycles ["abc", "cba", ...] compressés avec la taille voulue et concatapés avec fst
la source
q s=zip(s>>[s,reverse s])s>>=fst
(>>=fst).(iterate reverse>>=zip)
Perl 6 ,
3130 octetsEnregistrez un octet en utilisant de manière abusive
.ords
, ce qui retourne une liste d'ordinaux, puis transformez-le implicitement en un nombre pour créer une plage.Explication:
Usage:
la source
Vim + coreutils, 32 frappes
Vous ne pouvez jamais avoir trop de réponses à Vim.
Explication
la source
MATL,
13128 octetsPousse tous les éléments, combine à la fin.
Essayez-le en ligne!
Anciennes versions:
Approche complètement différente, basée sur
fprintf
:Version basée sur l'inversion d'une chaîne de modèle
la source
td
!tnq:"
abord une évidence , maistn:"
c'est un peu une odeur de code (voir cette astuce de golf Matlab), alors j'ai pensé que celatnq:
pourrait être plus compact, aussi.Scala,
737271 octetsC’est ma première tentative de jouer au golf, alors je suis certain que d’innombrables améliorations ont été apportées.
Mise à jour:
Golfé 1 octet en supprimant les supports.
Merci à la pastèque destructible pour suggestion, rasé un octet.
la source
i%2==1
pouri%2>0
?Cubix , 52 octets
Sur un cube:
Celui-ci était amusant; il reste encore des octets à jouer, mais cela fonctionnera certainement.
Essayez-le en ligne!
explication:
Entrée de
ABC
/A
: allez au nord et lisez toutes les entrées sous forme de caractères;-1
sera au basp\;.
: enlever le-1
de la pileu#
: pousse la longueur de la chaîne (nombre d'éléments sur la pile)\:\:qq
: dupliquez deux fois la longueur de la chaîne, placez deux copies au bas de la pileboucle:
soq(?/<u
: échangez le haut de la pile, le haut de la pile en ASCII, poussez le haut (lettre) vers le bas, décrémentez le haut de la pile, tournez à droite si ce n’est pas fait, puis déplacez l’IP au bon endroit.C B A 3 3 0
;u
: pop top of stackC B A 3 3
B
: pile inverse3 3 A B C
p(
: déplacer de bas en haut et décrémenter3 A B C 2
?
si top est zéro, allez directement@
et terminezpsq:uq
: se déplacer de bas en haut, échanger de haut en bas, de haut en bas, et de haut en bas3 2 A B C 3
$u
: sauteru
<
nous remet dans la boucle.Interprète
la source
C (gcc) ,
888785836866 668282octets-1 grâce à ceilingcat
Ancienne version
Essayez-le en ligne!
Version plus courte (légèrement cassée)
Riffing sur l'approche de 76 octets par ASCII uniquement dans les commentaires, et -1 octet de son tweak de mon tweak.
Edit: Cette version est légèrement cassée car elle suppose que chaque chaîne est précédée d’un octet NULL, ce qui n’est pas toujours vrai. (Voir dernier cas de test en lien). Revenons à la version de 83 octets pour le moment.
Essayez-le en ligne!
la source
Java,
12711188 octetsProgramme de test non-golfé
la source
(s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};
( 88 octets ). De plus, je préciserais qu'il s'agit de Java 8.R, 53 octets
Suppose que l'entrée est séparée par une ligne ou une nouvelle ligne pour chaque caractère.
Quelques cas de test:
la source
PowerShell v2 +, 57 octets
Aucune méthode vraiment propre pour obtenir des longueurs de chaîne ou les inverser, c'est donc assez long.
Prend les entrées
$a
, boucles de1
à$a.length
(stockées$x
pour une utilisation ultérieure). À chaque itération, nous utilisons un pseudo-ternaire pour indexer dans un tableau composé de$a
ou$a[$x..0]
(c.-à-d., Inversé), en fonction du nombre impair ou pair de notre entrée[$_%2]
. Ceux-ci sont tous encapsulés dans des parenthèses et édités-join
ensemble pour former une seule chaîne. Cela reste sur le pipeline et la sortie est implicite.la source
Java, 151 octets
}
Ungolfed:
la source
public static
avant votre méthode. Vous pouvez supprimer les espaces entret=new StringBuffer
. Vous pouvez supprimer les parenthèses inutiles et les crochets. Et vous pouvez échanger la vérification du module de==1
à<1
(ce qui équivaut à==0
des nombres non négatifs). En outre, vous pouvez déplacer lei++
jusqu'à la dernière utilisation dans la boucle for.void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}
( 105 octets )C #, 94 octets
76 octets pour la méthode + 18 octets pour l'importation LINQ.
Comment ça marche:
la source
CJam , 10 octets
Essayez-le en ligne!
Explication
la source
Octave,
3935 octetsExplication:
Sauvegardé 4 octets grâce à Luis.
~x
au lieu de0*x
sauvegarder un octet (fonctionne car tous les éléments de x sont non nuls.flip
au lieu deflipud
sauvegarder deux autres octets (je ne savais pas qu’ilflip
existait).la source
bash + util-linux,
685853 octetsExplication
Deux choses en
for
boucle:for
boucles dans lequel on remplace les motsdo
-done
clés et par des accolades{
et des}
. L'espace après le premier crochet est nécessaire et le point-virgule à la fin est également nécessaire.for
boucles "C-style" , vous pouvez simplement initialiser aveci;
au lieu d'utiliseri=0;
.${#1}
partie de la conditioni < ${#1}
fait référence à la longueur de notre entrée (le premier paramètre$1
). En général, vous pouvez utiliser${#foo}
pour récupérer la taille de la chaîne$foo
.Aditionellement:
rev
est l'outil dans util-linux qui inverse une chaîne.-n
drapeauecho
pour nous débarrasser des nouvelles lignes.rev<<<$y
est appelée une chaîne here (voir la page correspondante de tldp.org ), qui transmet la variable$y
à l'entrée standard derev
.la source
do
et desdone
mots - clés dans unefor
boucle, vous avez réellement ne besoin que l' espace!y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}
... enregistré quelques octetsJapt , 11 octets
Essayez-le en ligne!
la source
î
encore, n'est-ce pas?!05AB1E , 7 octets
Essayez-le en ligne!
Continuera à y travailler. Je n'aime pas vraiment la partie "v}", je peux probablement y sauvegarder un octet.
Explication
la source
vÂ}\J
5 octets est identique à votre code, mais avec les éléments intégrés que vous recherchiez. :)Â
est Bifurcate (abréviation de Duplicate & Reverse, qui correspond exactement à ce que vous faites).\
supprime le premier élément de la pile.