Benutzerdefiniertes Alphabet drucken

20

Die Herausforderung

Zeigen Sie das Alphabet eines bestimmten Buchstabens an, der von der Konsoleneingabe gelesen wurde. Wenn der Buchstabe in Großbuchstaben geschrieben ist, müssen Sie das Alphabet in Großbuchstaben anzeigen. Das gedruckte Alphabet muss mit dem vorangestellten Buchstaben des eingefügten Buchstabens enden. Wenn der Eingabe ein zusätzlicher Parameter (ein einfacher Punkt .) hinzugefügt wird, sollte das Alphabet mit einem Buchstaben in jeder Zeile gedruckt werden. Andernfalls sollte das Alphabet in derselben Zeile gedruckt und durch ein einfaches Leerzeichen getrennt werden. Wenn eine falsche Eingabe an das Programm gesendet wird, wird nichts gedruckt.

Eingabebeispiele:

Eingang:

c

Programmausgabe:

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

Eingang

H.

Programmausgabe:

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
Averroes
quelle
Sage Notebook wird auf der "Konsolenebene" ausgeführt. Gibt die erforderliche "Konsoleneingabe" in diesem Fall nur die Eingabe in eine Arbeitsblattzelle ein?
Res
kürzester Code gewinnt?
Mittwoch,
@ardnew Ja, der kürzeste Code gewinnt.
Averroes
@res Ich denke, dass, während Sie die Eingabelesung irgendwie codieren müssen, es aus der Regelperspektive fair sein kann.
Averroes
6
@Averroes Die Strafe für die Verwendung von GolfScript ist die Zeit, die zum Erlernen einer Sprache benötigt wird, die außerhalb dieser Art von Wettbewerb keinen wirklichen Nutzen hat. Ich denke nicht, dass es sehr produktiv sein wird, Leute dafür zu bestrafen, dass sie das richtige Werkzeug für den Job verwenden.
Gareth

Antworten:

12

GolfScript 48 75 73 70 67 66 63 57 53

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

Online-Demos:

Aktualisieren:

Nun ist auch die letzte Regel implementiert. Vielen Dank an Ventero für den Hinweis.

Aktualisieren:

Ich habe den Code von Grund auf neu geschrieben und neue Wege gefunden, ihn noch weiter zu verkürzen.

Änderungsverlauf:

.,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]=* 
Cristian Lupascu
quelle
2
Diese Lösung entspricht nicht der letzten Anforderung:If wrong input is send to the program it will not print anything.
Ventero
@Ventero Richtig. Ich werde das reparieren.
Cristian Lupascu
63 - schön, wir sind head2head :), ich wünschte, ich könnte golfscript verstehen;)
bua
Mir geht es genauso mit Q. Great job! ;-)
Cristian Lupascu
+1 Super! bereit 50 zu brechen ;-)?
Bua
10

C 135 129 128 Zeichen

Verdammt, so viele verschiedene magische Zahlen, aber keine Möglichkeit, sie loszuwerden.

Muss mit der Eingabe als Programmparameter ausgeführt werden. Nun folgt die Anforderung "Falscheingabe".

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

Erläuterung:

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

Der **b+6&31Teil verwendet die Tatsache, dass die ASCII-Codes für Klein- / Großbuchstaben gleich sind, wenn nur die letzten 5 Bits betrachtet werden und die verbleibenden 5 Bits im Bereich 1..26 liegen.

Version ohne "Falscheingabe" -Anforderung (82 Zeichen):

main(a,b)char**b;{for(b++;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,1[*b]?10:32);}
schnaader
quelle
Irgendeine Anweisung, wie man es kompiliert? Ich bekomme einen Segmentierungsfehler beim Laufen.
Handarbeit
@manatwork scheint die Eingabe als Parameter zu nehmen.
Shiona
Ja, in der Tat bearbeitet, um zu klären. Wenn der Programmname beispielsweise " ortesttest ctest X.
schnaader"
Danke, verstanden. Mein C scheint rostiger zu sein, als ich dachte.
Handarbeit
2
K & R kann Definition Stil helfen: main(a,b)char**b;{. Auch b++würde man Sie ersetzen lassen *b[1]-> **bund b[1][1]-> 1[*b].
Ugoren
7

Ruby, 72 71 61 Zeichen

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

Diese Ruby-Version verwendet einen regulären Ausdruck, um die Eingabe zu überprüfen. Glücklicherweise succerledigt die Ruby-String-Methode den größten Teil der Arbeit für uns (einschließlich des Wraparounds).

Edit: 61 Zeichen mit Hilfe von Chron und Ventero .

Howard
quelle
Meins war viel zu ähnlich wie deins, als dass man sich die Mühe machen müsste, es separat zu veröffentlichen. Gleicher Ansatz, aber einige Zeichen kürzer (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge
2
Und das ist 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- im Grunde das gleiche wie bei Ihnen nur zu missbrauchen $_und$/
Paul Prestidge
2
@chron: Mit +=anstelle von +können Sie die Klammern herumwerfen $1?$/:' '.
Ventero
@chron und Ventero: Danke. Fügte Ihren Code meiner Lösung hinzu.
Howard
6

Rubin: 127 113 92 (?) Zeichen

(Ich kann die Regel zur Strafpunktzahl bei der Verwendung nicht finden -p. Momentan wurde 1 hinzugefügt. Falls falsch, korrigieren Sie mich bitte.)

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

Probelauf:

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
Mann bei der Arbeit
quelle
6

Rubin, 101 95

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

Probieren Sie es online aus

defhlt
quelle
Folgt nicht "Wenn eine falsche Eingabe an das Programm gesendet wird, wird nichts gedruckt."
Matt
könnte ein paar Zeichen sparen mit ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge
@chron Danke! Wie könnte ich das verpassen ..
defhlt
6

GolfScript, 80 bis 72 Zeichen

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

Ein Großteil des Codes prüft auf gültige Eingaben und die Option "Nichts drucken". Die tatsächliche Logik ist nur 37 Zeichen.

Testfälle online

Howard
quelle
6

q / k4 66 64 63 60 58 56 + 2 Strafe

Strafe für die globale Variable init, Algorithmus ist 56 wie folgt:

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]
  • Ändern Sie von if-else zu if, um Code neu zu organisieren und ";" Am Ende

60

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • wurde schließlich diese redundante Prüfung los

63

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • gib rekursiv Zeichen stattdessen ein ganzes Objekt aus
  • kann Identitätsvergleich x in "." immer noch nicht beenden an zwei Orten ... :(
  • ein Semikolon am Ende ist erforderlich, andernfalls würde die Druckfunktion (1 @) den Rückgabewert an stdout ausgeben .... verdammt

64

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

BEARBEITEN:

Für die globale Initialisierung (x :) wurde eine Strafe von 2 hinzugefügt. Dasselbe gilt, wenn die Umbruchfunktion in eckige Klammern gesetzt wird (wie von Slackware empfohlen) und
nicht sicher ist, ob das Ändern des Namespace ebenfalls bestraft werden soll. Dann sind es noch 3

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

Beispiel:

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:...
bua
quelle
+1 Schöne Fortschritte. Ich werde jetzt versuchen, einen anderen Weg zu finden, um meinen Code zu verkürzen.
Cristian Lupascu
Kann man es wirklich als gültiges k bezeichnen, wenn es Definitionen in qk verwendet? ;-) Wenn Sie eine Funktion
einfügen
@slackwear du hast recht, deshalb heißt es q / k4 ;-).
Bua
6

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

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

Verwendung:

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

Ein Zeichen wurde zur Zählung für die hinzugefügt n Option .

Der größte Einschnitt war nur möglich, weil Jon Purdys Antwort das Verhalten von ++Charakteren enthielt .

Gareth
quelle
Sie können ein paar Zeichen abschneiden, indem Sie die letzten 2 Semikolons entfernen
spätestens
@ardnew Danke. :-)
Gareth
1
Dieses Ding ist beeindruckend
bua
@bua Danke, ich versuche immer noch, die Charaktere zu finden, damit ich dich und w0lf fangen kann. :-)
Gareth
s/a.$1/az/um 2 weitere zu sparen. chop().($2?$/:$")-> chop,$2?$/:$"für 4 weitere
Mob
5

Perl, 149 , 167

Aktualisieren

  • Sanity Check hinzugefügt.
  • Hat einen neuen Vorschlag zur Separator-Anwendung gemacht.
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
Thor
quelle
Sie können ersetzen $s=($d)?"\n":" ";mit $s=$d?$/:$";und vielleicht auch nur loswerden $sinsgesamt
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
grc
quelle
Ich bin kein Fan dieser Einschränkung, aber sie existiert und Ihr Programm folgt ihr nicht: "Wenn falsche Eingaben an das Programm gesendet werden, wird nichts gedruckt."
Matt
Es sieht auch so aus, als würden Sie ein Zeichen mehr drucken, als Sie sollten. Die Beispielausgabe beträgt 25 Zeichen.
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":" ";
lortabac
quelle
1
Dies ist eine Code-Golf- Herausforderung, sodass keine Optimierung der Geschwindigkeit und der Ressourcennutzung erforderlich ist. Anstatt $v[1]=='.'?"\n":" "das Ergebnis in der Variablen $ s zu speichern , berechnet PHP es jedes Mal in der echoAnweisung. Auf diese Weise können Sie 6 Zeichen sparen.
Manatwork
1
@manatwork Danke, ich habe es geändert.
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, _ -> ""} &

Verwendung

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

Verwendung

DavidC
quelle
Der dritte Anwendungsfall ist f ["H"] oder f ["H"]?
Averroes
Ich musste die Behandlung von "." Korrigieren und dem Code 50 Zeichen hinzufügen. Aber es funktioniert jetzt nach den Anweisungen
DavidC
3

J 43

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

Beispiele:

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

Diese Lösung wurde im J-Programmierforum entwickelt: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Autoren: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Erläuterung

J-Phrasen werden von rechts beginnend ausgeführt und geben das laufende Ergebnis bei der Auswertung nach links weiter. Da es interaktiv ist, können wir Teile der Lösung isoliert betrachten, um sie besser zu verstehen.

Der mittlere Teil generiert das Groß- und Kleinbuchstaben in Unicode:

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

Das Verb "u:" konvertiert sein numerisches Argument nach rechts in Unicode-Zeichen. Das numerische Argument wird aus den ASCII-Werten für die Groß- und Kleinbuchstaben generiert, indem die Zahlen für "A" und "a" zu den von "i.26" generierten Werten von 0 bis 25 addiert werden:

   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

Der rechte Teil,

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

Nachschlagen (i.) der Position des rechten Arguments (]) im linken ([) - das ist der Vektor der darüber liegenden Buchstaben - und Ablegen (}.) eines weiteren (>:) als diese Zahl. Die "0" wendet diesen Ausdruck auf 0-dimensionale (skalare) Argumente an.

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

Die Phrase "25 {." Nimmt die ersten 25 Elemente des Vektors auf der rechten Seite.

Der vorletzte Ausdruck "1j1 #" auf der linken Seite wiederholt sein rechtes Argument entsprechend der Zahl auf der linken Seite. Eine einfache Zahl führt eine einfache Replikation durch:

   2 # 'ABCD'
AABBCCDD

Eine komplexe Zahl - angegeben durch das "j" zwischen Real- und Imaginärteil - fügt jedoch ein Füllelement entsprechend dem Imaginärteil ein. Hier geben wir ein Füllelement nach dem anderen rechts vom "j" an.

   2j1 # 'ABCD'
AA BB CC DD 

Wie bei den meisten J-Primitiven funktioniert das Replikatverb (#) bei numerischen Arrays auf analoge Weise wie bei Zeichenarrays. Wie hier gezeigt,

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

Wir sehen, dass das standardmäßige numerische Füllelement Null ist, während es bei Zeichen das Leerzeichen ist.

Schließlich transponiert das am weitesten links stehende Token "|:" das Ergebnis der vorhergehenden Verben nach rechts.

Erklärung von Devon McCormick. Vielen Dank, Devon.

Bob Therriault
quelle
+1 Wirklich schöne Lösung und Erklärung. Ich dachte darüber nach, es in J zu versuchen, konnte aber keinen guten Weg (einen kurzen Weg) finden, um zu überprüfen, ob die Eingabe gültig war. Ich denke, meine wäre mindestens doppelt so lang gewesen.
Gareth
Vielen Dank, Gareth. Wenn Sie sich die ersten Lösungen im Diskussionslink ansehen, werden Sie feststellen, dass viele unserer Starts länger gedauert haben. Eines der netten Dinge, die wir fanden, war die Vielfalt der Ansätze, die wir mit J. Cheers, Bob
Bob Therriault,
3

Gehirnfick, 303

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

Momentan unterstützt es das If wrong input is send to the program it will not print anythingTeil nicht und es kann wahrscheinlich kürzer sein. Ich plane es später zu reparieren. Im Moment ist mein Gehirn zu beschäftigt, um fortzufahren.

Pappschachtel
quelle
2

C 110

Manchmal werden "Leerzeichen" zwischen Buchstaben gedruckt, manchmal nicht.

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

Etwas besser lesbar:

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

Läuft:

$ ./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
Shiona
quelle
2

JavaScript, 137

Leider etwas wortreich ( String.fromCharCodeund 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":" ");
pimvdb
quelle
2

Perl, 77 76 70 68

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

Bearbeitungen:

  1. Speichert einen Charakter mit Regex anstelle von substr.

  2. Gespeichert 6 Zeichen mit mapanstelle von for.

  3. 2 Zeichen durch Weglassen der letzten Zeile gespeichert.

Jon Purdy
quelle
3
Schön, aber wie Sie bereits betont haben, erfüllt es nicht die Anforderung, dass ungültige Eingaben keine Ausgabe liefern. Repariere das und du bekommst meine Gegenstimme.
Gareth
scheint nicht für mich auf Perl 5.14.2 zu funktionieren. Ich glaube auch nicht, dass das \nin Ihrem Finale printerforderlich ist, was ein paar Zeichen
erspart
@ardnew: Ich habe es auf meinem Arbeitscomputer geschrieben, der 5.12.3 hat. Will das töten \n, danke.
Jon Purdy
2

R 219

Hässlich, lange ... funktioniert immer noch.

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

Verwendung:

f("a")
f("c.")
f("H")
f("z")
f("Z.")
f("seven")
Paolo
quelle
2

C, 146 Zeichen (schrecklich)

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

Ich bin nicht sehr erfahren in C, was wahrscheinlich zeigt ...>. <Ich hatte das Gefühl, dass Zeichen als ganze Zahlen hilfreich wären, aber es schien nicht so wirkungsvoll zu sein, wie ich es mir erhofft hatte ... Ich werde meinen Versuch jedoch hier lassen, zögern Sie nicht, Verbesserungen vorzuschlagen.

Unbegrenzte Version:

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
  );
}
FireFly
quelle
2

VBA 225

Formatiert für die Ausführung über das unmittelbare Fenster:

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

Zerlegt in einzelne Zeilen (muss von SubBlock umgeben sein und braucht eine andereprint Methode, um in einem Modul zu arbeiten, wodurch der Code länger wird):

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
Gaffi
quelle
2

Java 8, 127 Bytes

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

Erläuterung:

Probieren Sie es online aus.

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
Kevin Cruijssen
quelle
1

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

Keine so moderne Sprache;) Ich bin mir sicher, dass noch ein bisschen Optimierungsraum übrig ist.

Erläuterung:

r t 

Eingabe lesen

i t?1A.1"."

Überprüfen Sie, ob t mit der erforderlichen Eingabe übereinstimmt

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

basic for blättert durch das alphabet. Beachten Sie, dass Mumps strikt von links nach rechts bewertet. True = 1, Sie erhalten also 65 oder 97 als Ergebnis für p, # ist der Modulo-Operator

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>

(Sie benötigen eine Mumps-Laufzeitumgebung, dh Caché, um dies auszuführen.)

Bearbeiten: Fettgedruckte Überschrift

edit: hatte eine falsche lösung, jetzt behoben. Vielen Dank an rtfs und Averroees für den Hinweis

Kazamatzuri
quelle
Der Code scheint 79 Zeichen lang zu sein, nicht 80
Cristian Lupascu
Leider ist das erste Leerzeichen nicht optional, so dass ich dachte, ich muss es
einzählen
Der Testfall endet nicht mit dem vorangestellten Buchstaben des als Parameter übergebenen, oder?
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

Kommentierte Version:

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

ajax333221
quelle
0

Hier ist mein erster Versuch mit APL.

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

Wenn ich eine einzelne globale Variable verwenden A←2 26⍴6↓26⌽⎕UCS 65+⍳58kann, kann ich das Obige auf Folgendes kürzen:

{1 1≡(2⌈⍴⍵)⍴⍵∊'.',,A:⊃(~=/2⍴⍵)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍵)⌽X←(⎕A∊⍨⊃⍵)⌷A)}⍞
Aaron W. Hsu
quelle
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;
}
Carl
quelle
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));}

Präparation

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. 

Funktioniert] $ ./test 5

Works] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Works] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Works] $ ./test g hijklmnopqrstuvwxyzabcdef

Works] $ ./test [

Works] $ ./test a bcdefghijklmnopqrstuvwxyz

Funktioniert] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Vielen Dank für ein paar Denkanstöße.

Essbeev
quelle
Sie fügen keine Zeilenumbrüche hinzu, wenn ein '.' gegeben ist. Außerdem sollten Sie nichts ausgeben, wenn die Eingabe nicht [A-Za-z]\.?stimmt, wenn ich die Frage richtig verstanden habe.
Marinus
# 1. Oh! Ich war vertieft darin, Code kurz zu machen. # 2. siehe die Ausgabe von 'test [' es gibt nichts aus. @marinus
essbeev
0

Perl, 226 Zeichen

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]));
AnfängerProg
quelle
Sie können Ihren Text so formatieren, dass er als Codeblock angezeigt wird. Lesen Sie die Anleitung hier zu formatieren Sie Ihre Beiträge. Sie können auch einige Zeichen speichern, indem Sie einzelne Zeichenvariablennamen verwenden.
Gareth
1
Eine ungültige Eingabe sollte nichts ausgeben, damit Ihre dieAussage reduziert werden kann und ein Haufen gespart wird ...
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);}}}

Unkomprimiert

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);
        }
    }
}
PauloHDSousa
quelle
Vergessen Sie nicht, Ihrer Antwort eine Erklärung hinzuzufügen.
Justin
Dieses Programm versucht bei weitem nicht, sich an die Regeln zu halten. 1: Wenn der Buchstabe in Großbuchstaben geschrieben ist, muss das Alphabet in Großbuchstaben angezeigt werden. 2: Das gedruckte Alphabet muss mit dem vorangestellten Buchstaben des eingefügten Buchstabens enden. 3: Wenn der Eingabe ein zusätzlicher Parameter (ein einfacher Punkt) hinzugefügt wird, sollte das Alphabet in jeder Zeile einen Buchstaben enthalten. Andernfalls sollte das Alphabet in der gleichen Zeile gedruckt und durch ein einfaches Leerzeichen getrennt werden. 4: Wenn eine falsche Eingabe an das Programm gesendet wird, wird nichts gedruckt. Dies ist ein 4-von-4-Fehler.
RobIII
^ Abgesehen davon bitte ich Sie, sich meine früheren Kommentare hier anzuschauen . Sie können ersetzen charmit varund rasieren 1 Punkt die Punktzahl, verlieren die .ToCharArray()(a string ist ein char-Array können Sie bereits über Iterierte!), Verlieren die string[] ada Sie nicht mit Kommandozeilenargumente, verlieren den Namespace, Ihre Konstante ‚c‘ zu tun sollte von der Konsoleneingabe gelesen werden, die alphabetische Zeichenfolge verlieren und stattdessen ASCII verwenden usw. Es ist toll, dass Sie spielen, aber versuchen Sie bitte, sich anständig anzustrengen; Die meisten Einsendungen scheinen nur Trolling zu sein.
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));}

Dank an schnaader für den Trick d + 6 & 31.

http://ideone.com/ts1Gs9

mattnewport
quelle
0

Bash: 110 Bytes

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

In Bezug auf die Erklärung ist es ziemlich einfach, keine Zaubertricks - dies ist nur etwas, wofür bash an sich gut geeignet ist. In Bezug auf die nicht offensichtlichen Teile:

  • {a..z}ist ein sehr wenig benutzter Trick in der Bash - es erweitert sich zu a b c d.... Sie können das Gleiche tun, um numerische Sequenzen zu generieren.
  • Bash kann Regex-Übereinstimmungen durchführen, [[ $1 =~ [a-z] ]]führt eine Regex-Übereinstimmung mit dem ersten Programmargument für Zeichen von a bis z aus. Ebenso für AZ. Sie benötigen doppelte eckige Klammern, [können es aber nicht.
  • ${1:1:1}Ruft einen Teilstring von $ 1 (das erste Argument) ab, ein Zeichen in, ein Zeichen lang - das heißt, es wird das zweite Zeichen des Strings zurückgegeben, wie wir es erwarten ..
  • sed 's/ /\n/g'einfacher regulärer Ausdruck: Sucht und ersetzt Leerzeichen durch Zeilenumbrüche. Wenn .es sich um das zweite Zeichen der Zeichenfolge handelt, leiten wir Eingaben an diese weiter oder auf andere Weise ...
  • cat ist der letzte Trick hier - wenn wir Leerzeichen nicht durch Zeilenumbrüche ersetzen wollen, geben wir stattdessen stdin an cat, was es einfach wieder ausgibt.
Aufruhr
quelle
Vergessen Sie nicht, eine Erklärung hinzuzufügen.
Justin