Imprimer l'alphabet personnalisé


20

Le défi

Affichez l'alphabet d'une lettre donnée lue à partir de l'entrée de la console. Si la lettre est en majuscule, vous devez afficher l'alphabet en majuscule. L'alphabet imprimé doit se terminer par la lettre précédente de celle insérée. Si un paramètre supplémentaire est ajouté à l'entrée (un simple point .), l'alphabet doit être imprimé une lettre sur chaque ligne. Sinon, l'alphabet doit être imprimé sur la même ligne, séparé par un simple espace. Si une mauvaise entrée est envoyée au programme, elle n'imprimera rien.

Exemples d'entrées:

Contribution:

c

Sortie du programme:

d e f g h i j k l m n o p q r s t u v w x y z a b

Contribution

H.

Sortie du programme:

I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G

Sage Notebook fonctionne au "niveau console", donc "l'entrée console" requise dans ce cas ne fait-elle que taper l'entrée dans une cellule de feuille de calcul?
res

le code le plus court gagne?
ardnew

@ardnew Oui, le code le plus court gagne.
Averroes

@res Je pense que même si vous devez coder la lecture d'entrée d'une manière ou d'une autre, cela peut être juste du point de vue des règles.
Averroes

6
@Averroes La pénalité pour l'utilisation de GolfScript est le temps qu'il faut pour apprendre un langage qui n'a aucune utilité réelle en dehors de ce type de compétition. Je ne pense pas que pénaliser les gens pour avoir utilisé le bon outil pour le travail va être très productif.
Gareth

Réponses:


12

GolfScript 48 75 73 70 67 66 63 57 53

(91,65>.+.{32+}%+.@?>(;25<''+.,1>*\['''.']?[' 'n 0]=*

Démos en ligne:

Mise à jour:

Maintenant, la dernière règle est également implémentée. Merci à Ventero d' avoir signalé le problème.

Mise à jour:

J'ai réécrit le code à partir de zéro et j'ai trouvé de nouvelles façons de le raccourcir encore plus.

Historique des modifications:

.,3<\(:x;:§['''.']?)and{91,65>.+.{32+}%+.x?).{>25<''+{§n' 'if}%}{;;}if}''if
.,3<\(:x;:§['''.']?)*{91,65>.+.{32+}%+.x?).{>25<''+{§n' 'if}%}{;;}if}''if
.,3<\(:x;:§['''.']?)*{91,65>.+.{32+}%+.x?).!!@@>25<''+{§n' 'if}%*}''if
.,3<\(:x;:§['''.']?)*!!91,65>.+.{32+}%+.x?).!!@@>25<''+{§n' 'if}%**
.,3<\(:x;:§['''.']?)*91,65>.+.{32+}%+.x?).@@>25<''+{§n' 'if}%@@*!!* 
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?).@@>25<''+{§n' 'if}%@@*!!*
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?):x>25<''+{§n' 'if}%\x*!!*
.(@,3<@:§['''.']?)*91,65>.+.{32+}%+@1$?):x>25<''n' 'if*\x*!!*
(\:§['''.']?)91,65>.+.{32+}%+@1$?):x>25<''n' 'if*\x*!!*
(91,65>.+.{32+}%+.@?>(;25<''+.,1>*\['''.']?[' 'n 0]=* 

2
Cette solution ne suit pas la dernière exigence:If wrong input is send to the program it will not print anything.
Ventero

@Ventero Right. Je vais arranger ça.
Cristian Lupascu

63 - bien, nous sommes head2head :), j'aimerais comprendre golfscript;)
bua

Je ressens la même chose pour Q. Excellent travail! ;-)
Cristian Lupascu

+1 génial! prêt à casser 50 ;-)?
Bua

10

C, 135 129 128 caractères

Merde, tant de nombres magiques différents, mais aucun moyen de s'en débarrasser.

Doit être exécuté avec l'entrée comme paramètre de programme. Suit maintenant l'exigence de "mauvaise entrée".

c;main(a,b)char**b;{if(a==2&&isalpha(**++b)&&!(c=1[*b])||c==46&&!2[*b])for(;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,c?10:32);}

Explication:

c;                   // Variable that will be used later
main(a,b)char**b;{   // There's one parameter => a = 2, b[1] = the parameter
                     // Wrong input checks: We want...
  if(
     a==2 &&         // 1 parameter and ...
     isalpha(**++b)  // lower- or uppercase letter as parameter,
                     // increase b so we can access it better
     &&              // and ...
     !(c=1[*b]) ||   //   either no further character,
                     //     save the character in c, or...
     (c==46&&!2[*b]) //   a dot as next character and no further characters
    )                // if check succeeded, execute the for loop, else do nothing
  for(;++a<28;)      // This will loop 26 times (2..27)
    printf("%c%c",   // Print two characters
                     // First character to print:
      **b            // We'll print the first character of the parameter,
       -=            // but decrement it before printing
       **b+6&31?     // if the last five bits (31 = 11111b) are not 26 (6 == -26 mod 32)
        -1           //   decrement it by -1 (aka increment it)
        :25,         //   else (char=z/Z) decrement by 25, so we start over at a/A
                     // Second character to print:
      c?             // c is either ASCII 0 or a dot (ASCII 46)
       10            //   dot     -> print a newline
       :32);         //   ASCII 0 -> print a space (ASCII 32)
}

La **b+6&31partie utilise le fait que les codes ASCII pour les caractères minuscules / majuscules sont les mêmes si l'on ne regarde que les 5 derniers bits et les 5 bits restants sont dans la plage 1..26.

Version sans exigence de "mauvaise entrée" (82 caractères):

main(a,b)char**b;{for(b++;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,1[*b]?10:32);}

Une instruction sur la façon de le compiler? Je reçois un défaut de segmentation lors de l'exécution.
manatwork

@manatwork semble prendre l'entrée en paramètre.
shiona

Oui, en effet, édité pour clarifier. Par exemple, si le nom du programme est test, appelez-le comme test coutest X.
schnaader

Merci, j'ai compris. Mon C semble être plus rouillé que je ne le pensais.
manatwork

2
K & R style définition peut aider: main(a,b)char**b;{. De plus, on b++vous laisserait remplacer *b[1]-> **bet b[1][1]-> 1[*b].
ugoren

7

Ruby, 72 71 61 caractères

gets;25.times{$><<$_=$_.succ[0]+=$1?$/:' '}if~/^[a-z](\.)?$/i

Cette version rubis utilise une expression régulière pour vérifier l'entrée. Heureusement, la méthode de la chaîne Ruby succfait la plupart du travail pour nous (y compris le bouclage).

Edit: 61 caractères avec l'aide de chron et Ventero .


Le mien s'est révélé bien trop similaire au vôtre pour prendre la peine de publier séparément. Même approche, mais quelques caractères plus courts (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge

2
Et c'est 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- fondamentalement la même chose que la vôtre juste abuser $_et$/
Paul Prestidge

2
@chron: en utilisant +=au lieu de +, vous pouvez supprimer les parenthèses $1?$/:' '.
Ventero

@chron et Ventero: Merci. Ajout de votre code à ma solution.
Howard

6

Ruby: 127 113 92 (?) Caractères

(Je ne trouve pas la règle sur le score de pénalité lors de l'utilisation -p. Ajouté 1 pour l'instant. En cas d'erreur, veuillez me corriger.)

$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end

Exemple d'exécution:

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< c
d e f g h i j k l m n o p q r s t u v w x y z a b

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< H.
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G

bash-4.2$ ruby -pe '$_=if ~/^([a-z])(\.)?$/i;s,e=$1>?Z?[?a,?z]:[?A,?Z];[*$1.succ..e,*s...$1]*($2==?.?$/:" ")end' <<< seven

6

Rubis, 101 95

i,d=gets.split''
[*?a..?z].join[/#{i}/i]
($'+$`).chars{|c|$><<(i>?Z?c:c.upcase)+(d==?.?$/:' ')}

Essayez-le en ligne


Ne suit pas "Si une mauvaise entrée est envoyée au programme, elle n'imprimera rien."
Matt

pourrait sauver quelques caractères avec ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge

@chron Merci! Comment pourrais-je manquer ça ..
defhlt

6

GolfScript, 80 72 caractères

.).46={;)}*25,{65+.32+}%?)\""=*!!\([{)..31&26-!26*-}25*;]n+\"."=n" "if**

Beaucoup de code teste l'entrée valide et l'option "n'imprime rien". La logique réelle est de 37 caractères seulement.

Cas de test en ligne


6

q / k4 66 64 63 60 58 56 + 2 pénalité

pénalité pour la variable globale init, l'algorithme est de 56 comme ci-dessous:

56:

if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]

58:

if[&/x in".",l:(a;A)90>*x;1@/(1_,/|_[0,l?x;l]),'"  \n"@#x]
  • passer de if-else à if autorisé à réorganiser le code et à se débarrasser de ";" à la fin

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • s'est finalement débarrassé de ce chèque redondant

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • imprimer les caractères récursivement à la place d'un objet entier
  • ne peut toujours pas sortir de la comparaison d'identité x dans "." à deux endroits ... :(
  • un point-virgule à la fin est requis, sinon la fonction print (1 @) afficherait sa valeur de retour sur stdout .... damn

64:

2@,/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x;  

ÉDITER:

Ajout d'une pénalité de 2 pour l'initialisation globale (x :), même si la fonction d'enveloppement entre crochets (comme suggéré par slackware)
ne sait pas si le changement d'espace de noms doit également être puni ... alors c'est un autre 3

(.Q`a`A) instead of (a;A)

Exemple:

q)\         - switch interpreter to k4
 \d .Q     - change to native namespace
  x:"c"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
d e f g h i j k l m n o p q r s t u v w x y z a b

  x:"@"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]    
  x:"H."
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G
  x:...

+1 Belle progression. Je vais essayer de trouver un autre moyen de raccourcir mon code maintenant.
Cristian Lupascu

Peut-il vraiment être appelé k valide s'il utilise des définitions dans qk? ;-) De plus, si vous l'enveloppez dans une fonction, vous pouvez ignorer l'étape de configuration de x: "a", par exemple {$ [...]}
skeevey

@slackwear vous avez raison, c'est pourquoi cela s'appelle q / k4 ;-).
bua

6

Perl, 131 127 117 117 112 106 104 102 102 98 96 92 91 90 93 71 66 65 64 58 caractères

s!^([a-z])(\.?)$!print chop,$2?$/:$"for($1..az)[1..25]!ie

Usage:

perl -ne 's!^([a-z])(\.?)$!print chop,$2?$/:$"for($1..az)[1..25]!ie'

Un caractère a été ajouté au décompte de l' noption.

La plus grande coupure n'a été possible qu'en raison du comportement des ++personnages dans la réponse de Jon Purdy .


Vous pouvez raser quelques caractères en supprimant les 2 derniers points
ardnew

@ardnew Merci. :-)
Gareth

1
cette chose est impressionnante
bua

@bua Merci, j'essaie toujours de trouver les personnages pour que je puisse vous attraper et w0lf. :-)
Gareth

s/a.$1/az/pour économiser 2 de plus. chop().($2?$/:$")-> chop,$2?$/:$"pour 4 de plus
mob

5

Perl, 149 , 167

Mise à jour

  • Vérification de la santé mentale ajoutée.
  • A pris une nouvelle suggestion concernant l'application du séparateur.
exit if $ARGV[0] !~ /[a-z]\.?/i;    # sanity check input
($x,$d)=split //,$ARGV[0];          # split input arguments
@l=65..90;                          # define uc letter range
push @l,splice @l,0,ord(uc $x)-64;  # rotate letter range
pop @l;                             # remove the argument letter
print join $d?$/:$",                # print the joined list
  map {ord($x)>90?lc chr:chr} @l;   # map chr and lc as appropriate

vous pouvez remplacer $s=($d)?"\n":" ";avec $s=$d?$/:$";et peut-être simplement vous débarrasser $scomplètement
ardnew

4

Python, 83

r=raw_input()
i=ord(r[0])
exec"i+=1-26*(i%%32>25);print chr(i)%s;"%","["."in r:]*26

Je ne suis pas fan de cette restriction, mais elle existe et votre programme ne la suit pas: "Si une mauvaise entrée est envoyée au programme, elle n'imprimera rien."
Matt

En outre, il semble que vous imprimiez un caractère de plus que vous ne le devriez. L'exemple de sortie comporte 25 caractères.
Matt

4

PHP, 120 119 113

<?$v=fgets(STDIN);$f=$c=$v[0];ctype_alpha($c++)||die;for(;$c[0]!=$f;$c=$c[0],$c++)echo$c[0],$v[1]=='.'?"\n":" ";

1
Il s'agit d'un défi de code-golf , donc les optimisations de vitesse et d'utilisation des ressources ne sont pas nécessaires. Au lieu de stocker $v[1]=='.'?"\n":" "le résultat de la variable $ s, laissez PHP le calculer à chaque fois dans l' echoinstruction. De cette façon, vous pouvez épargner 6 caractères.
manatwork

1
@manatwork Merci, je l'ai changé.
lortabac

4

Mathematica 158 159 204 199 183 167 165 162

Code

f@h_ := Most@RotateLeft[#, Position[#, h][[1, 1]]] &[FromCharacterCode /@ 
        (65~Range~90 + 32 Boole@LowerCaseQ@h)];
g = Characters@# /. {{p_} :> Row[f@p, " "], {p_, "."} :> Column@f@p, _ -> ""} &

Usage

g["c"]
g["H"]
g["H."]
g["seven"]

usage


Le troisième cas d'utilisation est f ["H"] ou f ["H."]?
Averroes

J'ai dû corriger la gestion de ".", En ajoutant 50 caractères au code. Mais cela fonctionne maintenant selon les instructions
DavidC

3

J 43

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0

Exemples:

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's'

tuvwxyzabcdefghijklmn opqr

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's.'

t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r

|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 '['

Cette solution a évolué sur le forum de programmation J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Auteurs: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Explication

Les phrases J sont exécutées en commençant à droite, en passant le résultat en cours vers la gauche lors de son évaluation. Puisqu'il est interactif, nous pouvons examiner des éléments de la solution isolément pour mieux les comprendre.

La partie centrale génère l'alphabet majuscule et minuscule en Unicode:

   u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

Le verbe "u:" convertit son argument numérique de droite en caractères Unicode. L'argument numérique est généré à partir des valeurs ASCII pour les caractères majuscules et minuscules en ajoutant les nombres pour "A" et "a" chacun aux valeurs de 0 à 25 générées par "i.26":

   65 97+/i.26
65 66 67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

La partie droite,

   ((>:@i.}.[)])"0

recherche (i.) la position de l'argument de droite (]) dans la gauche ([) - qui est le vecteur des lettres ci-dessus - et laisse tomber (}.) un de plus (>:) que ce nombre. Le "" 0 "applique cette phrase aux arguments (scalaires) à 0 dimension.

   ('123H999' (>:@i.}.[)])"0 'H'
999

La phrase "25 {." Prend les 25 premiers éléments du vecteur à droite.

L'avant-dernière phrase "1j1 #" à gauche reproduit son argument de droite en fonction du nombre à gauche. Un simple numéro fait une simple réplication:

   2 # 'ABCD'
AABBCCDD

Cependant, un nombre complexe - indiqué par le "j" entre les parties réelle et imaginaire - insère un élément de remplissage en fonction de la partie imaginaire. Ici, nous indiquons un élément de remplissage par celui à droite du "j".

   2j1 # 'ABCD'
AA BB CC DD 

Comme pour la plupart des primitives J, le verbe répliqué (#) fonctionne sur les tableaux numériques de manière analogue à son fonctionnement sur les tableaux de caractères. Comme montré ici,

   1j1 # 1 2 3
1 0 2 0 3 0

nous voyons que l'élément de remplissage numérique par défaut est zéro alors que pour les caractères c'est le caractère espace.

Enfin, le jeton le plus à gauche "|:" transpose le résultat des verbes précédents à sa droite.

Explication fournie par Devon McCormick. Merci Devon.


+1 Très belle solution et explication. J'ai envisagé de l'essayer en J, mais je n'ai pas réussi à trouver un moyen (court) de vérifier que l'entrée était valide. Je pense que la mienne aurait été au moins deux fois plus longue.
Gareth

Merci Gareth, Si vous regardez les premières solutions dans le lien de discussion, vous verrez que beaucoup de nos démarrages étaient plus longs. L'une des choses intéressantes que nous avons trouvées était la variété d'approches que nous pouvions utiliser avec J. cheers, bob
bob therriault

3

enculé, 303

,>,>++++++[-<-------->]<++[[-]+++++[->++++<]>++<]>++++++++++<<[->+>>>+<<<<]>>>>>>+++++++++++++++[-<++++++<<++++++>>>]<[<[->>]>[>>]<<-]<[[-]++++++++[-<++++>]]<<<[->>>+>+<<<<]>>>>>+[[-]<.<<<.>[->>>+>+<<<<]>>>[-<<<+>>>]<[->+>-<<]>[-<+>]+>[-<[-]>]<[++++[-<----->]<->]<+[->+>+<<]<[->+>-<<]>[-<+>]>>[-<<+>>]<]

Actuellement, il ne prend pas en charge la If wrong input is send to the program it will not print anythingpièce, et il peut probablement être plus court. J'ai l'intention de le réparer plus tard. En ce moment, mon cerveau est trop fou pour continuer.


2

C, 110

Imprime parfois des "espaces" entre les lettres, parfois non.

i,j;main(int c,char*l){gets(l);l[1]&=10;j=*l%32;c=*l&~31;for(i=j;i<j+25;i++){l[0]=c+i%26+1;printf("%2s",l);}}

Un peu plus lisible:

i,j;
main(int c,char*l)
{
  gets(l);
  l[1]&=10;          // makes . to line feed and some other chars to "start of text" 
                     // which looks like space in some cases 
                     // (the byte can become either 0, 2, 8 or 10)

  j=*l%32;           // 0b 000c cccc, these five bits code which letter was chosen
  c=*l&~31;          // 0b ccc0 0000, these three bits code upper/lowercase

                     // 0b ccc0 0000 + (0b 000c cccc + [0..24])%26 + 1
  for(i=j;i<j+25;i++){l[0]=c+i%26+1;printf("%2s",l);}
}

Exécute:

$ ./a.out
G
 H I J K L M N O P Q R S T U V W X Y Z A B C D E F

$ ./a.out
p.
q
r
s
t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o

2

JavaScript, 137

Malheureusement un peu bavard ( String.fromCharCodeet charCodeAt).

for(x=b=(n=prompt(m={122:97,90:65})).charCodeAt(r='');/^[a-z]\.?$/i.test(n)&&(x=m[x]||x+1)!=b;)r+=String.fromCharCode(x)+(n[1]?"\n":" ");

2

Perl, 77 76 70 68

chomp(($a,$b)=split//,<>);$"=$/if$b;map{++$a=~/(.)$/}1..25;print"@a"

Modifications:

  1. Enregistré un personnage en utilisant regex au lieu de substr.

  2. 6 caractères enregistrés à la mapplace de for.

  3. Enregistrement de 2 caractères en omettant le retour à la ligne final.


3
Bien, mais comme vous l'avez souligné, il ne répond pas à l'exigence selon laquelle une entrée non valide ne donne aucune sortie. Corrigez cela et vous obtiendrez mon vote positif.
Gareth

ne semble pas fonctionner pour moi sur perl 5.14.2. aussi je ne crois pas que la \nfinale printsoit requise, ce qui permettra d'économiser quelques caractères
ardnew

@ardnew: Je l'ai écrit sur mon ordinateur de travail, qui a 5.12.3. Va tuer le \n, merci.
Jon Purdy

2

R, 219

Moche, longtemps ... fonctionne toujours.

f=function(l){if(!nchar(l)%in%c(1,2))invisible()else{s=ifelse(nchar(l)==1," ","\n");l=substr(l,1,1);v=letters;if(l%in%v){}else v=LETTERS;l=grep(l,v);if(l==26)cat(v[1:25],sep=s)else cat(c(v[l+1:(26-l)],v[1:l-1]),sep=s)}}

Usage:

f("a")
f("c.")
f("H")
f("z")
f("Z.")
f("seven")

2

C, 146 caractères (terrible)

main(){char b[100];gets(b);for(char a=b[0],c=a,d=a&223,e=b[1];++c!=a&64<d&d<91&(!e|e==46&!b[2]);(c&31)>26?(c&=96):(putchar(c),putchar(e?10:32)));}

Je ne suis pas très expérimenté en C, ce qui montre probablement ...>. <J'avais le sentiment que les caractères étant des entiers seraient utiles, mais cela ne semblait pas avoir un impact aussi important que je l'espérais ... Je vais laisser ma tentative ici cependant, n'hésitez pas à suggérer des améliorations.

Version non minimisée:

main() {
  char b[999]; // assume that the line will fit in 999 chars...
  gets(b);

  // a is the char we start on, c is the char that we iterate,
  // d is toUppercase(a), e is just an alias for the second char.
  for (char a = b[0], c = a, d = a&223, e=b[1];
      // increment c, make sure that we haven't reached a yet.
      // also check the other conditions (first char is letter, second char
      // is either '.' or NULL, third char is NULL if second char was '.').
      ++c != a & 64 < d & d < 91 & (!e | e == 46 & !b[2]);
      (c&31) > 26     // check if we need to wrap around
        ? (c &= 96)   // if so, wrap
        : (putchar(c), putchar(e?10:32))  // otherwise, print char & separator
  );
}

2

VBA 225

Formaté pour s'exécuter à partir de la fenêtre immédiate:

s=InputBox(""):n=Asc(Left(s,1)):l=Len(s):p=IIf(l<3,IIf(l=2,IIf(Right(s,1)=".",vbCr,"")," "),""):c=IIf(n>64 And n<91,65,IIf(n>96 And n<123,97,99)):o=n-c+1:If o>0 And p<>"" Then For i=o To o+24:x=x & Chr(i Mod 26+c) & p:Next:?x

Décomposé en lignes individuelles (doit être entouré de Subblocs et nécessite une printméthode différente pour fonctionner dans un module, allongeant ainsi le code):

s=InputBox("")
n=Asc(Left(s,1))
l=Len(s)
p=IIf(l<3,IIf(l=2,IIf(Right(s,1)=".",vbCr,"")," "),"")    
c=IIf(n>64 And n<91,65,IIf(n>96 And n<123,97,99))
o=n-c+1
If o>0 And p<>"" Then 
For i=o To o+24
x=x & Chr(i Mod 26+c) & p
Next
End If 'Not needed when completed in single line format
MsgBox x

2

Java 8, 127 octets

a->{String r="",d=a.length>1?"\n":" ";char c=a[0],C=c;for(;++c<(c<97?91:123);r+=c+d);for(c=C<97?64:'`';++c<C;r+=c+d);return r;}

Explication:

Essayez-le en ligne.

a->{                        // Method with character-array parameter and String return-type
  String r="",              //  Result-String, starting empty
         d=a.length>1?      //  If the length of the input is larger than 1
            "\n"            //   Set the delimiter to a new-line
           :                //  Else:
            " ";            //   Set the delimiter to a space
  char c=a[0],              //  Get the input letter
       C=c;                 //  And create a copy of it
  for(;++c<(c<97?91:123);   //  Loop from this letter + 1 to (and including) 'Z'/'z'
    r+=c+d);                //   And append the result with a letter + the delimiter
  for(c=C<97?64:'`';++c<C;  //  Loop again from 'A'/'a' to (and excluding) the input-letter
    r+=c+d);                //   And append the result with a letter + the delimiter
  return r;}                //  Return the result

1

Oreillons, 91 , 86 , 82 , 79 , 76

r t i t?1A.1"." s a=$A(t),p=a>90*32+65 f i=1:1:25 w *(a+i-p#26+p) w:t["." !

Pas un langage aussi moderne;) Je suis sûr qu'il reste un peu d'espace d'optimisation ..

Explication:

r t 

lire l'entrée

i t?1A.1"."

vérifier si t correspond à l'entrée requise

s a=$A(t),p=a>90*32+65 f i=1:1:25 { w *(a+i-p#26+p) w:t["." !}

de base pour parcourir l'alphabet. Notez que les oreillons évaluent strictement de gauche à droite. Vrai = 1, donc vous obtenez 65 ou 97 comme résultat pour p, # est l'opérateur modulo

tests:

USER>d ^golf
d.e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
a
b
c

USER>d ^golf
tuvwxyzabcdefghijklmnopqrs
USER>d ^golf
h.i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
a
b
c
d
e
f
g

USER>d ^golf
hallo
USER>

(vous aurez besoin d'un environnement d'exécution des oreillons, c'est-à-dire Caché pour exécuter ceci)

modifier: titre en gras

edit: avait une mauvaise solution, corrigée maintenant. Merci à rtfs et Averroees pour l'avoir signalé


le code semble être de 79 caractères de long, pas 80
Cristian Lupascu

malheureusement, le premier espace n'est pas facultatif, j'ai donc pensé que je devais le compter.
kazamatzuri

Les cas de test ne se terminent pas dans la lettre précédente de celle passée en paramètre, n'est-ce pas?
Averroes

1

JavaScript: 141

c="",b=c[0].charCodeAt()<91,a="abcdefghijklmnopqrstuvwxyz",b&&(a=a.toUpperCase()),a=a.split(c[0]),a=a[1]+a[0],a=c[1]?a.split("").join("\n"):a

Version commentée:

c="", //write input here (examples "a", "B", "c.", "D.")
b=c[0].charCodeAt()<91, //true for upperC, false for lowerC
a="abcdefghijklmnopqrstuvwxyz", //the abc
b&&(a=a.toUpperCase()), //if upper, turn main string to upperC
a=a.split(c[0]), //split by the first char of input
a=a[1]+a[0], //swap the two parts
a=c[1]?a.split("").join("\n"):a //if input second char, add breaklines in between
//the output is inside 'a'

jsFiddle DEMO


0

Voici ma première tentative avec APL.

⍞{1 1≡(2⌈⍴⍺)⍴⍺∊'.',⍵:⊃(~=/2⍴⍺)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍺)⌽X←(⎕A∊⍨⊃⍺)⌷2 26⍴⍵)}6↓26⌽⎕UCS 65+⍳58

si je peux utiliser une seule variable globale, A←2 26⍴6↓26⌽⎕UCS 65+⍳58je peux raccourcir ce qui précède comme suit:

{1 1≡(2⌈⍴⍵)⍴⍵∊'.',,A:⊃(~=/2⍴⍵)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍵)⌽X←(⎕A∊⍨⊃⍵)⌷A)}⍞

0

C ++ 11

#include <iostream>
#include <vector>
#include <cstdio>

int main(int argc, const char * argv[])
{
    std::vector<char> list1,list2;
    for( char c = 'a'; c <='z'; c++ )
    {
        list1.push_back( c );
        list2.push_back( toupper( c ) );
    }
    char c = getchar();
    auto f = [ c ]( std::vector<char> list )
    {
        auto i = std::find( list.begin(), list.end(), c );
        if( i == list.end() )
            return;
        auto c = i;
        for( ;; )
        {
            c++;
            if( c == list.end() ) c = list.begin();
            if( c == i )break;
            std::cout<<*c<<"\n";
        }
    };
    f( list1 );f(list2);
    return 0;
}

0

C (111)

main(int i, char**c){if(isalpha(*c[1]))for(i=0;i<25;i++) printf("%c",isalpha((*c[1])+1)?++*c[1]:(*c[1]-=25));}

dissection

if(isalpha(*c[1])) // start with char-check.

for(i=0;i<25;i++) // we need 25 values, excluding input char. reusing i.

printf("%c", // print char. ofcourse.

isalpha((*c[1])+1) ? ++*c[1] : (*c[1]-=25)); 
//check if we are past z/Z and fall back to a/A. 
//make that available to print. 

Works] $ ./test 5

Works] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Works] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Works] $ ./test g hijklmnopqrstuvwxyzabcdef

Works] $ ./test [

Works] $ ./test a bcdefghijklmnopqrstuvwxyz

Works] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Merci pour un peu de réflexion.


Vous n'ajoutez pas de nouvelles lignes si un "." est donnée. De plus, vous ne devriez rien produire si l'entrée ne l'est pas [A-Za-z]\.?, si j'ai bien compris la question.
marinus

#1. Oh! j'étais absorbé à faire du code court. # 2. voir la sortie de 'test [' il n'imprime rien. @marinus
essbeev

0

Perl, 226 caractères

die "Invalid input " if $ARGV[0] !~ /[a-z]\.?/i;
@listA=(a...z);
$index=ord(lc(substr($ARGV[0],0,1)))-97;
print join(substr($ARGV[0],1) ? "\n" : " ",map{$ARGV[0] =~ /[A-Z]/?uc $_:$_}(@listA[$index+1...25],@listA[0...$index]));

Vous pouvez formater votre texte pour qu'il apparaisse sous forme de bloc de code. Lisez le guide ici pour formater vos messages. En outre, vous pouvez enregistrer certains caractères en utilisant des noms de variable à caractère unique.
Gareth

1
Une entrée invalide ne devrait rien imprimer, donc votre dierelevé peut être réduit, économisant un tas ...
Gaffi

0

C # 170

using System.Linq;namespace N{class P{static void Main(string[]a){foreach(char e in"abcdefghijklmnopqrstuvwxyz".ToCharArray().Where(o =>o>'c'))System.Console.Write(e);}}}

Non compressé

using System.Linq;
namespace N {
    class P {
        static void Main(string[]a){
            foreach (char e in "abcdefghijklmnopqrstuvwxyz".ToCharArray().Where(o => o > 'c'))
                System.Console.Write(e);
        }
    }
}

N'oubliez pas d'ajouter une explication à votre réponse.
Justin

Ce programme n'essaie même pas de loin de respecter les règles. 1: Si la lettre est en majuscule, vous devez afficher l'alphabet en majuscule. 2: L'alphabet imprimé doit se terminer par la lettre précédente de celle insérée. 3: Si un paramètre supplémentaire est ajouté à l'entrée (un simple point.) L'alphabet doit être imprimé une lettre sur chaque ligne. Sinon, l'alphabet doit être imprimé sur la même ligne, séparé par un simple espace. 4: Si une mauvaise entrée est envoyée au programme, elle n'imprimera rien. Il s'agit d'une erreur de 4 sur 4.
RobIII

^ A part cela, je vous invite à jeter un œil à mes commentaires précédents ici . Vous pouvez remplacer charavec varet rasage 1 point de votre score, perdre la .ToCharArray()(un string est un char-tableau , vous pouvez déjà itérer sur!), Perdre le string[] acar vous n'êtes pas traiter avec des arguments de commandline, perdre l'espace de noms, votre constante « c » devrait être lu à partir de l'entrée de la console, perdez la chaîne alphabétique et utilisez ASCII à la place, etc. C'est super que vous jouiez, mais essayez de faire un effort décent; la plupart de vos soumissions semblent être uniquement à la traîne.
RobIII

0

C, 117

main(c,s,d){d=c=getchar(),s=getchar();for(s=s<0?32:s^46?0:10;d+=d+6&31?1:-25,s&&isalpha(c)&&d^c;printf("%c%c",d,s));}

Nous remercions schnaader pour l'astuce d + 6 & 31.

http://ideone.com/ts1Gs9


0

Bash: 110 octets

(([[ $1 =~ [a-z] ]]&&echo {a..z})||([[ $1 =~ [A-Z] ]]&&echo {A..Z}))|([ "${1:1:1}" = . ]&&sed 's/ /\n/g'||cat)

En termes d'explication, c'est assez simple, pas de tours de magie - c'est juste quelque chose pour lequel bash est intrinsèquement bien adapté. En termes de bits non évidents:

  • {a..z}est une astuce très sous-utilisée en bash - elle se développe à a b c d.... Vous pouvez faire de même pour générer des séquences numériques.
  • Bash peut faire une correspondance regex, [[ $1 =~ [a-z] ]]exécute une correspondance regex avec le premier argument de programme pour les caractères de a à z. De même pour AZ. Cependant, vous avez besoin de crochets doubles, [vous ne pouvez pas le faire.
  • ${1:1:1}obtient une sous-chaîne de $ 1 (le premier argument), un caractère dans, un caractère de long - c'est-à-dire qu'il retourne le deuxième caractère de la chaîne, ce que nous attendons ..
  • sed 's/ /\n/g'expression rationnelle simple: recherche et remplace les espaces par des retours à la ligne. Si .est le deuxième caractère de la chaîne, nous dirigeons l'entrée vers cela, ou autrement ...
  • cat est l'astuce finale ici - si nous ne voulons pas remplacer les espaces par des sauts de ligne, nous alimentons stdin à cat à la place qui le renvoie simplement à nouveau.

N'oubliez pas d'ajouter une explication.
Justin
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.