Nous avons déjà maintenant comment dépouiller une chaîne de ses espaces.
Cependant, en tant que messieurs / dames, nous devrions plutôt le déshabiller .
Déshabiller une ficelle revient à la dénuder, mais en plus délicate. Au lieu de supprimer tous les espaces de début et de fin à la fois, nous les supprimons un par un . Nous alternons également entre le début et la fin, afin de ne pas brûler les étapes.
Exemple, en commençant par " codegolf "
(cinq espaces de début et de fin):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Première sortie de la chaîne inchangée. Puis, affichez chaque étape. Commencez par enlever un premier espace ( le cas échéant - voir la règle n ° 2).
L'entrée peut avoir un nombre différent d'espaces de début et de fin. Si vous manquez d'espace d'un côté, continuez à déshabiller l'autre jusqu'à ce que la ficelle soit dénudée.
L'entrée peut ne pas avoir d'espaces de début ni de fin. Si c'est le cas, affichez-le tel quel.
Utilisez les méthodes d'E / S par défaut de PPCG . PPCG Les failles par défaut sont interdites.
Le comportement non défini sur une entrée vide ou contenant uniquement des espaces est correct.
Vous pouvez supposer que la chaîne ne contiendra que des caractères de l'espace imprimable ASCII (
0x20
to0x7E
).
Exemples - les espaces sont remplacés par des points .
pour une meilleure lisibilité:
4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!
6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing
0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello
0 leading, 0 trailing: "World"
World
21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a
Un gentleman / lady est concis, donc la réponse la plus courte en octets est gagnante .
0x20
à0x7E
). Les autres sont le comportement indéfini." test\r "
ou l'" \v test"
un ou l' autre.".....................a....."
? Si tel est le cas, je suggère de l'ajouter car certaines réponses semblent échouer à ce type de test. (les points sont pour une meilleure lisibilité bien sûr)Réponses:
Retina , 26 octets
Essayez-le en ligne! (La suite de tests utilise des points pour plus de clarté. Le pied de page et l'en-tête les convertissent en espaces pour le code principal.)
Explication
Ce serait bien si nous pouvions juste alterner entre supprimer un espace de début et de fin et imprimer le résultat intermédiaire à chaque fois. Le problème est qu’à l’heure actuelle, Retina ne peut pas imprimer de manière conditionnelle et imprimerait donc ce résultat intermédiaire s’il n’y avait plus d’espace de début ou de fin, générant ainsi des doublons. (Retina 1.0 aura une option qui n'imprimera le résultat que si la chaîne a été modifiée par l'opération, mais nous n'y sommes pas encore ...)
Au lieu de cela, nous construisons une seule chaîne contenant tous les résultats intermédiaires et l’imprimons à la fin.
La
{
boucle encapsule les deux étapes du programme dans une boucle qui se répète jusqu'à ce que la chaîne cesse de changer (ce qui signifie qu'il ne reste plus aucun espace en début / fin). La scène elle-même correspond à un espace de début sur la dernière ligne de la chaîne et à cette dernière ligne, puis réécrit le match, ainsi que le contenu après l'espace sur une nouvelle ligne (supprimant ainsi l'espace de début dans la copie).Supprimer l’espace de fuite est un peu plus facile. Si nous ne faisons que correspondre à l’espace final, nous pouvons accéder aux éléments qui le précèdent (sur la même ligne) avec
$%`
une variante sensible à la ligne de la substitution de préfixe$`
.la source
Python 2 ,
12210710310298959391908887 octetsEssayez-le en ligne!
Python 3 ,
97959390 octetsEssayez-le en ligne!
la source
s=input()
au lieu d'une fonction prendrait moins d'octets.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 octets .a
par la fonction intégréeid
pour ne pas avoir à le définir au début. -2 octets.Perl 6 , 55 octets
Sauvegardé de 3 octets grâce à @nwellnhof.
Essayez-le en ligne!
Explanation :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
est une séquence infinie récursive qui commence par la chaîne d'origine ($_
) et l'élément suivant est donné par le bloc appelé sur l'élément précédent.Le bloc lui-même obtient la chaîne dans la
$_
variable. L'opérateurS/(regex)/(string)/
recherchera la première occurrence de(regex)
in$_
, la remplacera par(string)
et renverra le résultat. S'il n'y a pas de correspondance, il retourne le contenu de$_
inchangé. Nous utilisons l'opérateur ternaire?? !!
avec la condition$++%2
, qui alterne entreFalse
etTrue
($
est une variable libre qui conserve son contenu pendant les appels au bloc.)Dans le pire des cas (tous les espaces d'un côté et 1 autre caractère), on enlève 1 espace tous les 2 pas. Nous pouvons donc être sûrs que dans les étapes 2 * (longueur de la chaîne), tous les espaces auront été supprimés. Nous prenons autant d'éléments de la séquence récursive avec
[^.comb*2]
et finalement joignons les doublons (qui se produisent chaque fois qu'un espace aurait dû être supprimé mais qu'il n'y est pas) avec.unique
. Ceci retourne la liste des chaînes, progressivement débarrassées des espaces.la source
[^.comb*2]
enregistre 2 octets. Pour une raison quelconque, cela fonctionne, mais[^2*.comb]
ne fonctionne pas. Aucune idée pourquoi. L'utilisation d'un ternaire?? !!
pour sélectionner l'expression rationnelle enregistre un autre octet.[^2*.comb]
et ça n'a pas marché, alors je l'ai utilisé[0..2*.comb]
. Et merci pour le ternaire, je pensais juste que c'est trop cher et il n'a pas eu lieu pour moi que je l' ai remplacé avec quelque chose d' encore plus cher ...05AB1E ,
21 à15 octetsEssayez-le en ligne!
Explication ^
la source
C (gcc) ,
8984 octetsLa version récursive est plus courte ;-)
Essayez-le en ligne!
C (gcc) ,
10710210110099 octets2 octets sauvés grâce à @ Jonathan Frech en utilisant des espaces et ~
Essayez-le en ligne!
la source
==46
par<33
car l'espace est le plus petit caractère imprimable et vous devez seulement les gérer.++k+
fait?k
et en ajoute un, ce qui équivaut àk = k + 1; i = k + 1;
oui = k + 2; k = k + 1
.i=k+++2
ça fonctionne aussi, ce que j'aurais utilisé parce que le+++
look est bizarre: PJavaScript (ES6) 92
@Upvoters: regardez l'autre réponse de JS qui fait 76 octets de long
Une boucle cherchant un espace devant ou derrière. Si trouvé, supprime l'espace et la chaîne de sortie. Si aucun espace n'a été trouvé 2 fois, arrêtez.
la source
<'!'
. Pour que votre extrait continue de fonctionner, vous pouvezreplace
insérer des points avant de passer à votre fonction.Perl 5, 32 octets
Sauvegardé 4 octets en raison de @Abigail .
Requiert
-pl
compté comme 2, invoqué avec-E
.Exemple d'utilisation
Essayez-le en ligne!
la source
print;s/^ //&&print,s/ $//&&print while/^ | $/
fonctionne avec le-n
drapeau,-l
n'est pas non plus nécessaireC # (.NET Core) ,
192183182181179 179178 octets-3 octets grâce à Kevin Cruijssen
Essayez-le en ligne!
la source
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
est possible en raison de la nouvelle règle ajoutée par OP: " Vous pouvez supposer que la chaîne ne contiendra que des caractères de l'espace imprimable ASCII (0x20
à0x7E
). "Java 8,
150146145137 octets-4 octets grâce à @Nevay changer
(f<1&s.charAt(0)<33)
àf+s.charAt(0)<33
.-1 octet en utilisant le
!s.trim().equals(s)
truc de la réponse C # .NET de @soneone au lieu des.matches(" .*|.* ")
.-8 octets grâce à @Nevay encore une fois en changeant
!s.trim().equals(s)
às!=s.trim()
, carString#trim
retournera " Une copie de cette chaîne avec les espaces blancs et de fin supprimés, ou cette chaîne si elle n'a pas d'espace blanc de début ou de fin ", ainsi la référence reste la même et!=
peut être utilisé pour vérifier si elles sont la même référence, au lieu de.equals
vérifier la même valeur.Explication:
Essayez-le ici (ou essayez une version plus visuelle ici au
#
lieu d'espaces).la source
s=f+s.charAt(0)<33
au lieu de(f<1&s.charAt(0)<33)
(-4 octets).s!=s.trim()
au lieu de!s.trim().equals(s);
(-8 octets).C,
9190 octetsEssayez-le en ligne!
la source
Gelée , 16 octets
Essayez-le en ligne!
-2 octets grâce à Erik the Outgolfer
-1 octet grâce aux miles
Explication
la source
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
a besoin d'un nilad seulement si la chaîne est plus longue que deux.¹Ṛƭ
fonctionne bien ici.Ruby , 63 octets
Essayez-le en ligne!
la source
Java (OpenJDK 8) ,
161 147146 octetsEssayez-le en ligne!
-1 octet grâce à @ Kevin Cruijssen !
la source
(u=32-x.charAt(l)>>-1)
(u=32-x.charAt(l)>>k)
k
est à0
chaque seconde itération.u
. Ce n'est pas le cas quand je change aussi-1
enk
pourv
. Je suis confus pourquoi cela fonctionne bien, cark
il deviendra effectivement0
aprèsk=~k
..: Sk=0
scénario: S'il reste des espaces, ilu
reste la même valeur qu'avant (0
); si laissé n'a plus d'espaces, alors(k=~k)&~v|u
évalue to-1|u
(~0&-1|u
), ainsi la valeur non définie (négative) deu
n'a pas d'importance (-1|x==-1
).05AB1E ,
2517 octets-8 octets en empruntant l’ idée d’Emigna qui n’a pas besoin d’être vérifiée
Essayez-le en ligne!
Je suis à peu près sûr qu'une approche moins simple peut battre cette solution facilement. Pour l'instant...
Explications:
la source
S
place de#
(-1 octet). La boucle ... eh bien ... cela économise un octet par rapport à une approche simple. Je suis actuellement à la recherche d'un moyen plus court de détecter la fin de la tâche (5 octets pour cela, c'est beaucoup), et j'envisage également une approche totalement différente. Je pense qu'il existe un moyen plus intelligent de résoudre ce problème.R ,
145133111 octets-12 octets grâce à @Giuseppe, en stockant le résultat de
sub
dans une nouvelle variable et si elle a changé-22 octets en renvoyant un vecteur de chaînes plutôt qu'une chaîne avec des retours à la ligne
Essayez-le en ligne!
Explication sur une version partiellement non-golfée:
la source
C(s<-sub(),\n)
une déclaration d’impression distincte? Ah non, à cause desep=" "
sep=""
. Dans la plupart des défis, l'espace de fuite supplémentaire n'aurait pas d'importance, mais ici, malheureusement!sub
vient de suggérer cela, IDK pourquoiL=s
et renvoyer un vecteur de chaînes?Java (OpenJDK 8) ,
137125121120124 octetsEssayez-le en ligne!
la source
s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}
(124 octets) (semble être correct mais n'a pas beaucoup testé).MATL ,
2116 octetsCela utilise des points au lieu d'espaces pour plus de clarté. Pour les espaces remplacer
46
par32
.Essayez-le en ligne!
Explication
la source
Husk ,
2322 octetsMerci à Leo pour -1 octet.
Essayez-le en ligne!
Explication
La fonction
`G`I
devrait vraiment être une fonction intégrée ...la source
?
semble évidente avec le recul ...C ++,
196193189186183 octets-10 octets grâce à Jonathan Frech
-3 octets grâce à Zacharý
La compilation avec MSVC nécessite la désactivation des contrôles SDL
la source
==32
par<33
.#include<string>
vraiment nécessaire ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
etif(R){
->#define R ...<33)
,||R{
etif(R{
.C # (.NET Core) ,
176170 octetsEssayez-le en ligne!
Ceci est une alternative à la réponse de @ quelqu'un , et affiche simplement les chaînes directement.
la source
JavaScript (ES6), 76 octets
Sort en tant que chaîne multiligne.
Cas de test
Utiliser des points plutôt que des espaces, comme le font la plupart des réponses.
Afficher l'extrait de code
la source
Sed, 24 octets
Essayez-le en ligne!
la source
Octave ,
8883 octets5 octets de moins grâce à Stewie Griffin!
Essayez-le en ligne!
la source
min
est nécessaire en raison des
sa réduction dynamiqueCode machine x86 pour Linux, 60 octets
Ceci est une fonction pour Linux x86. Il prend comme pointeur d’entrée la chaîne dans
edi
et la longueur de chaîne dansebp
.Ungolfed, avec une infrastructure à tester (compilation avec FASM, exécuté avec la chaîne comme argument de programme; recherchez
undress:
label pour le code de fonction réel):la source
sys_write()
rendeax
non-nul (en particulier1
le nombre de caractères écrits, en supposant que ce ne soit pas-errno
), doncprint
si vous ne le faites paspop eax
à la fin. Vous pourriez justexor eax,eax
avantcmp byte [edi], ' '
et sauvegarder lemov al,1
, et peut-être un peu deeax
sauvegarde / restauration. Bien que vous ne le sauvegardiez pas avant d'avoir commencé avecSYS_WRITE
. Hmm, au lieu de0
, vous pourriez utiliserSYS_WRITE
vs1
, puisquecmp al, imm8
est la même taille quetest al,al
.'\n'
dans le tableau avecmov byte [ecx + edx], '\n'
au lieu de faire le deuxièmewrite()
? (Et décrémentez la longueur après l’impression?) Cela pourrait vous épargner quelques instructions.print()
laisse actuellement'\n'
àeax
, ce qui est différent deSYS_WRITE
, donc vous pouvez toujours vérifier cela. Je pensais que vous enregistriez / restauriezeax
, mais c’était juste pour sauver des octets en copiant une constante. Pour les longues chaînes,sys_write()
on peut laisser les octets de poids fort de eax non nuls, ce qui exclut malheureusement toute utilisationmov al, SYS_WRITE
.mov al, 1
était étranger. -2 octets maintenant, merci.PHP , 117 octets
J'ajoute un espace supplémentaire au début pour qu'il prenne de l'espace et affiche l'original sans code supplémentaire.
Un peu nouveau pour cela ... le <? Php et l'espace au début du fichier PHP ajouteraient-ils 6 octets supplémentaires ou est-ce que je l'obtenir gratuitement?
Essayez-le en ligne!
la source
php -r "echo 1;"
Mais si vous voulez utiliser quelque chose comme cela,<?=1;
vous devez inclure la balise dans le nombre d'octets.Pyth , 28 octets
Essayez-le ici! ou Vérifiez tous les cas de test!
Explication
la source
Python 2 , 79 octets
-1 octet grâce à @JonathanFrech
Essayez-le en ligne!
La combinaison de test remplace
"."
par" "
avant d'appeler la fonction et" "
repasse sur"."
avant d'imprimer les résultats pour plus de clarté.la source
'!'*i and
->i*'!'and
.C # - encore une fois, 125 octets
À votre santé!
Essayez-le en ligne!
la source
Octave , 89 octets
Essayez-le en ligne!
J'ajouterai une explication plus tard, quand j'en aurai le temps. Je pourrais peut-être jouer au golf quelques octets si je change complètement d’approche, mais je ne vois pas comment, malheureusement.
Les dernières lettres ici épeler: "sendendendend". J'aimerais qu'il y ait un moyen de stocker en
end
tant que variable et de l'utiliser, mais devinez quoi ...la source
s = ...
? (La question habituelle, je le sais)Bash,
9894 octets4 octets enregistrés en utilisant un sous-shell au lieu de séquences (performances médiocres)
Première réponse
Notez le
!
doit être échappé en mode interactifla source