Друкувати спеціальний алфавіт


20

Змагання

Виведіть алфавіт із заданої літери, прочитаної з консольного введення. Якщо літера є великими літерами, ви повинні відобразити алфавіт з великої літери. Друкований алфавіт повинен закінчуватися попередньою літерою тієї, що вставлена. Якщо до вводу додається параметр addtal (проста точка .), алфавіт повинен бути надрукований по одній букві в кожному рядку. В іншому випадку алфавіт повинен бути надрукований в одному рядку, розділеним простим пробілом. Якщо неправильний вхід буде надіслано програмі, вона нічого не надрукує.

Приклади введення:

Вхід:

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

Вхідні дані

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

Sage Notebook працює на "консольному рівні", тож чи необхідний "введення консолі" в цьому випадку просто вводить вхід у комірку робочого аркуша?
res

виграє найкоротший код?
ardnew

@ardnew Так, виграє найкоротший код.
Аверрое

@res Я думаю, що хоча вам потрібно кодувати вхідне читання певним чином, це може бути справедливим з точки зору правил.
Аверрой

6
@Averroes Штраф за використання GolfScript - це кількість часу, яке потрібно на вивчення мови, яка не має реального використання поза подібними змаганнями. Я не думаю, що покарання людей за користування правильним інструментом для роботи буде дуже продуктивним.
Гарет

Відповіді:


12

GolfScript 48 75 73 70 67 66 63 57 53

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

Демонстрації в Інтернеті:

Оновлення:

Тепер також виконується останнє правило. Дякую Вентеро за те, що вказав на проблему.

Оновлення:

Я переписав код з нуля і знайшов нові способи його ще більше скоротити.

Історія модифікацій:

.,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
Це рішення не відповідає останній вимозі:If wrong input is send to the program it will not print anything.
Вентеро

@ Вентеро Право. Я це виправлю.
Крістіан Лупаску

63 - приємно, ми head2head :), бажаю, щоб я міг зрозуміти golfscript;)
bua

Я так само почуваюсь щодо Q. Чудова робота! ;-)
Крістіан Лупаску

+1 дивовижно! готові зламати 50 ;-)?
бу

10

C, 135 129 128 символів

Чорт, так багато різних магічних чисел, але жодного способу позбутися від них.

Потрібно запустити з введенням як програмний параметр. Тепер слід вимога "неправильного введення".

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

Пояснення:

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&31Частина використовує той факт , що ASCII - коду для сатиричного / символу верхнього регістру є однаковою , якщо тільки дивитися на останні 5 біт , а решта 5 біт знаходяться в діапазоні 1..26.

Версія без вимоги "неправильного введення" (82 символи):

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

Будь-яка інструкція, як її скласти? Я отримую помилку сегментації під час запуску.
манатура

@manatwork, здається, приймає дані як параметр.
shiona

Так, дійсно, відредагований для уточнення. Наприклад, якщо назва програми test, назвіть її як test cабоtest X.
schnaader

Спасибі, отримав. Мій C здається більш рум'яним, ніж я думав.
манатура

2
Стиль визначення K & R може допомогти: main(a,b)char**b;{. Крім того, b++можна дозволити вам замінити *b[1]-> **bі b[1][1]-> 1[*b].
ugoren

7

Рубі, 72 71 61 персонаж

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

Ця версія рубіну використовує регулярний вираз для перевірки введення. На щастя, рядовий метод Ruby succробить більшу частину роботи для нас (включаючи обгортання).

Редагувати: 61 символ за допомогою хрону та Вентеро .


Моя виявилася занадто схожою на вашу, щоб турбувати публікацію окремо. Той самий підхід, але на кілька символів коротший (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Пол Престидж

2
А це 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- в основному те саме, що ваше зловживає $_і$/
Пол Престиж

2
@chron: Використовуючи +=замість цього +, ви можете опустити круглі дужки навколо $1?$/:' '.
Вентеро

@chron і Ventero: Дякую. Додав ваш код до мого рішення.
Говард

6

Ruby: 127 113 92 (?) Символів

(Не можу знайти правило щодо штрафу за використання -p. Додано 1 зараз. Якщо не так, будь ласка, виправте мене.)

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

Проба зразка:

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

Рубі, 101 95

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

Спробуйте в Інтернеті


Не випливає "Якщо неправильний вхід надсилається програмі, він нічого не надрукує".
Метт

вдалося врятувати кілька символів з ('a'..'z').to_a=>[*?a..?z]
Пол Престиж

@chron Дякую! Як я міг пропустити це ..
дефш

6

GolfScript, 80 72 символів

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

Багато коду - це тестування на допустимий вхід та можливість "нічого не друкувати". Фактична логіка - це лише 37 символів.

Тестові приклади в Інтернеті


6

q / k4 66 64 63 60 58 56 + 2 штрафи

штраф за глобальну змінну init, алгоритм 56 як нижче:

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]
  • змінити з if-else на, якщо дозволено реорганізувати код та позбутися ";" в кінці

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • врешті-решт позбувся цієї зайвої перевірки

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • друкувати символи рекурсивно замість цілого об'єкта
  • все ще не може вимкнути порівняння ідентичності x in ". в двох місцях ... :(
  • крапка з комою потрібна в кінці, інакше функція друку (1 @) надрукує повернене значення до stdout .... чорт

64:

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

Редагувати:

Додано штраф у розмірі 2 за глобальну ініціалізацію (x :), те саме, якщо функція загортання в дужки (як пропонується slackware),
не впевнений, чи слід покарати також зміну простору імен ... тоді це ще 3

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

Приклад:

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 Приємний прогрес. Я спробую зараз знайти інший спосіб скоротити код.
Крістіан Лупаску

Чи справді це можна назвати дійсним k, якщо він використовує визначення в qk? ;-) Крім того, якщо ви вкладете його у функцію, ви можете пропустити етап налаштування x: "a", наприклад {$ [...]}
skeevey

@slackwear ви маєте рацію, тому його називають q / k4 ;-).
bua

6

Перл, 131 127 117 112 106 104 102 98 96 92 91 90 93 71 66 65 64 58 символів

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

Використання:

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

Один символ додано до рахунку для nпараметра.

Найбільший розріз був можливий лише через те, що побачили поведінку ++персонажів у відповіді Джона Перді .


Ви можете поголити пару символів, видаливши останні два крапки з комою
ardnew

@ardnew Дякую :-)
Гарет

1
ця річ вражає
bua

@bua Спасибі, я все ще намагаюся знайти символів, щоб я міг вас спіймати і w0lf. :-)
Гарет

s/a.$1/az/щоб зберегти ще 2. chop().($2?$/:$")-> chop,$2?$/:$"для ще 4
моб

5

Перл, 149 , 167

Оновлення

  • Додано перевірку здоровості.
  • Зробив нові пропозиції щодо розділювальної програми.
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

ви можете замінити $s=($d)?"\n":" ";з $s=$d?$/:$";і , можливо , просто позбутися від $sвзагалі
ardnew

4

Пітона, 83

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

Я не є прихильником цього обмеження, але воно існує, і ви програму не дотримуєтесь цього: "Якщо неправильний ввід надсилається програмі, він нічого не надрукує".
Метт

Крім того, схоже, що ви надрукуєте на один символ більше, ніж слід. Приклад виводу - 25 символів.
Метт

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
Це проблема з кодовим гольфом , тому оптимізація швидкості та використання ресурсів не потрібна. Замість того, щоб зберігати $v[1]=='.'?"\n":" "результат у змінній $ s, нехай PHP обчислює його кожен раз у echoвиписці. Таким чином ви можете пощадити 6 символів.
манатура

1
@manatwork Дякую, я змінив це.
lortabac

4

Mathematica 158 159 204 199 183 167 165 162

Код

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

Використання

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

usage


Третім випадком використання є f ["H"] або f ["H."]?
Averroes

Мені довелося виправити обробку ".", Додавши до коду 50 символів. Але зараз це працює за інструкцією
DavidC

3

J 43

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

Приклади:

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

Це рішення розвинулося на форумі програмування J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Автори: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Пояснення

J фрази виконуються, починаючи праворуч, передаючи поточний результат ліворуч, коли він оцінюється. Оскільки це інтерактивний спосіб, ми можемо роздивитися фрагменти розчину, щоб їх краще зрозуміти.

Середня частина генерує верхній і нижній регістр алфавіту в Unicode:

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

Дієслово "u:" перетворює свій правильний числовий аргумент в символи Unicode. Числовий аргумент генерується із значень ASCII для великих і малих символів, додаючи числа для "A" і "a" кожен до значень від 0 до 25, породжених "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

Права частина,

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

шукає вгору (i.) положення правого аргументу (]) зліва ([) - який є вектором букв вгорі - і опускає (}.) ще один (>:), ніж це число. "0" застосовує цю фразу до 0-мірних (скалярних) аргументів.

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

Фраза "25 {." Займає перші 25 елементів вектора праворуч.

Передостаннє словосполучення "1j1 #" зліва повторює його правий аргумент відповідно до лівого числа. Просте число робить просту реплікацію:

   2 # 'ABCD'
AABBCCDD

Однак складне число - позначене "j" між реальною та уявною частинами - вставляє елемент заповнення відповідно до уявної частини. Тут ми вказуємо один елемент заповнення тим, що праворуч від "j".

   2j1 # 'ABCD'
AA BB CC DD 

Як і у більшості примітивів J, дієслово-реплікація (#) працює на числових масивах аналогічно тому, як це працює на масивах символів. Як показано тут,

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

ми бачимо, що за замовчуванням числовий елемент заповнення дорівнює нулю, тоді як для символів це символ пробілу.

Нарешті, крайній лівий маркер "|:" переносить результат попередніх дієслів праворуч.

Пояснення надав Девон Маккормік. Дякую, Девон


+1 Дійсно приємне рішення та пояснення. Я розглядав спробу в J, але не міг зрозуміти, як вдалий спосіб (короткий шлях), щоб перевірити, чи є вхід правильним. Я думаю, моє було б принаймні вдвічі довше за це.
Гарет

Дякую Гарет, якщо ви подивитесь на ранні рішення у дискусійному посиланні, ви побачите, що багато наших стартів були довші. Однією з чітких речей, які ми знайшли, було різноманітність підходів, які ми могли використати з J. cheers, bob
bob terriault

3

мозковий ебать, 303

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

Наразі вона не підтримує If wrong input is send to the program it will not print anythingчастину, і, ймовірно, може бути коротшою. Планую це виправити пізніше. Зараз мій мозок занадто **** Ед, щоб продовжувати.


2

С, 110

Іноді друкує «пробіли» між літерами, іноді ні.

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

Легко читабельніші:

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

Виконує:

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

На жаль, трохи багатослівний ( String.fromCharCodeі 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"

Зміни:

  1. Збережено символ, використовуючи регулярні вирази замість substr.

  2. Збережено 6 символів mapзамість for.

  3. Збережено 2 символи, опустивши остаточний рядок.


3
Добре, але, як ви вказали, він не відповідає вимозі, що неправильний ввід не дає результату. Виправте це, і ви отримаєте мою нагороду.
Гарет

начебто не працює на мене на Perl 5.14.2. також я не вірю, що \nу вашому фіналі printпотрібно, що дозволить заощадити пару символів
1212

@ardnew: Я написав це на своєму робочому комп'ютері, в якому є 5.12.3. Уб'ю \n, спасибі.
Джон Перді

2

R, 219

Потворне, довго ... все ще працює.

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

Використання:

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

2

C, 146 символів (страшно)

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

Я не дуже досвідчений в С, що, мабуть, показує ...> Я покину свою спробу тут, не соромтесь запропонувати поліпшення.

Немініфікована версія:

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

Відформатований для запуску з прямого вікна:

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

Розбитий на окремі рядки (потребує оточення Subблоком і потрібен інший printметод для роботи в модулі, тим самим зробивши код довшим):

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 байт

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

Пояснення:

Спробуйте в Інтернеті.

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

Свинка, 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["." !

Не така сучасна мова;) Я впевнений, що залишилося небагато місця для оптимізації.

Пояснення:

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

основні для циклу через алфавіт. Зауважте, що свинка суворо оцінює зліва направо. True = 1, тому ви отримуєте 65 або 97 в результаті p, # - оператор модуля

тести:

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>

(для запуску цього вам потрібна епідемія свинки, тобто Caché для запуску цього)

редагувати: жирний заголовок

редагувати: неправильне рішення виправлено зараз. Дякуємо rtfs та Averroees за те, що вказували на це


Код, здається, має 79 знаків у довжину, а не 80
Крістіан Лупаску

на жаль, перший пробіл не є обов’язковим, тому я подумав, що мені доведеться його порахувати.
kazamatzuri

Тестові випадки не закінчуються попередньою літерою тієї, що передається як параметр, чи не так?
Аверрое

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

Коментована версія:

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

Ось моя перша спроба на неї з APL.

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

якщо я можу використовувати одну глобальну змінну, A←2 26⍴6↓26⌽⎕UCS 65+⍳58я можу скоротити вищезгадане до наступного:

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

розсічення

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. 

Творів] $ ./test 5

Праць] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Праць] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Твори] $ ./test g hijklmnopqrstuvwxyzabcdef

Твори] $ ./test [

Твори] $ ./test a bcdefghijklmnopqrstuvwxyz

Праць] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Дякую за їжу для роздумів.


Ви не додаєте нові рядки, якщо знак '.' дається. Крім того, ви не повинні нічого виводити, якщо вхід не є [A-Za-z]\.?, якщо я правильно зрозумів питання.
marinus

№1. ой! я був зайнятий тим, що робить код коротким .. # 2. дивіться вихід 'test [', він нічого не друкує. @marinus
essbeev

0

Perl, 226 символів

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

Ви можете відформатувати текст, щоб він відображався як блок коду. Прочитайте посібник тут із форматування своїх публікацій. Крім того, ви можете зберегти деякі символи, використовуючи одноіменні імена змінних.
Гарет

1
Неправильний вхід не повинен друкувати нічого, тому ваш die вислів можна зменшити, заощадивши купу ...
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);}}}

Нестиснений

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

Не забудьте додати пояснення до своєї відповіді.
Джастін

Ця програма навіть далеко не намагається грати за правилами. 1: Якщо літера є великими літерами, ви повинні відобразити алфавіт з великої літери. 2: Алфавіт, надрукований, повинен закінчуватися попередньою літерою вставленої букви. 3: Якщо до вводу додано параметр addtal (проста точка), алфавіт повинен бути надрукований по одній букві в кожному рядку. В іншому випадку алфавіт повинен бути надрукований в одному рядку, розділеним простим пробілом. 4: Якщо неправильний вхід буде надіслано програмі, вона нічого не надрукує. Це пропуск 4 з 4.
RobIII

^ Крім цього, я закликаю вас поглянути на мої попередні коментарі тут . Ви можете замінити charз varі голінням 1 очко за ваш рахунок, втратити .ToCharArray()string це напівкокс-масив можна вже ітерація закінчена!), Втрачає , string[] aтак як ви не має справу з аргументами командного рядка, втрачає простір імен, ваш постійної «с» слід читати з консольного введення, втрачати рядок алфавіту і використовувати натомість ASCII і т. д. Чудово, що ви граєте, але, будь ласка, постарайтеся зробити гідне зусилля; більшість ваших подань здається лише тролінг.
РобІІІ


0

Bash: 110 байт

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

Що стосується пояснення, це досить просто, ніяких магічних трюків - це просто щось, для чого баш справді добре підходить. Щодо неочевидних бітів:

  • {a..z}є дуже недоотриманим трюком у баші - він розширюється до a b c d.... Ви можете зробити те саме, щоб створити числові послідовності.
  • Bash може проводити збіг регулярних виразів, [[ $1 =~ [a-z] ]]проводить збіг регулярних виразів проти першого аргументу програми для символів від a до z. Аналогічно для AZ. Для цього вам потрібні подвійні квадратні дужки, [не можна цього зробити.
  • ${1:1:1}отримує підрядку в $ 1 (перший аргумент), один символ у, один символ довгий - тобто він повертає другий символ рядка, яким ми очікуємо бути ..
  • sed 's/ /\n/g'простий регулярний вираз: шукає та замінює пробіли новими рядками. Якщо. це другий символ рядка, ми вводимо це введення або іншим чином ...
  • cat тут заключний трюк - якщо ми не хочемо замінювати пробіли новими рядками, ми подаємо stdin коту, а просто виводимо його знову.

Не забудьте додати пояснення.
Джастін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.