Stampa alfabeto personalizzato


20

La sfida

Visualizza l'alfabeto di una determinata lettera letta dall'input della console. Se la lettera è maiuscola, è necessario visualizzare l'alfabeto maiuscolo. L'alfabeto stampato deve terminare con la lettera precedente di quella inserita. Se un parametro addizionale addizionale viene aggiunto all'input (un semplice punto .), l'alfabeto deve essere stampato una lettera in ogni riga. Altrimenti, l'alfabeto dovrebbe essere stampato sulla stessa riga, separato da uno spazio semplice. Se al programma viene inviato un input errato, non verrà stampato nulla.

Esempi di input:

Ingresso:

c

Uscita del programma:

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

Ingresso

H.

Uscita del programma:

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 funziona a "livello di console", quindi in questo caso l '"input di console" richiesto in questo caso è solo digitando l'input in una cella del foglio di lavoro?
ris.

vince il codice più corto?
Ardnew,

@ardnew Sì, vince il codice più corto.
Averroè,

@res Penso che mentre è necessario codificare la lettura dell'input in qualche modo, può essere giusto dal punto di vista delle regole.
Averroè,

6
@Averroes La penalità per l'utilizzo di GolfScript è la quantità di tempo necessaria per imparare una lingua che non ha un reale utilizzo al di fuori di questo tipo di competizione. Non credo che penalizzare le persone per l'utilizzo dello strumento giusto per il lavoro sarà molto produttivo.
Gareth,

Risposte:


12

GolfScript 48 75 73 70 67 66 63 57 53

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

Demo online:

Aggiornare:

Ora viene implementata anche l'ultima regola. Grazie a Ventero per aver segnalato il problema.

Aggiornare:

Ho riscritto il codice da zero e ho trovato nuovi modi per accorciarlo ulteriormente.

Storia delle modifiche:

.,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
Questa soluzione non segue l'ultimo requisito:If wrong input is send to the program it will not print anything.
Ventero

@Ventero Right. Lo aggiusterò.
Cristian Lupascu,

63 - bello, siamo head2head :), vorrei poter capire golfscript;)
bua

Mi sento allo stesso modo su Q. Ottimo lavoro! ;-)
Cristian Lupascu,

+1 fantastico! disposto a rompere 50 ;-)?
bua,

10

C, 135 129 128 caratteri

Accidenti, tanti numeri magici diversi, ma non c'è modo di liberarsene.

Deve essere eseguito con l'ingresso come parametro del programma. Ora segue il requisito "input errato".

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);}

Spiegazione:

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&31parte utilizza il fatto che i codici ASCII per il carattere minuscolo / maiuscolo sono gli stessi se si osservano solo gli ultimi 5 bit e i restanti 5 bit sono nell'intervallo 1..26.

Versione senza requisito "input errato" (82 caratteri):

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

Qualche istruzione su come compilarlo? Ottengo un errore di segmentazione durante l'esecuzione.
arte

@manatwork sembra prendere l'input come parametro.
shiona,

Sì, in effetti, modificato per chiarire. Ad esempio, se il nome del programma è test, chiamalo come test cotest X.
schnaader il

Grazie capito. La mia C sembra essere più robusta di quanto pensassi.
arte

2
Stile definizione K & R può aiutare: main(a,b)char**b;{. Inoltre, b++si consentirebbe di sostituire *b[1]-> **be b[1][1]-> 1[*b].
ugoren,

7

Rubino, 72 71 61 caratteri

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

Questa versione ruby ​​utilizza un'espressione regolare per verificare l'input. Fortunatamente, il metodo della stringa Ruby succfa la maggior parte del lavoro per noi (incluso il wrap-around).

Edit: 61 caratteri con l'aiuto di Chron e Ventero .


Il mio è finito troppo simile al tuo per disturbare la pubblicazione separata. Stesso approccio, ma alcuni caratteri più brevi (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge,

2
E questo è 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- praticamente uguale al tuo che hai appena abusato $_e$/
Paul Prestidge il

2
@chron: utilizzando +=invece di +, è possibile rilasciare le parentesi $1?$/:' '.
Ventero,

@chron e Ventero: grazie. Aggiunto il tuo codice alla mia soluzione.
Howard,

6

Rubino: 127 113 (?) 92 caratteri

(Non riesco a trovare la regola sul punteggio di penalità quando si utilizza -p. Aggiunto 1 per ora. Se sbagliato, per favore correggimi.)

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

Esecuzione di esempio:

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

Ruby, 101 95

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

Provalo online


Non segue "Se l'input errato viene inviato al programma non stamperà nulla."
Matt,

potrebbe salvare alcuni caratteri con ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge il

@chron Grazie! Come potrei perdere questo ..
defhlt

6

GolfScript, 80 72 caratteri

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

Gran parte del codice sta testando un input valido e l'opzione "stampa niente". La logica effettiva è di soli 37 caratteri.

Casi di test online


6

q / k4 66 64 63 60 58 56 + 2 penalità

penalità per init variabile globale, l'algoritmo è 56 come di seguito:

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]
  • passare da if-else a se autorizzato a riorganizzare il codice e eliminare ";" alla fine

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • alla fine si è sbarazzato di questo controllo ridondante

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • stampa caratteri ricorsivamente invece un intero oggetto
  • ancora non riesco a scendere a confronto identità x in "." in due posti ... :(
  • alla fine è richiesto il punto e virgola, altrimenti la funzione di stampa (1 @) stamperebbe il suo valore di ritorno su stdout .... accidenti

64:

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

MODIFICARE:

Aggiunta una penalità di 2 per l'inizializzazione globale (x :), lo stesso se la funzione di avvolgimento tra parentesi (come suggerito da slackware)
non è sicura se anche la modifica dello spazio dei nomi debba essere punita ... quindi sono altri 3

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

Esempio:

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 Bel progresso. Proverò a trovare un altro modo per abbreviare il mio codice ora.
Cristian Lupascu,

Può davvero essere chiamato valido k se utilizza definizioni in qk? ;-) Inoltre, se lo avvolgi in una funzione, puoi saltare il passaggio di configurazione x: "a", ad esempio {$ [...]}
skeevey,

@slackwear hai ragione, ecco perché si chiama q / k4 ;-).
bua,

6

Perl, 131 127 117 112 106 104 102 98 96 92 91 91 93 93 71 66 65 64 58 caratteri

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

Uso:

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

Un personaggio è stato aggiunto al conteggio per l' nopzione.

Il taglio più grande è stato possibile solo per aver visto il comportamento dei ++personaggi nella risposta di Jon Purdy .


Puoi radere un paio di caratteri rimuovendo gli ultimi 2 punti
ardnew

@ardnew Grazie. :-)
Gareth

1
questa cosa è impressionante
bua,

@bua Grazie, sto ancora cercando di trovare i personaggi in modo che io possa prenderti e w0lf. :-)
Gareth,

s/a.$1/az/per salvarne altri 2. chop().($2?$/:$")-> chop,$2?$/:$"per altri 4
mob

5

Perl, 149 , 167

Aggiornare

  • Aggiunto controllo di sanità mentale.
  • Ha preso il consiglio ardnew sull'applicazione di separazione.
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

puoi sostituirlo $s=($d)?"\n":" ";con $s=$d?$/:$";e magari sbarazzartene del $stutto
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

Non sono un fan di questa limitazione, ma esiste e il programma non la segue: "Se al programma viene inviato un input errato, non verrà stampato nulla".
Matt,

Inoltre, sembra che tu stampi un carattere in più di quanto dovresti. L'output di esempio è di 25 caratteri.
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
Questa è una sfida al golf del codice , quindi non sono necessarie ottimizzazioni della velocità e dell'utilizzo delle risorse. Invece di archiviare $v[1]=='.'?"\n":" "il risultato in una variabile $ s, lascia che PHP lo calcoli ogni volta echonell'istruzione. In questo modo puoi risparmiare 6 personaggi.
arte

1
@manatwork Grazie, l'ho cambiato.
Lortabac,

4

Mathematica 158 159 204 199 183 167 165 162

Codice

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, _ -> ""} &

uso

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

uso


Il terzo caso di utilizzo è f ["H"] or f ["H."]?
Averroè,

Ho dovuto correggere la gestione di ".", Aggiungendo 50 caratteri al codice. Ma ora funziona secondo le istruzioni
DavidC

3

J 43

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

Esempi:

|: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 '['

Questa soluzione si è evoluta sul forum di programmazione J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Autori: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Spiegazione

Le frasi J vengono eseguite a partire da destra, passando il risultato in corso a sinistra mentre viene valutato. Dal momento che è interattivo, possiamo esaminare i pezzi della soluzione in modo isolato per comprenderli meglio.

La parte centrale genera l'alfabeto maiuscolo e minuscolo in Unicode:

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

Il verbo "u:" converte il suo argomento numerico destro in caratteri Unicode. L'argomento numerico viene generato dai valori ASCII per i caratteri maiuscoli e minuscoli aggiungendo i numeri per "A" e "a" ciascuno ai valori da 0 a 25 generati da "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 parte di destra,

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

cerca (i.) la posizione dell'argomento destro (]) a sinistra ([) - che è il vettore di lettere sopra - e ne rilascia uno (}.) uno in più (>:) di quel numero. Lo "" 0 "applica questa frase agli argomenti 0 (dimensionali).

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

La frase "25 {." Prende i primi 25 elementi del vettore a destra.

La penultima frase "1j1 #" a sinistra replica il suo argomento a destra in base al numero a sinistra. Un numero semplice esegue una replica semplice:

   2 # 'ABCD'
AABBCCDD

Tuttavia, un numero complesso - indicato dalla "j" tra le porzioni reali e immaginarie - inserisce un elemento di riempimento in base alla parte immaginaria. Qui indichiamo un elemento di riempimento per quello a destra di "j".

   2j1 # 'ABCD'
AA BB CC DD 

Come con la maggior parte delle primitive J, il verbo replicato (#) funziona su array numerici in modo analogo a come funziona su array di caratteri. Come mostrato qui,

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

vediamo che l'elemento di riempimento numerico predefinito è zero, mentre per i caratteri è il carattere spazio.

Infine, il token più a sinistra "|:" traspone il risultato dei verbi precedenti alla sua destra.

Spiegazione fornita da Devon McCormick. Grazie Devon.


+1 Soluzione e spiegazione davvero interessanti. Ho considerato di provarlo in J, ma non sono riuscito a trovare un buon modo (in breve) per verificare che l'input fosse valido. Penso che il mio sarebbe stato almeno il doppio di questo.
Gareth,

Grazie Gareth, se guardi le prime soluzioni nel link di discussione, vedrai che molti dei nostri inizi sono stati più lunghi. Una delle cose che abbiamo scoperto è stata la varietà di approcci che potremmo usare con J. cheers, bob
bob therriault il

3

brainfuck, 303

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

Attualmente non supporta la If wrong input is send to the program it will not print anythingparte e probabilmente può essere più breve. Ho intenzione di ripararlo più tardi. In questo momento il mio cervello è troppo maledetto per continuare.


2

C, 110

A volte stampa "spazi" tra le lettere, a volte no.

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);}}

Leggermente più leggibile:

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);}
}

corre:

$ ./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

Purtroppo un po 'prolisso ( String.fromCharCodee 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"

modifiche:

  1. Hai salvato un personaggio usando regex invece di substr.

  2. Hai salvato 6 caratteri usando mapinvece di for.

  3. Hai salvato 2 personaggi omettendo la nuova riga finale.


3
Bene, ma come hai sottolineato non soddisfa i requisiti per cui l'input non valido non produce output. Risolvilo e otterrai il mio voto.
Gareth,

non sembra funzionare per me su perl 5.14.2. inoltre non credo che sia richiesto il \ntuo finale print, che salverà un paio di caratteri
ardnew

@ardnew: l'ho scritto sul mio computer di lavoro, che ha 5.12.3. Ucciderà il \n, grazie.
Jon Purdy,

2

R, 219

Brutto, lungo ... funziona ancora.

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)}}

Uso:

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

2

C, 146 caratteri (terribile)

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)));}

Non ho molta esperienza in C, che probabilmente mostra ...>. <Avevo la sensazione che i caratteri come numeri interi sarebbero stati utili, ma in realtà non sembrava avere un impatto così grande come speravo ... Lascio qui il mio tentativo, sentiti libero di suggerire miglioramenti.

Versione non modificata:

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

Formattato per l'esecuzione dalla finestra immediata:

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

Suddiviso in singole righe (deve essere circondato da Subblocchi e necessita di un printmetodo diverso per funzionare in un modulo, allungando così il codice):

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 byte

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;}

Spiegazione:

Provalo online.

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

Parotite, 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["." !

Non un linguaggio così moderno;) Sono sicuro che rimanga un po 'di spazio di ottimizzazione ..

Spiegazione:

r t 

leggere l'input

i t?1A.1"."

controlla se t corrisponde all'input richiesto

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

base per loop attraverso l'alfabeto. Nota che la parotite sta valutando rigorosamente da sinistra a destra. Vero = 1, quindi ottieni 65 o 97 come risultato per p, # è l'operatore modulo

test:

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>

(avrai bisogno di un env di runtime mumps, cioè Caché per eseguire questo)

modifica: grassetto

modifica: aveva una soluzione sbagliata, risolto ora. Grazie a RTF e Averroees per averlo segnalato


il codice sembra essere lungo 79 caratteri, non 80
Cristian Lupascu,

sfortunatamente il primo spazio non è opzionale, quindi ho pensato di
contarlo

I casi di test non terminano con la lettera precedente di quella passata come parametro, vero?
Averroè,

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

Versione commentata:

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

Ecco il mio primo tentativo con APL.

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

se posso usare una singola variabile globale, A←2 26⍴6↓26⌽⎕UCS 65+⍳58posso abbreviare quanto sopra fino a quanto segue:

{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));}

dissezione

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. 

Funziona] $ ./test 5

Funziona] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Funziona] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Opere] $ ./test g hijklmnopqrstuvwxyzabcdef

Funziona] $ ./test [

Funziona] $ ./test a bcdefghijklmnopqrstuvwxyz

Funziona] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Grazie per un po 'di spunti di riflessione.


Non stai aggiungendo nuove righe se un '.' viene data. Inoltre, non dovresti produrre nulla se l'input non lo è [A-Za-z]\.?, se ho capito bene la domanda.
marinus,

# 1. Oh! sono stato assorto nel rendere il codice breve .. # 2. vedere l'output di 'test [' non stampa nulla. @marinus
essbeev,

0

Perl, 226 caratteri

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]));

Puoi formattare il testo affinché appaia come un blocco di codice. Leggi la guida qui per formattare i tuoi post. Inoltre, è possibile salvare alcuni caratteri utilizzando i nomi delle variabili a carattere singolo.
Gareth,

1
Un input non valido non dovrebbe stampare nulla, quindi la tua dieaffermazione può essere ridotta, risparmiando un sacco ...
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 compresso

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 dimenticare di aggiungere una spiegazione alla tua risposta.
Giustino,

Questo programma non prova nemmeno a rispettare le regole. 1: Se la lettera è maiuscola, è necessario visualizzare l'alfabeto maiuscolo. 2: L'alfabeto stampato deve terminare con la lettera precedente di quella inserita. 3: Se viene aggiunto un parametro addizionale addizionale all'input (un semplice punto), l'alfabeto deve essere stampato una lettera in ogni riga. Altrimenti, l'alfabeto dovrebbe essere stampato sulla stessa riga, separato da uno spazio semplice. 4: Se al programma viene inviato un input errato, non verrà stampato nulla. Questa è una mancata 4 su 4.
RobIII,

^ A parte questo ti esorto a dare un'occhiata ai miei precedenti commenti qui . È possibile sostituire charcon vare rasatura 1 punto del tuo punteggio, perdere la .ToCharArray()(una string è un char-array si può già iterare sopra!), Perdere il string[] adato che non si tratta di argomenti da riga di comando, perdere lo spazio dei nomi, la vostra costante 'c' dovrebbe essere letto dall'input della console, perdere la stringa alfabetica e usare ASCII invece ecc. È fantastico suonare, ma per favore prova a fare uno sforzo decente; la maggior parte dei tuoi contributi sembra essere solo una traina.
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));}

Ringraziamo lo schnaader per il trucco d + 6 e 31.

http://ideone.com/ts1Gs9


0

Bash: 110 byte

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

In termini di spiegazione, è piuttosto semplice, senza trucchi magici - questo è solo qualcosa per cui bash è intrinsecamente adatto. In termini di bit non ovvi:

  • {a..z}è un trucco molto poco utilizzato in bash - si espande a a b c d.... Puoi fare lo stesso per generare sequenze numeriche.
  • Bash può eseguire la corrispondenza regex, [[ $1 =~ [a-z] ]]esegue una corrispondenza regex rispetto al primo argomento del programma per i caratteri dalla a alla z. Allo stesso modo per AZ. Hai bisogno di doppie parentesi quadre per esso, tuttavia, [non puoi farlo.
  • ${1:1:1} ottiene una sottostringa di $ 1 (il primo argomento), un carattere in, un carattere lungo - ovvero, restituisce il secondo carattere della stringa, quello che ci aspettiamo di essere . .
  • sed 's/ /\n/g'regex semplice: cerca e sostituisce gli spazi con newline. Se .è il secondo carattere della stringa, reindirizziamo l'input a questo, o altrimenti ...
  • cat è il trucco finale qui - se non vogliamo sostituire gli spazi con le nuove linee, diamo invece da mangiare a stdin invece a cat che semplicemente lo restituisce.

Non dimenticare di aggiungere una spiegazione.
Giustino,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.