Wydrukuj własny alfabet

20

Wyzwanie

Wyświetl alfabet z danej litery odczytanej z danych wejściowych konsoli. Jeśli litera jest pisana wielkimi literami, musisz wyświetlać wielkie litery alfabetu. Wydrukowany alfabet musi kończyć się literą poprzedzającą wstawioną. Jeżeli do parametru dodany zostanie parametr dodatkowy (prosta kropka .), alfabet powinien być wydrukowany jedną literę w każdym wierszu. W przeciwnym razie alfabet powinien być wydrukowany w tym samym wierszu, oddzielony prostą spacją. Jeśli do programu zostanie wysłane nieprawidłowe wejście, nic nie wydrukuje.

Przykłady danych wejściowych:

Wejście:

c

Wyjście programu:

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

Wejście

H.

Wyjście programu:

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
źródło
Sage Notebook działa na „poziomie konsoli”, więc czy wymagane „wejście konsoli” w tym przypadku polega tylko na wpisaniu danych wejściowych w komórce arkusza roboczego?
res
najkrótszy kod wygrywa?
nowy
@ardnew Tak, wygrywa najkrótszy kod.
Averroes
@res Myślę, że chociaż trzeba w jakiś sposób zakodować odczyt wejściowy, z punktu widzenia reguł może być sprawiedliwy.
Averroes
6
@Averroes Karą za używanie GolfScript jest czas potrzebny na naukę języka, który nie ma realnego zastosowania poza tego rodzaju konkurencją. Nie sądzę, aby karanie ludzi za użycie odpowiedniego narzędzia do pracy będzie bardzo produktywne.
Gareth

Odpowiedzi:

12

GolfScript 48 75 73 70 67 66 63 57 53

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

Dema online:

Aktualizacja:

Teraz zaimplementowana jest również ostatnia reguła. Dzięki Ventero za zwrócenie uwagi na problem.

Aktualizacja:

Przepisałem kod od zera i znalazłem nowe sposoby jego dalszego skrócenia.

Historia modyfikacji:

.,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
źródło
2
To rozwiązanie nie spełnia ostatniego wymogu:If wrong input is send to the program it will not print anything.
Ventero
@Ventero Right. Naprawię to.
Cristian Lupascu
63 - fajnie, jesteśmy head2head :), chciałbym zrozumieć golfscript;)
bua
To samo dotyczy Q. Świetna robota! ;-)
Cristian Lupascu
+1 świetny! chętny do złamania 50 ;-)?
bua
10

C, 135 129 128 znaków

Cholera, tyle różnych magicznych liczb, ale nie ma sposobu, aby się ich pozbyć.

Musi być uruchamiany z wejściem jako parametrem programu. Teraz podąża za „błędnym wejściem”.

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

Wyjaśnienie:

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

**b+6&31Część wykorzystuje fakt, że kody ASCII dla małych liter / znaków wielkimi są takie same, jeśli tylko patrząc na ostatnie 5 bitów, a pozostałe 5 bitów są w zakresie 1..26.

Wersja bez wymogu „błędnego wprowadzenia” (82 znaków):

main(a,b)char**b;{for(b++;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,1[*b]?10:32);}
schnaader
źródło
Jakaś instrukcja, jak to skompilować? Podczas działania pojawia się błąd segmentacji.
manatwork
@manatwork wydaje się przyjmować dane wejściowe jako parametr.
shiona,
Tak, zredagowane w celu wyjaśnienia. Np. Jeśli nazwa programu to test, nazwij go jak test clubtest X.
schnaader
Dzięki, rozumiem. Moje C wydaje się bardziej zardzewiałe, niż myślałem.
manatwork
2
K & R styl definicja może pomóc: main(a,b)char**b;{. Ponadto b++można zastąpić *b[1]-> **bi b[1][1]-> 1[*b].
ugoren
7

Ruby, 72 71 61 znaków

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

Ta wersja ruby ​​używa wyrażenia regularnego do weryfikacji danych wejściowych. Na szczęście metoda ciągu Ruby succwykonuje dla nas większość pracy (w tym zawijanie).

Edytuj: 61 znaków przy pomocy Chrona i Ventero .

Howard
źródło
Mój okazał się zbyt podobny do twojego, aby zawracać sobie głowę publikowaniem osobno. To samo podejście, ale kilka znaków krótszych (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge
2
I to jest 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- w zasadzie to samo, co wasze, tylko znęcanie się $_i$/
Paul Prestidge
2
@chron: Używając +=zamiast +, możesz upuścić nawiasy $1?$/:' '.
Ventero
@chron i Ventero: Dziękuję. Dodano twój kod do mojego rozwiązania.
Howard,
6

Rubin: 127 113 92 (?) Znaków

(Nie mogę znaleźć reguły dotyczącej wyniku karnego przy użyciu -p. Na razie dodano 1. Jeśli nie, popraw mnie.)

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
6

Ruby, 101 95

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

Wypróbuj online

defhlt
źródło
Nie następuje „Jeśli do programu zostanie wysłane nieprawidłowe wejście, nic nie wydrukuje”.
Matt
mógłby zapisać kilka znaków za pomocą ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge
@chron Dzięki! Jak mogłem tego przegapić ...
defhlt
6

GolfScript, 80 72 znaków

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

Wiele kodu testuje poprawność danych wejściowych i opcję „nic nie drukuj”. Rzeczywista logika składa się tylko z 37 znaków.

Przypadki testowe online

Howard
źródło
6

k / k4 66 64 63 60 58 56 + 2 kary

kara za globalną init init, algorytm wynosi 56 jak poniżej:

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]
  • zmień z if-else na if, jeśli pozwolisz na reorganizację kodu i pozbądź się „;” na końcu

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • w końcu pozbyłem się tego zbędnego czeku

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • wypisz rekurencyjnie znaki zamiast całego obiektu
  • wciąż nie mogę wyjść ze porównania tożsamości x w „.” w dwóch miejscach ... :(
  • średnik na końcu jest wymagany, w przeciwnym razie funkcja print (1 @) wypisze swoją wartość zwracaną na standardowe wyjście ... cholera

64:

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

EDYTOWAĆ:

Dodano karę 2 za globalną inicjalizację (x :), to samo, jeśli funkcja zawijania w nawiasy (jak sugeruje Slackware)
nie jest pewna, czy zmiana przestrzeni nazw również powinna zostać ukarana ... to kolejne 3

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

Przykład:

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
źródło
+1 niezły postęp. Spróbuję teraz znaleźć inny sposób na skrócenie mojego kodu.
Cristian Lupascu,
Czy naprawdę można go nazwać prawidłowym k, jeśli używa definicji w qk? ;-) Ponadto, jeśli owiniesz go w funkcję, możesz pominąć krok konfiguracji x: "a", np. {$ [...]}
skeevey
@ slackwear masz rację, dlatego nazywa się q / k4 ;-).
bua
6

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

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

Stosowanie:

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

Dodano jedną postać do liczby nopcji.

Największe cięcie było możliwe tylko dzięki obserwacji zachowania ++postaci w odpowiedzi Jona Purdy'ego .

Gareth
źródło
Możesz ogolić kilka znaków usuwając ostatnie 2 średniki
nowy
@ardnew Thanks. :-)
Gareth
1
ta rzecz robi wrażenie
bua
@bua Dzięki, wciąż próbuję znaleźć postacie, aby móc cię złapać i w0lf. :-)
Gareth
s/a.$1/az/aby zaoszczędzić jeszcze 2. chop().($2?$/:$")-> chop,$2?$/:$"za 4 kolejne
mob
5

Perl, 149 , 167

Aktualizacja

  • Dodano kontrolę poczytalności.
  • Otrzymałem nową sugestię dotyczącą aplikacji separatora.
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
źródło
można zastąpić $s=($d)?"\n":" ";z $s=$d?$/:$";, a może po prostu pozbyć się $scałkowicie
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
źródło
Nie jestem fanem tego ograniczenia, ale ono istnieje, a program nie przestrzega go: „Jeśli do programu zostanie wysłane nieprawidłowe wejście, nic nie wydrukuje”.
Matt
Wygląda też na to, że wydrukujesz jedną postać więcej niż powinieneś. Przykładowy wynik to 25 znaków.
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":" ";
lortabak
źródło
1
Jest to wyzwanie dla golfisty , więc optymalizacja prędkości i wykorzystania zasobów nie jest potrzebna. Zamiast przechowywać $v[1]=='.'?"\n":" "wynik w zmiennej $ s, pozwól PHP obliczyć go za każdym razem w echoinstrukcji. W ten sposób możesz oszczędzić 6 znaków.
manatwork
1
@manatwork Dziękuję, zmieniłem to.
lortabac,
4

Mathematica 158 159 204 199 183 167 165 162

Kod

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

Stosowanie

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

stosowanie

DavidC
źródło
Trzecim przypadkiem użycia jest f [„H”] lub f [„H.”]?
Averroes
Musiałem naprawić obsługę „.”, Dodając 50 znaków do kodu. Ale teraz działa zgodnie z instrukcjami
DavidC
3

J 43

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

Przykłady:

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

To rozwiązanie ewoluowało na forum programowania J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Autorzy: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Wyjaśnienie

Wyrażenia J są wykonywane od prawej, przekazując bieżący wynik w lewo, gdy jest on oceniany. Ponieważ jest interaktywny, możemy spojrzeć na fragmenty rozwiązania w izolacji, aby lepiej je zrozumieć.

Środkowa część generuje wielkie i małe litery alfabetu w Unicode:

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

Czasownik „u:” konwertuje swój prawy argument liczbowy na znaki Unicode. Argument numeryczny jest generowany na podstawie wartości ASCII dla wielkich i małych liter poprzez dodanie liczb dla „A” i „a” do wartości od 0 do 25 generowanych przez „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

Część po prawej,

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

sprawdza (i.) pozycję prawego argumentu (]) w lewym ([) - który jest wektorem liter powyżej - i upuszcza (}.) jeszcze jeden (>:) niż ta liczba. „0” stosuje to wyrażenie do argumentów 0-wymiarowych (skalarnych).

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

Fraza „25 {.” Bierze pierwsze 25 elementów wektora po prawej stronie.

Przedostatnia fraza „1j1 #” po lewej stronie replikuje swój prawy argument zgodnie z liczbą po lewej. Prosta liczba wykonuje prostą replikację:

   2 # 'ABCD'
AABBCCDD

Jednak liczba zespolona - oznaczona literą „j” między częścią rzeczywistą a urojoną - wstawia element wypełniający zgodnie z częścią urojoną. W tym miejscu wskazujemy jeden element wypełniający jeden po prawej stronie „j”.

   2j1 # 'ABCD'
AA BB CC DD 

Podobnie jak w przypadku większości prymitywów J, czasownik replikacyjny (#) działa na tablicach numerycznych w sposób analityczny, jak działa na tablicach znaków. Jak pokazano tutaj,

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

widzimy, że domyślnym numerycznym elementem wypełniającym jest zero, podczas gdy dla znaków jest to znak spacji.

Wreszcie lewy token „|:” transponuje wynik poprzednich czasowników na prawo.

Wyjaśnienie dostarczone przez Devona McCormicka. Dziękuję Devon.

Bob Therriault
źródło
+1 Naprawdę fajne rozwiązanie i wyjaśnienie. Rozważałem wypróbowanie go w J, ale nie mogłem znaleźć dobrego sposobu (w skrócie), aby sprawdzić, czy dane wejściowe są prawidłowe. Myślę, że mój byłby co najmniej dwa razy dłużej.
Gareth,
Dzięki Gareth, jeśli spojrzysz na wczesne rozwiązania w linku do dyskusji, zobaczysz, że wiele naszych początków było dłuższych. Jedną z ciekawszych rzeczy, które znaleźliśmy, była różnorodność metod, które moglibyśmy zastosować w przypadku J. okrzyki, bob
bob therriault
3

pieprzenie mózgu, 303

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

Obecnie nie obsługuje tej If wrong input is send to the program it will not print anythingczęści i prawdopodobnie może być krótszy. Planuję to naprawić później. W tej chwili mój mózg jest zbyt dziwny, by kontynuować.

pudełko kartonowe
źródło
2

C 110

Czasami drukuje „spacje” między literami, czasem nie.

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

Nieco bardziej czytelny:

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

Działa:

$ ./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
źródło
2

JavaScript, 137

Niestety trochę za dużo ( String.fromCharCodei 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
źródło
2

Perl, 77 76 70 68

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

Edycje:

  1. Zapisano postać za pomocą wyrażenia regularnego zamiast substr.

  2. Zapisano 6 znaków za pomocą mapzamiast for.

  3. Zapisano 2 znaki, pomijając ostatnią linię.

Jon Purdy
źródło
3
Fajnie, ale jak już zauważyłeś, nie spełnia wymogu, że nieprawidłowe dane wejściowe nie dają danych wyjściowych. Napraw to, a dostaniesz moją opinię.
Gareth,
nie wydaje mi się działać na perlu 5.14.2. też nie wierzę, że wymagany jest \ntwój finał print, który pozwoli zaoszczędzić kilka znaków
nowy
@ardnew: Napisałem to na moim komputerze roboczym, który ma 5.12.3. Zabije \n, dzięki.
Jon Purdy,
2

R, 219

Brzydkie, długie ... wciąż działa.

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

Stosowanie:

f("a")
f("c.")
f("H")
f("z")
f("Z.")
f("seven")
Paolo
źródło
2

C, 146 znaków (straszne)

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

Nie mam dużego doświadczenia w C, co prawdopodobnie pokazuje ...>. <Miałem wrażenie, że znaki będące liczbami całkowitymi byłyby pomocne, ale tak naprawdę nie wywarło to tak dużego wpływu, jak miałem nadzieję ... Zostawię tu jednak moją próbę, możesz zaproponować ulepszenia.

Wersja nieuprawniona:

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
  );
}
Robaczek świętojański
źródło
2

VBA 225

Sformatowany do uruchomienia z bezpośredniego okna:

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

Podzielony na poszczególne linie (musi być otoczony Subblokiem i potrzebuje innej printmetody do pracy w module, dzięki czemu kod będzie dłuższy):

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
źródło
2

Java 8, 127 bajtów

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

Wyjaśnienie:

Wypróbuj 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
Kevin Cruijssen
źródło
1

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

Nie taki nowoczesny język;) Jestem pewien, że zostało trochę miejsca na optymalizację ..

Wyjaśnienie:

r t 

odczytać wejście

i t?1A.1"."

sprawdź, czy t pasuje do wymaganego wejścia

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

podstawowy dla pętli przez alfabet. Zauważ, że świnka ściśle ocenia od lewej do prawej. Prawda = 1, więc otrzymasz wynik 65 lub 97 dla p, # jest operatorem modulo

testy:

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>

(potrzebujesz env środowiska uruchomieniowego świnki, tj. Caché, aby to uruchomić)

edycja: pogrubiony nagłówek

edycja: miałem złe rozwiązanie, naprawione teraz. Dzięki rtfs i Averroees za zwrócenie na to uwagi

kazamatzuri
źródło
kod wydaje się mieć 79 znaków, a nie 80
Cristian Lupascu
niestety, pierwsze miejsce nie jest opcjonalne, więc pomyślałem, że muszę to policzyć.
kazamatzuri
Przypadki testowe nie kończą się literą precedensu przekazanego jako parametr, prawda?
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

Skomentowana wersja:

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
źródło
0

Oto moja pierwsza próba z APL.

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

jeśli mogę użyć jednej zmiennej globalnej, A←2 26⍴6↓26⌽⎕UCS 65+⍳58to mogę skrócić powyższe do następujących:

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

sekcja

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. 

Działa] $ ./test 5

Działa] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Działa] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Działa] $ ./test g hijklmnopqrstuvwxyzabcdef

Działa] $ ./test [

Działa] $ ./test a bcdefghijklmnopqrstuvwxyz

Działa] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Dziękuję za jedzenie do namysłu.

essbeev
źródło
Nie dodajesz nowych linii, jeśli „.” jest podawany. Nie powinieneś również niczego wysyłać, jeśli dane wejściowe nie są [A-Za-z]\.?, jeśli dobrze zrozumiałem pytanie.
marinus
# 1. O! Byłem pochłonięty skracaniem kodu .. # 2. zobacz wynik „test [” to nic nie drukuje. @marinus
essbeev
0

Perl, 226 znaków

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]));
początkujący
źródło
Możesz sformatować tekst tak, aby pojawiał się jako blok kodu. Przeczytaj przewodnik tutaj do formatowania swoich postów. Możesz także zapisać niektóre znaki, używając nazw zmiennych jednoznakowych.
Gareth
1
Niepoprawne dane wejściowe nie powinny nic drukować, więc twoje dieoświadczenie może zostać zmniejszone, oszczędzając
sporo
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);}}}

Bez kompresji

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
źródło
Nie zapomnij dodać wyjaśnienia do swojej odpowiedzi.
Justin
Ten program nawet nie próbuje grać według zasad. 1: Jeśli litera jest pisana wielkimi literami, musisz wyświetlać wielkie litery. 2: Wydrukowany alfabet musi kończyć się literą poprzedzającą wstawioną. 3: Jeśli do parametru dodany zostanie parametr dodatkowy (prosta kropka), alfabet powinien zostać wydrukowany jedna litera w każdym wierszu. W przeciwnym razie alfabet powinien być wydrukowany w tym samym wierszu, oddzielony prostą spacją. 4: Jeśli do programu zostanie wysłane nieprawidłowe wejście, nic nie wydrukuje. To chybienie 4 na 4.
RobIII
^ Poza tym zachęcam do zapoznania się z moimi wcześniejszymi komentarzami tutaj . Można wymienić charz vari golenie 1 punkt swój wynik, luźne .ToCharArray()(a string jest char-array można już iteracyjnego!), Stracić string[] a, ponieważ nie mamy do czynienia z argumentów wiersza poleceń, tracą przestrzeń nazw, stałej „c” należy czytać z danych wejściowych konsoli, zgubić ciąg alfabetu i zamiast tego użyć ASCII itp. To wspaniale, że grasz, ale postaraj się podjąć przyzwoity wysiłek; większość twoich zgłoszeń wydaje się trollować.
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));}

Podziękowania dla schnaadera za lewę d + 6 i 31.

http://ideone.com/ts1Gs9

mattnewport
źródło
0

Bash: 110 bajtów

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

Jeśli chodzi o wyjaśnienia, jest to dość proste, bez magicznych sztuczek - jest to po prostu coś, do czego dobrze nadaje się bash. Pod względem nieoczywistych bitów:

  • {a..z}jest bardzo niewykorzystaną sztuczką w bashu - rozwija się do a b c d.... Możesz zrobić to samo, aby wygenerować sekwencje numeryczne.
  • Bash może wykonać dopasowanie wyrażenia regularnego, [[ $1 =~ [a-z] ]]uruchamia dopasowanie wyrażenia regularnego względem pierwszego argumentu programu dla znaków od a do z. Podobnie dla AZ. Potrzebujesz do tego podwójnych nawiasów kwadratowych, [nie możesz tego zrobić.
  • ${1:1:1}pobiera podłańcuch 1 $ (pierwszy argument), jeden znak w środku, jeden znak długi - to znaczy zwraca drugi znak ciągu, zgodnie z oczekiwaniami ..
  • sed 's/ /\n/g'Proste wyrażenie: wyszukuje i zamienia spacje na nowe linie. Jeśli .jest drugim znakiem ciągu, wprowadzamy do niego dane wejściowe lub w inny sposób ...
  • cat jest tutaj ostatnia sztuczka - jeśli nie chcemy zastępować spacji nowymi liniami, zamiast tego karmimy cat stdin, który po prostu wyprowadza go ponownie.
Zamieszki
źródło
Nie zapomnij dodać wyjaśnienia.
Justin