Springify une chaîne

11

Poster Sandbox ici .

Créez une fonction ou un programme qui "Springifie" une chaîne.

  • L'entrée sera une chaîne dans Stdin, ou l'alternative la plus proche
  • L'entrée ne contiendra que de l'ASCII imprimable et / ou des espaces
  • La sortie sera vers Stdout, ou l'alternative la plus proche
  • Les sauts de ligne et les espaces sont acceptables

Comment sprinter une chaîne

  1. Formatez la chaîne en autant de bobines de ressort ASCII que nécessaire
  2. Remplissez les bobines avec des espaces, jusqu'à la bobine la plus proche
  3. Lisez les personnages en suivant le printemps autour des bobines

Il s'agit d'une bobine à ressort ASCII:

#
# ####
 #    #
# ####
#

Où les #s sont les caractères de la chaîne

Voici un exemple:

abcdefghijklmnopqrstuvwxyz

devient

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

Où les .s remplacent les espaces pour la visibilité.

Ensuite, la chaîne est relue, en suivant le ressort ASCII vers le bas, autour des boucles, en appuyant deux fois sur get u:

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

...donnant:

abgjklmhfedcginopuxyz vtsrquw (avec un espace de fin)

Cas de test

(citations ajoutées pour mettre en évidence les espaces de fin - veuillez ignorer en termes d'E / S)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

Notez que la longueur de sortie est toujours un multiple de 15, la longueur d'une bobine à ressort

Il s'agit de , donc la réponse la plus courte en octets l'emporte.

MildlyMilquetoast
la source
J'ai l'impression qu'il aurait été beaucoup plus difficile de suivre le modèle le long de la bobine.
Urne de poulpe magique du
@carusocomputing vous voulez dire l'inverse?
MildlyMilquetoast
codegolf.stackexchange.com/a/107531/59376 s'avère que je n'ai pas compris le défi tel qu'il est écrit, c'est exactement le défi ahaha.
Urne de poulpe magique du

Réponses:

2

Gelée , 26 octets

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

TryItOnline!

Comment?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print
Jonathan Allan
la source
5

Python 2, 104 102 102 98 octets

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

Merci pour l'aide au commentaire!

https://tio.run/#2VDVy

Original:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')
throx
la source
Vous pouvez simplement utiliser input()et prendre des entrées dans le format "<stuff>".
HyperNeutrino
Super premier golf! Comme le souligne Alex L., nous autorisons la saisie entre guillemets. Vous pouvez également utiliser un lambdapour donner une fonction anonyme plutôt qu'un programme - c'est souvent plus court .
xnor
Échoue pour le cas de test de chaîne vide avec une IndexError. Je pense que vous devrez peut-être modifier 13 à 14 et masquer la valeur finale (un peu comme ma réponse Jelly).
Jonathan Allan
... changer le +13to +14et le +1to le +(len(t)%14>0)ferait, mais il doit y avoir un moyen plus court.
Jonathan Allan
3

JavaScript (ES6), 79 octets

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

Chaîne hexadécimale volée sans vergogne à @ETHproductions.

Neil
la source
@ETHproductions Merci, corrigé.
Neil
C'est brillant!
dodov
C'est agréable de voir comment l'extrait de code vous permet de voir le résultat lorsque vous le tapez
MildlyMilquetoast
2

Rétine , 71 octets

$
13$* 
M!`.{14}|$
(.)(.)(.)(.)(.)(.)(.)(....)(.)¶
$5$8$6$4$3$2$1$5$7$9

Essayez-le en ligne!

Permuter les cordes n'est pas exactement concis dans la rétine ...

Martin Ender
la source
2

JavaScript (ES7), 144 143 141 114 104 103 octets

Merci à ETHProductions pour une économie de 10B!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

Exemple

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

Production

abgjklmhfedcginopuxyz vtsrquw 
Luc
la source
Très agréable. Vous pouvez enregistrer quelques octets en convertissant le tableau en une chaîne hexadécimale et en l'utilisant +('0x'+whatever)pour le convertir en un nombre:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions
Astuce. Je pensais déjà à d'autres façons d'écrire le tableau, mais je n'ai pas pu en trouver. Je peux encore raccourcir cela, en plaçant d'abord le nombre hexadécimal puis la multiplication, rendant l'espace inutile.
Luke
Vous pourriez même faire '0x'+'...'[c%15]-0+(c/15|0)*14pour vous sauver une paire de parenthèses :-)
ETHproductions
Vous avez raison. Ajoutée.
Luke
2

Perl 6 , 61 octets

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

Comment ça fonctionne

La structure de base est la suivante:

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

L'expression utilisée pour indexer dans chaque segment de 14 caractères est "abgjklmhfedcgin".ords X- 97, qui fonctionne comme suit:

  1. Prenez la chaîne codée en dur abgjklmhfedcgin.
  2. Obtenez ses codepoints: 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110.
  3. Soustraire 97 à partir de chaque numéro: 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13.

Perl 6 , 64 octets

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

Essayez-le en ligne!

Comment ça fonctionne

La structure de base est la suivante:

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

Indices comme ci - dessus, mais étant donné que nous appelons de .flattoute façon, nous pouvons utiliser un imbriquée (mais 1 octet plus courte) expression pour eux 0,1,6,9..12,7,5...2,6,8,13.

(Cela semble banal, mais repose en fait sur une particularité d'analyse de Rakudo Perl 6 qui est probablement un bogue . Pour l'écrire sans exploiter ce bogue, il faudrait ajouter des parens autour du 5...2.)

smls
la source
2

Befunge-93, 97 octets

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

Essayez-le en ligne!

Il s'agit d'une ventilation du code source avec les différents composants mis en évidence.

Code source avec les chemins d'exécution mis en évidence

*La boucle principale commence à s'exécuter de droite à gauche, en s'enroulant du côté droit du terrain de jeu. C'est là que nous lisons le premier caractère de stdin et terminons s'il s'agit d'un EOF.
*La section suivante s'assure que tous les caractères EOF sont convertis en espaces à l'aide de la formule c = c + 31*!(c+1). Bien que cela ne s'applique pas à la première itération, cela peut se produire lors des passes suivantes.
*Une copie du caractère est enregistrée dans la mémoire temporaire, puis une recherche de l'index en cours est effectuée sur la table à la ligne quatre ( *) pour déterminer si le caractère doit être sorti ou non.
*Si le caractère doit être sorti, nous prenons la branche de gauche. Un échange est effectué ici pour annuler l'échange qui va se produire ensuite, puis un zéro est poussé pour forcer la branche à droite.
*Si le personnage n'a pas été sorti, nous l'échangons dans la pile sous le compteur d'index (c'est l'échange qui est annulé dans la branche gauche). Et dans les deux cas, nous enregistrons le caractère en mémoire à l'offset d'index actuel, incrémentons l'index et vérifions s'il est supérieur à 13.
*Sinon, nous lisons le caractère suivant dans stdin et répétons la boucle interne.
*Si c'est le cas, nous aurons terminé un ensemble de 14 caractères, 7 ayant été sortis ( abgjklm) et 7 restant sur la pile ( cdefhin). Nous supprimons les deux derniers, sortons les 5 ( hfedc) restants , puis récupérons et sortons les cas spéciaux g, iet nde la mémoire.
*Et cela nous ramène au début de la boucle principale, où nous répétons le processus pour les 14 caractères suivants.

James Holderness
la source
Belle explication, bravo
MildlyMilquetoast
1

Mathematica, 77 72 octets

Merci à JungHwan Min pour avoir économisé 5 octets!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

Fonction sans nom prenant une liste de caractères en entrée et renvoyant une liste de caractères. Partition[#,14,14,{1,1}," "]divise l'entrée en sous-listes de longueur 14, en ajoutant des espaces si nécessaire. LetterNumber@"abgjklmhfedcgin"évalue à {1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}, ce qui indique l'ordre de prendre chaque sous-liste de longueur 14 (en répétant le 7ème élément de manière appropriée). Prend ensuite [[;;,...]]les éléments de toutes les sous-listes de longueur 14 dans cet ordre et Join@@joint les réponses.

Soumission précédente:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&
Greg Martin
la source
1
LetterNumber@"abgjklmhfedcgin"est un moyen plus court de compresser la liste. Au ;;lieu d' Allenregistrer également un octet.
JungHwan Min
Excellentes suggestions!
Greg Martin
0

PHP, 94 octets

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

divise l'argument de ligne de commande en morceaux de 14 octets et fait une boucle dans la chaîne de traduction en tant qu'index pour la sous-chaîne. Courez avec php -nr '<code>' <string>.

J'étais heureux de découvrir que ??accepte également la chaîne vide (pour un index "invalide") comme nulle.

Titus
la source
0

Rubis, 83 octets

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

La première idée était d'utiliser des nombres hexadécimaux, mais ord-48 enregistre un autre octet (volé dans la réponse de throx).

GB
la source