J'ai fait fait un vaisseau spatial maw!


39

Introduction:

Inspiré par ce commentaire de @MagicOctopusUrn sur @Emigna réponse 05AB1E de mon « Il était juste un bug défi » :

8F9ÝÀNð×ý}».∊J'ai fait fait un vaisseau spatial maw! Et j'étais tout excité de suggérer une édition de 12 octets. - Magic Octopus Urn 17 juil. 17 à 20:10

Ce qui est un programme 05AB1E (hérité) ayant pour résultat:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Essayez-le en ligne.

Défi:

Entrée: une chaîne non vide

Sortie: à partir de l’extérieur, ajoutez un espace supplémentaire entre chaque caractère, chaque ligne, comme dans la sortie ci-dessus, égale à la valeur length - 1. Donc, pour une entrée, 1234567890la sortie serait en réalité la suivante:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1        2        3        4        5        6        7        8        9        0
1         2         3         4         5         6         7         8         9         0
1        2        3        4        5        6        7        8        9        0 
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Pourquoi? La longueur de 1234567890est 10. Nous commençons donc par sortir 10 lignes: la première ligne sans espaces; deuxième avec un séparateur d'espace; troisième avec deux; etc. Et puis (sans avoir la ligne médiane avec les length - 1espaces dupliqués), nous revenons à l'entrée initiale en descendant.

Règles du challenge:

  • Il est garanti que l’entrée est non vide (une longueur >= 1). (Pour les entrées à caractère unique, nous produisons simplement ce caractère.)
  • Toute quantité d'espaces de fin de ligne / fin de ligne / fin de ligne est autorisée, à condition que la sortie elle-même (où que vous soyez à l'écran) soit correcte. (Les lignes vides entre les lignes de sortie sont également interdites.)
  • L'entrée ne contiendra que des caractères ASCII imprimables, à l'exception des espaces (espaces de code [33, 126])
  • I / O est flexible. L'entrée peut être prise en tant que paramètre STDIN, argument ou fonction. Peut être une liste / tableau / flux de caractères au lieu d'une chaîne. La sortie peut également être une liste / un tableau / un flux de caractères au lieu de chaînes. peut être imprimé sur STDOUT; retourné sous forme de chaîne délimitée par des lignes; etc.

Règles générales:

  • C'est du , donc la réponse la plus courte en octets est gagnante.
    Ne laissez pas les langues de code-golf vous décourager de poster des réponses avec des langues autres que le code de golf. Essayez de trouver une réponse aussi courte que possible à n'importe quel langage de programmation.
  • Les règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, fonctions / méthode avec les paramètres appropriés et des programmes complets de type de retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • En outre, l'ajout d'une explication de votre réponse est fortement recommandé.

Cas de test:

Input: @
Output:
@

Input: test
Output:
test
t e s t
t  e  s  t
t   e   s   t
t  e  s  t
t e s t
test

Input: ?!
Output:
?!
? !
?!

Input: Spaceship
Output:
Spaceship
S p a c e s h i p
S  p  a  c  e  s  h  i  p
S   p   a   c   e   s   h   i   p
S    p    a    c    e    s    h    i    p
S     p     a     c     e     s     h     i     p
S      p      a      c      e      s      h      i      p
S       p       a       c       e       s       h       i       p
S        p        a        c        e        s        h        i        p
S       p       a       c       e       s       h       i       p
S      p      a      c      e      s      h      i      p
S     p     a     c     e     s     h     i     p
S    p    a    c    e    s    h    i    p
S   p   a   c   e   s   h   i   p
S  p  a  c  e  s  h  i  p
S p a c e s h i p
Spaceship

Input: 05AB1E
Output:
05AB1E
0 5 A B 1 E
0  5  A  B  1  E
0   5   A   B   1   E
0    5    A    B    1    E
0     5     A     B     1     E
0    5    A    B    1    E
0   5   A   B   1   E
0  5  A  B  1  E
0 5 A B 1 E
05AB1E

Input: )}/\
Output:
)}/\
) } / \
)  }  /  \
)   }   /   \
)  }  /  \
) } / \
)}/\

1
Obtient tout simplement nerveux !!! SPACESHIP !!!
WallyWest

1
Je savais que je reconnaissais cette sortie. J'aime que cette idée continue.
Carcigenicate

2
TFW vous reconnaissez vaguement un motif dans une question, ಠ_ಠpuis réalisez que c'est parce que vous l'avez fait accidentellement il y a un an ಠ⌣ಠ.
Magic Octopus Urn

1
@MagicOctopusUrn Merci pour l'inspiration. ; D
Kevin Cruijssen

3
@KevinCruijssen merci de garder la citation maladroite haha!
Magic Octopus Urn

Réponses:


11

Japt , 8 à 6 octets

Prend les entrées sous forme de tableau de caractères et génère un tableau de chaînes.

£qYçÃê

L'essayer


Explication

£          :Map each element at (0-based) index Y
 q         :  Join input with
  Yç       :   Space repeated Y times
    Ã      :End Map
     ê     :Palindromise

Original, 8 octets

I / O est une chaîne. Utilise le -Rdrapeau. Inclut les espaces de fin sur chaque ligne.

¬£múYÄÃê

L'essayer

Explication

             :Implicit input of string U
¬            :Split
 £           :Map each character at 0-based index Y
  m          :  Map original U
   ú         :    Right pad with spaces to length ...
    YÄ       :     Y+1
      Ã      :End map
       ê     :Palindromise
             :Implicitly join with newlines

S.ç()FTW encore une fois :-)
ETHproductions

1
Question sérieuse: serait-il possible de chercher de manière itérative dans toutes les solutions longues de 1 à 6 octets pour un casse-tête comme celui-ci?
Filip

2
@filip No: il existe plus de 256 ** 6 combinaisons = 281474976710656 (au moins naïves). C'est comme deviner un mot de passe.
Kirill Bulygin

3
@KirillBulygin, il existe plus de 37 000 milliards ( 37 764 717 485 592) de moyens permettant de combiner les caractères disponibles dans Japt en une chaîne de 1 à 6 caractères. Si vous incluez tous les autres caractères d'un octet pouvant être utilisés dans des littéraux de chaîne ou des chaînes compressées, ce nombre passe à plus de 276 billions de dollars ( 276 024 445 697 280). Donc, non, écrire un bot pour générer tous ceux-ci, puis filtrer les programmes Japt valides, puis trouver celui (le cas échéant) qui convient au défi à relever ne serait probablement pas faisable. En outre, où est-il amusant de laisser un bot faire votre golf pour vous?!
Shaggy

6
@Shaggy: "Où est-il amusant de laisser un bot faire votre golf pour vous?!" Et si vous faisiez le bot vraiment, vraiment court?
Oddthinking

11

R , 105 99 85 84 79 octets

-6 grâce à @Kevin Cruissen et @Giuseppe

-14 de passer à une méthode basée sur les expressions rationnelles

-1 merci à @ Giuseppe

-5 grâce à @digEmALl

function(w,n=nchar(w)-1)write(trimws(Map(gsub,"",strrep(" ",n-abs(n:-n)),w)),1)

Essayez-le en ligne!


Vous pouvez jouer au golf 1 octet en supprimant l’espace sur in(r<-.
Kevin Cruijssen

1
et vous n’utilisez qu’une sfois afin que vous puissiez simplement l’utiliser comme argument writedirectement; vous ramenant à 99 octets
Giuseppe

1
devrait - il être 1plutôt qu'un ""dans write? Je creuse votre utilisation de Map!
Giuseppe


1
J'étais persuadé que je pourrais battre cela avec l' collapseargument, pastemais cela ne se produit pas ...
JDL


6

Charbon de bois , 10 octets

Eθ⪫θ× κ‖O↓

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

Eθ          Map over characters of input string
  ⪫θ        Join characters of input string using
    ×       a literal space repeated 
      κ     current index number of times
            Implicitly print each result on its own line
       ‖O↓  Reflect vertically with overlap

Charbon de bois ne reflète pas les choses comme [à ]- ou est - ce une autre commande séparée?
Magic Octopus Urn

@MagicOctopusUrn Il existe des commandes distinctes si vous souhaitez transformer le reflet. Voir codegolf.stackexchange.com/a/127164 pour un exemple.
Neil

Je pensais l'avoir déjà vu réfléchir, mais je n'en étais pas sûr. Soigné!
Magic Octopus Urn


6

Python 2 , 72 70 68 66 65 octets

-2 octets grâce à Kevin Cruijssen
-3 octets grâce aux ovs

w=input();c=s=-1
while c:print(' '*~c).join(w);s*=w[:c]>'';c+=s|1

Essayez-le en ligne!


c==len(w)-1peut être joué au golf par 1 octet avec c+2>len(w). EDIT: Dans votre nouvelle version de 70 octets, 0<cpeut être c.
Kevin Cruijssen

6

05AB1E , 10 à 9 octets

Sauvegardé 1 octet grâce à Adnan

εINð×ý}û»

Essayez-le en ligne!

Explication

ε            # apply to each in input
 I           # push the input
  Nð×        # push <index> spaces
     ý       # merge the input on the spaces
      }      # end loop
       û     # palendromize
        »    # join on newlines

Vous pouvez laisser tomber le S. La saisie étant flexible, la saisie en tant que liste est autorisée.
Kevin Cruijssen

1
@KevinCruijssen: Votre première version est de 9 octets dans l'héritage, ce qui »peut être omis.
Emigna

1
Le vôtre fonctionne également dans l'héritage en 9 octets également si vous supprimez »et modifiez la boucle ven carteε .
Kevin Cruijssen

1
Posté la réponse . Et actuellement, Japt nous bat avec 6 octets, je le crains. Ou avez-vous voulu dire le plus court dans 05AB1E (réécriture Elixir) et 05AB1E (héritage Python)? :)
Kevin Cruijssen

2
Est-ce que ça εINð×ý}û»marche aussi?
Adnan

5

Ruby , 54 à 49 octets

->a{(-(z=a.size-1)..z).map{|i|a*(?\s*(z-i.abs))}}

Essayez-le en ligne!

Prend les entrées sous forme de tableau de caractères et génère un tableau de chaînes.


4

Japt , 9 à 8 octets

-1 octet de @Shaggy

ÊƬqXîÃê

ÊƬqXîÃê        Full program, implicity input U
ÊÆ              Rage from 0 to U length and map
  ¬             split U at ""
   qXîà     join U using " " times range current value
        ê       horizontal mirror

Essayez-le en ligne!


Dang; On dirait que tu m'as encore ninja! Laisse-moi savoir si tu veux que je supprime le mien.
Shaggy

1
@Shaggy Non, gardez votre réponse, vous utilisez un tableau comme entrée, alors que j'utilise une chaîne de caractères, ils sont donc un peu différents
Luis felipe De jesus Munoz

1
SpX-> pour une économie de 1 octet.
Shaggy

4

PowerShell , 66 ans 54 octets

-12 octets grâce à mazzy

0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}

Essayez-le en ligne!

Prend une entrée via splatting, qui sur TIO se manifeste sous la forme d'arguments de ligne de commande distincts pour chaque caractère.

Nous avons d'abord défini $a=$argscomme argument d'entrée. Ensuite, nous définissons $xégal à la .countde ce tableau -1. Nous devons ensuite parcourir les lettres pour construire le vaisseau spatial. Cela se fait en construisant une plage allant de 0à $x, puis $xdescendant à 0, puis en utilisantGet-Unique pour extraire uniquement la plage appropriée.

Chaque itération, nous prenons nos arguments d’entrée et -joinles associe au nombre correspondant d’espaces. Chacune de ces chaînes est laissée sur le pipeline et une implicite Write-Outputnous donne des nouvelles lignes gratuitement à la fin du programme.


Essayez ceci:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy

1
@mazzy Qu'est-ce que ... comment ça Get-Uniquemarche comme ça sur la cuisinière? C'est fou! Merci!
AdmBorkBork

4

05AB1E (hérité) , 9 octets

εINúíJ}û»

Saisie sous forme de liste de caractères.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

ε     }    # Map each character in the input to:
 I         #  Take the input
  Nú       #  Prepend each with the 0-indexed amount of spaces
           #   i.e. ["t","e","s","t"] & 3 → ["   t","   e","   s","   t"]
    í      #  Reverse each item
           #   i.e. ["   t","   e","   s","   t"] → ["t   ","e   ","s   ","t   "]
     J     #  Join them together to a single string
           #   i.e. ["t   ","e   ","s   ","t   "] → "t   e   s   t   "
       û»  # Palindromize the list, and join by newlines
           #  i.e. ["test","t e s t ","t  e  s  t  ","t   e   s   t   "]
           #   → "test\nt e s t \nt  e  s  t  \nt   e   s   t   \nt  e  s  t  \nt e s t \ntest"

1
Oooooo, aussi ce n'est pas valide car miroir change l'orientation de / à \ quand miroir, même avec [, ]et (, ). Peut vouloir ajouter ces cas pour attraper du charbon de bois aussi. (A déplacé les autres commentaires à la réponse d'Emigna, car il s'agissait de la réponse que j'avais initialement commentée.)
Urne Octopus magique

@MagicOctopusUrn Merci de me le faire savoir. Fixé en utilisant û»au lieu de .∊.
Kevin Cruijssen

4

Haskell , 60 59 octets

(init<>reverse).(scanl(?)<*>tail)
a?_=do u<-a;u:[' '|' '<u]

Essayez-le en ligne!

Explication

Pour une chaîne (par exemple "abc"), nous appliquons d'abord

scanl (?) <*> tail

qui est le même que

\str -> scanl (?) str (tail str)

Ceci s'applique de manière répétée (?)(ajoute un espace à chaque caractère de la plage [33 ..] ) jusqu'à strce qu'il y ait autant de chaînes que de strcaractères:["abc","a b c ", "a b c "]

Maintenant, il suffit de concaténer le résultat (moins le dernier élément) avec sa contrepartie inversée:

init<>reverse

4

MATL , 25 22 13 octets

zZv"Gtz@he!1e

Essayez-le en ligne!

Grâce à Luis Mendo d’ avoir suggéré un golf de 5 octets, ce qui m’a inspiré à raser 4 octets de plus!

Explication, avec exemple d'entrée 'abc':

         # Implicit input, 'abc'
z        # find number of nonzero elements (length of string)
         # stack: [3]
Zv       # symmetric range
         # stack: [[1 2 3 2 1]]
"        # begin for loop, iterating over [1 2 3 2 1] as the loop indices
G        # push input
         # stack: ['abc']
tz       # dup and push length
         # stack: ['abc', 3]
@        # push loop index, i (for example, 2)
         # stack: ['abc', 3, 2]
h        # horizontally concatenate
         # stack: ['abc', [3, 2]]
e!       # reshape to matrix of 3 rows and i columns, padding with spaces, and transpose
         # stack: [['abc';'   ';'   ']]
1e       # reshape to matrix of 1 row, leaving last value on stack
         # stack: ['a  b  c  ']
         # implicit end of for loop
         # implicit end of program, display stack contents

3

Gelée , 9 octets

jⱮLḶ⁶ẋƲŒḄ

Essayez-le en ligne!

Retourne une liste de lignes. sortie rendue plus jolie sur TIO.


Un peu différent 9: ,€⁶$LСŒḄ. Autres, plus semblables, 9: J’⁶ẋŒḄɓjⱮet J’⁶ẋŒḄjⱮ@(je cherchais des brèves mais pas encore de joie)
Jonathan Allan

@ JonathanAllan Je suis sûr que c'est optimal, je ne pense pas qu'il existe un moyen plus court d'écrire LḶ⁶ẋou ŒḄ. Cependant, si vous parvenez à trouver une sauvegarde, faites-moi un ping. :-)
Erik the Outgolfer

Réfléchir un peu ,€⁶$LСŒḄpeut-être peut-être pas valide car il a une imbrication folle, donc pourrait avoir besoin d'un Yprogramme complet.
Jonathan Allan

@ JonathanAllan Ouais, bien sûr que ce n'est pas. ['I', 'f', [[' '], 't', 'h', [['i']], 's'], ' ', 'i', ['s', ' '], 'a', [[' ', 's', 't'], 'r', ['i', 'n', 'g'], ' '], 'w', ['e', ' ', 'a', 'r', 'e'], ' ', 'd', 'o', ['o'], 'm', [[[[['e']]]]], [[[['d']]]], '!']Au moins, j'ai dépassé le 05AB1E ...
Erik the Outgolfer

J'ai dit que j'ai golfé 05AB1E, hein? Bah, plus maintenant. : /
Erik the Outgolfer


3

Stax , 10 octets

Ç·9ƒù▌╘Ä┘e

Exécuter et déboguer

Sorties avec des espaces de fin sur chaque ligne.

Explication:

%R|pmx{]n(m Full program, unpacked, implicit input
%           Length of input
 R          1-based range
  |p        Palindromize
    m       Map:
     x{   m   Map over characters of input:
       ]        Character -> string
        n(      Right-pad to length given by outer map value
              Implicit flatten and output

3

Java (JDK 10) , 115 octets

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf(s.replaceAll(".","%-"+(i<0?l+i:l-i)+"s")+"%n",s.split(""));}

Essayez-le en ligne!


1
l-Math.abs(i)peut être joué au golf i<0?l+i:l-ipour -2 octets.
Kevin Cruijssen

@KevinCruijssen Merci! :)
Olivier Grégoire

pourrait-il être l-i<0?-i:i?
Quintec

@ thecoder16 Vous aurez besoin de parenthèses: l-(i<0?-i:i)(12 octets).
Jonathan Frech

3

K (oK) , 25 à 24 octets

Solution:

,/'(1+a,1_|a:!#x)$\:+,x:

Essayez-le en ligne!

Explication:

Port de ma solution K4 :

,/'(1+a,1_|a:!#x)$\:+,x: / the solution
                      x: / save input as x
                     ,   / enlist
                    +    / flip
                 $\:     / pad ($) right by each-left (\:)
   (            )        / do this together
              #x         / count length of input,           e.g. 3
             !           / range 0..length,                 e.g. 0 1 2
           a:            / save as a
          |              / reverse it,                      e.g. 2 1 0
        1_               / drop first,                      e.g. 1 0
      a,                 / join to a,                       e.g. 0 1 2 1 0
    1+                   / add 1,                           e.g. 1 2 3 2 1
,/'                      / flatten (,/) each (')

Remarques:

  • -1 octet grâce à ngn

1
,:'-> +,
ngn

2

Pascal (FPC) , 143 135 octets

var s:string;i,j,l:word;begin read(s);l:=length(s);repeat i:=i+1;for j:=1to l do write(s[j],'':l-abs(l-i)-1);writeln until i=l*2-1 end.

Essayez-le en ligne!

Je vais probablement gagner seulement contre Lenguage ...


2

PHP, 88 89 octets

for(;++$i<2*$e=count($a=str_split($argn));)echo join(str_pad("",~-$e-abs($i-$e)),$a),"\n";

nécessite PHP 5 ou une version ultérieure pour str_split. Exécuter en pipe -nRou essayer en ligne .


Votre lien try-it-online donne la mauvaise sortie, je le crains. Dans votre sortie, toutes les lignes comportent également des espaces de début, au lieu d’entre seulement des caractères (ou éventuellement des caractères de fin). Le premier caractère devrait tous être dans la même colonne dans la sortie.
Kevin Cruijssen

1
@KevinCruijssen N'a pas regardé la sortie assez près. Fixé. (Bien que ma sortie précédente ressemble plus à une fusée) ;-)
Titus

Cela ressemblait un peu à la tête d’une flèche. : D Mais +1 maintenant que c'est corrigé.
Kevin Cruijssen

Si vous placez une nouvelle ligne à la place du \ n, vous enregistrez un octet :)
Martijn

@Martijn, je n'ai en fait compté qu'un octet pour… j'ai oublié de le remplacer lorsque j'ai collé le code ici.
Titus

2

K4 , 23 octets

Solution:

,/'(1+a,1_|a:!#x)$\:$x:

Exemple:

q)k),/'(1+a,1_|a:!#x)$\:$x:"Spaceship"
"Spaceship"
"S p a c e s h i p "
"S  p  a  c  e  s  h  i  p  "
"S   p   a   c   e   s   h   i   p   "
"S    p    a    c    e    s    h    i    p    "
"S     p     a     c     e     s     h     i     p     "
"S      p      a      c      e      s      h      i      p      "
"S       p       a       c       e       s       h       i       p       "
"S        p        a        c        e        s        h        i        p        "
"S       p       a       c       e       s       h       i       p       "
"S      p      a      c      e      s      h      i      p      "
"S     p     a     c     e     s     h     i     p     "
"S    p    a    c    e    s    h    i    p    "
"S   p   a   c   e   s   h   i   p   "
"S  p  a  c  e  s  h  i  p  "
"S p a c e s h i p "
"Spaceship"

Explication:

A des espaces de fin sur chaque ligne.

,/'(1+a,1_|a:!#x)$\:$x: / the solution
                     x: / save input as x,                 e.g. "abc"
                    $   / string,                          e.g. (,"a";,"b";,"c")
                 $\:    / pad ($) right by each-left (\:)
   (            )       / do this together
              #x        / count length of input,           e.g. 3
             !          / range 0..length,                 e.g. 0 1 2
           a:           / save as a
          |             / reverse it,                      e.g. 2 1 0
        1_              / drop first,                      e.g. 1 0
      a,                / join to a,                       e.g. 0 1 2 1 0
    1+                  / add 1,                           e.g. 1 2 3 2 1
,/'                     / flatten each

2

C #, 113 105 98 octets

s=>{for(int l=s.Length,i=-l;++i<l;)WriteLine(Join("",s.Select(c=>$"{c}".PadRight(i<0?l+i:l-i))));}

Essayez-le en ligne!


Salut. Actuellement, votre réponse est un extrait de code plutôt qu'une fonction ou un programme complet. Cela peut être corrigé à moindre coût en ajoutant s=>{avant et }après pour en faire une fonction lambda. En outre, une chose à faire au golf est de supprimer les supports autour de la boucle. Essayez-le en ligne.
Kevin Cruijssen

@KevinCruijssen Merci! J'ai oublié de corriger ça avant de poster ...
RobIII

2

Scala , 82 octets

for(i<-(0 to a.size)union(-a.size to 0))println(a.map(_+" "*Math.abs(i)).mkString)

Essayez-le en ligne

Scala a beaucoup de raccourcis qui m'aident ici et c'est assez lisible! Essayez Scala


Bonjour, bienvenue chez PPCG! Bien que ce soit une bonne réponse, je crains que deux choses soient légèrement incorrectes. La ligne comportant le plus grand nombre d'espaces ne doit être sortie qu'une fois au milieu au lieu de deux. Et actuellement vous imprimez à partir 0de lengthquantité d'espaces, au lieu de 0la length-1quantité d'espaces. Je ne connais pas très bien Scala, mais il semble que vous puissiez résoudre les deux problèmes avec +4 octets (86 octets au total) comme ceci: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)Encore une fois, bienvenue, et profitez de votre séjour! :)
Kevin Cruijssen

2

Oracle SQL, 115 octets

Pas une langue de golf mais ...

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))FROM t CONNECT BY LEVEL<2*LENGTH(v)

En supposant que la valeur soit dans la colonne vde la table t:

Violon SQL

Configuration du schéma Oracle 11g R2 :

CREATE TABLE t ( v ) AS
  SELECT 'test' FROM DUAL;

Requête 1 :

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))
FROM   t
CONNECT BY LEVEL<2*LENGTH(v)

Résultats :

(SQLFiddle affiche les valeurs alignées à droite dans la colonne pour une raison quelconque ... il n'y a pas d'espaces de gauche)

| TRIM(REGEXP_REPLACE(V,'(.)',LPAD('\1',1+LENGTH(V)-ABS(LEVEL-LENGTH(V))))) |
|---------------------------------------------------------------------------|
|                                                                      test |
|                                                                   t e s t |
|                                                                t  e  s  t |
|                                                             t   e   s   t |
|                                                                t  e  s  t |
|                                                                   t e s t |
|                                                                      test |

Vos résultats SQL Fiddle semblent ne comporter qu'un seul espace entre les caractères? Voir cette capture d'écran . Je suppose que cela est dû à SQL Fiddle et que cela fonctionne localement? Btw, pas sûr si SQL utilise les règles de regex standard, mais peut (.)être joué .en utilisant \0au lieu de \1comme vous pourriez en Java par exemple? EDIT: Peu importe, c'est pour $0, pas \0.. ( exemple Java de ce que je voulais dire ).
Kevin Cruijssen

1
@KevinCruijssen Cliquez sur la flèche dirigée vers le bas à côté du bouton "Exécuter SQL" et modifiez la sortie en "Sortie en texte brut" ou "Sortie en Markdown" et vous verrez les espaces.
MT0

Merci. En effet, ça a l'air bien dans ce cas!
Kevin Cruijssen

2

8086 code machine, 56 53 octets

00000000  bf 35 01 57 ba 01 00 52  be 82 00 b3 ff ac 59 51  |.5.W...R......YQ|
00000010  aa 3c 0d 74 07 b0 20 e2  f7 43 eb f1 b0 0a aa 59  |.<.t.. ..C.....Y|
00000020  00 d1 e3 08 38 cb d6 08  c2 51 eb dc c6 05 24 5a  |....8....Q....$Z|
00000030  b4 09 cd 21 c3                                    |...!.|
00000035

Assemblé à partir de:

org 0x100
use16
        mov di, buffer
        push di
        mov dx, 1
        push dx
nextl:  mov si, 0x82
        mov bl, -1
nextc:  lodsb
        pop cx
        push cx
stor:   stosb
        cmp al, 0x0d
        je cr
        mov al, ' '
        loop stor
        inc bx
        jmp nextc
cr:     mov al, 0x0a
        stosb
        pop cx
        add cl, dl
        jcxz done
        cmp bl, cl
        salc
        or dl, al
        push cx
        jmp nextl
done:   mov [di], byte '$'
        pop dx
        mov ah, 0x09
        int 0x21
        ret
buffer:

Cas de test:

screenshot


Salut. Je suppose qu'il n'y a pas de compilation en ligne pour le code machine 8086, mais pourriez-vous peut-être ajouter une capture d'écran de la sortie pour l'un des cas de test? Ensuite, je peux vérifier si tout est correct. :)
Kevin Cruijssen

Terminé. Également rasé un octet de plus :)
user5434231

Merci pour la capture d'écran! Malheureusement, il y a une petite erreur dans la sortie. La ligne médiane a maintenant un lengthnombre d'espaces et il y a 9 lignes au total, mais la ligne médiane doit avoir un length-1nombre d'espaces et il doit y avoir un total de 7 lignes (pour le mot de 4 lettres 'test'`) ..: (J'espère que ce n'est pas trop cher en termes d'octets à corriger?
Kevin Cruijssen

1
Oh je vois. C'est corrigé maintenant, je l'ai même réduit d'un octet supplémentaire.
user5434231

2

Haskell, 64 60 59 octets

(""#)
a#s|l<-(:a)=<<s,w<-' ':a=l:[x|w<(' '<$s),x<-w#s++[l]]

Essayez-le en ligne!

a#s                         -- take a string of spaces 'a' and the input string 's'
 |l<-(:a)=<<s               -- let 'l' be the current line, i.e. the spaces in 'a'
                            -- appended to each char in 's'
  w<-' ':a                  -- let 'w' be 'a' with an additional space   
 =l                         -- return that 'l'
   :[   |w<(' '<$s)   ]     -- and, if 'w' is shorter than 's',
     x  ,x<-w#s++[l]        -- followed by a recursive call with 'w' 
                            -- and by another copy of 'l'

(""#)                       -- start with an empty 'a'

2

Bash , 115 , 109 , 105 , 100 , 97 , 96 , 92 , 91 , 90 octets

-5 & -3 grâce à Kevin Cruissen

read s;for((c=f=1;f;c-=2*(f>=${#s}),f+=c))
{ printf '%-'${f}'.c' `grep -o .<<<"$s"`
echo
}

Essayez-le en ligne!


Notez que depuis le \est un char échappement shell, le cas de test )}/\doit être saisi avec un supplément \comme ceci: )}/\\.


Salut. Est-il possible d'ajouter un lien TIO avec un ou plusieurs cas de test? Aussi, je ne connais pas très bien Bash, mais est-il possible de supprimer les espaces après inet printfcomme en Python?
Kevin Cruijssen

1
@KevinCruijssen, Merci, voir la réponse révisée. Cependant, je suis nouveau dans TIO-link et je ne sais pas comment utiliser plusieurs scénarios de test, car ce bashcode ne saisit qu'une chaîne ( c'est- à- dire une seule ligne). Les cas de test fonctionnent tous cependant, mais )}/\ doivent être cités de la sorte <<< ')}/\' read s; ...etc. . Les espaces après inet printfsont nécessaires.
agc

Merci. Et un seul cas de test pour TIO va bien. C'est principalement pour vérifier si tout fonctionne comme prévu, ce qui semble bien être le cas. +1 de moi. :)
Kevin Cruijssen le

1
Dans votre nouvelle version, vous pouvez jouer au golf avec 5 octets supplémentaires comme celui-ci . Les espaces après foret dopeuvent être supprimés. f=1peut être changé en c=f=1. Et f=f+cpeut être f+=c.
Kevin Cruijssen

1
Oh, encore une petite chose au golf. Je ne savais pas si cela était possible dans Bash, mais apparemment, c’est (c’est une raison de plus pour laquelle un lien TIO est pratique;)), c’est en passant f!=0àf la boucle for. Tout comme dans JavaScript et Python, 0falsey et chaque autre entier positif / négatif sont apparemment véridiques dans Bash.
Kevin Cruijssen

2

Perl 6 , 43 octets

{(0....comb-1...0)>>.&{join ' 'x$^a,.comb}}

Essayez-le en ligne!

Retourne une liste de lignes.

Explication:

 {                                         }  # Anonymous code block
  (0....comb-1...0) # A list from
   0                  # 0
    ...               # to
       .comb-1        # the length of the input string -1
              ...     # back to
                 0    # 0
                   >>.&{                  }  # Map each number to
                        join        ,.comb   # Join the list of characters
                             ' 'x$^a         # With the number of spaces

2

C (gcc) , 131 129 111 octets

i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Essayez-le en ligne!

-20 octets grâce à ceilingcat !

#import<string.h>
i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Essayez-le en ligne!

Ou, si la longueur peut être acceptée en tant que paramètre:

C (gcc), 105 102 octets

-1 octet grâce à ceilingcat!

i;x;f(k,x,j)char*k,*j;{for(i=!x--;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Essayez-le en ligne!


@ceilingcat hein!
Conor O'Brien

1
Dans vos 102 octets de golf, je pense que le global xest occulté et donc déclaré redondant.
Jonathan Frech

2

PHP, 148 146 143 141 octets

function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Vous pouvez le tester comme ceci:

<?php
error_reporting(0);

$s = 1234567890;
function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Sortie

1234567890
1 2 3 4 5 6 7 8 9 0 
1  2  3  4  5  6  7  8  9  0  
1   2   3   4   5   6   7   8   9   0   
1    2    3    4    5    6    7    8    9    0    
1     2     3     4     5     6     7     8     9     0     
1      2      3      4      5      6      7      8      9      0      
1       2       3       4       5       6       7       8       9       0       
1        2        3        4        5        6        7        8        9        0        
1         2         3         4         5         6         7         8         9         0         
1        2        3        4        5        6        7        8        9        0        
1       2       3       4       5       6       7       8       9       0       
1      2      3      4      5      6      7      8      9      0      
1     2     3     4     5     6     7     8     9     0     
1    2    3    4    5    6    7    8    9    0    
1   2   3   4   5   6   7   8   9   0   
1  2  3  4  5  6  7  8  9  0  
1 2 3 4 5 6 7 8 9 0 
1234567890

bac à sable

Version élargie

 function s($s){
    //loop upwards 0-10
    for(;$i<strlen($s);++$i) f($i,$s);
     //decrement so it's odd, from 9 loop downwards to 0
    for(--$i;--$i>=0;)f($i,$s);
 }
 //2nd function to save space
 function f($i,$s){
     //chunk it, split 1 char, insert $i number of spaces
     echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Tentative 2, 92 octets

après avoir vu la réponse de @Titus, j'ai réduit le mien à ceci:

for(;++$i<2*$e=strlen($s=$argn);)echo chunk_split($s,1,str_repeat(' ',~-$e-abs($i-$e)))."
";

J'essayais de trouver un moyen d'utiliser 1 boucle au lieu de 2 ... Croyez-le ou non, je n'utilise presque jamais le for boucle dans du "vrai" code. C'était le~ bitwise Non, il me manquait ...

C'est encore un peu plus long 92pour que je ne me sente pas si mal. Mais je vais le mettre dans une deuxième tentative de toute façon.

$argn est l'entrée de la ligne de commande

Exécutez en tant que pipe avec -nR ou essayez-le en ligne.

bac à sable


Il me semble que votre première version serait plus courte de 4 octets si vous utilisiez une fonction nommée fau lieu d’attribuer une fonction anonyme à$f - function f(enregistre 2 octets $f=function(, et vous enregistrez un autre octet chaque fois que vous appelez f(...)au lieu de $f(...). Vous pouvez également capturer $s, en économisant 2 octets, une ($i)use($s)longueur supérieure de 4 octets ($i,$s), mais en économisant 3 octets pour chaque appel au $f($i)lieu de $f($s,$i); dans les langues avec capture automatique, comme JS, il s'agit le plus souvent d'une économie viable, car vous ne payez pas l'amende du userelevé.
IMSoP

J'apprécie l'aide, je suis assez nouveau pour coder le golf et je ne le fais pas vraiment, on s'ennuie quand même sur les pages régulières de SO. J'ai bien pensé à utiliser usemais ça fait plus longtemps, pour que ce sens $isoit dynamique, il faudrait le passer par référence. Donc, il doit être use(&$i)et le $idoit être défini avant de le transmettre par référence à $f. Ce qui signifie le placer dans la fonction parent ou avant toute autre. Pour la fonction que cela pourrait être function s($s,$i)et juste savoir qu'il doit être appelé, s($s,0) mais cela semble moche, et c'est autour11 bytes, use(&$i),$i
ArtisticPhoenix

Nous pourrions utiliser $scependant et changer le \nà un retour de ligne réel. Cela passe à 143 2 à la fin de la ligne et 1 à l'utilisation
ArtisticPhoenix

Oui, je n’avais même pas envisagé de mettre $ i dans l’utilisation, car $ s sentait la capture «naturelle», mais il est toujours utile de calculer l’épargne nette. Cependant, vous pouvez toujours économiser 2 octets en déclarant simplement une fonction nommée fau lieu d'une fermeture: function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))." ";}Des fonctions supplémentaires comme celle-ci sont autorisées selon cette méta publication: codegolf.meta.stackexchange.com/questions/7614/…
IMSoP

Mis à jour, sauvé un couple
ArtisticPhoenix
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.