Распечатать свой алфавит


20

Соревнование

Вывести алфавит из заданной буквы, прочитанной с консоли. Если буква заглавная, вы должны отобразить алфавит в верхнем регистре. Напечатанный алфавит должен заканчиваться прецедентной буквой вставленного. Если к входу добавлен дополнительный параметр (простая точка .), алфавит должен быть напечатан по одной букве в каждой строке. В противном случае алфавит должен быть напечатан в той же строке, разделенной простым пробелом. Если в программу будет отправлен неправильный ввод, он ничего не напечатает.

Примеры входов:

Входные данные:

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]=*

Демоверсии онлайн:

Обновить:

Теперь последнее правило также реализовано. Спасибо Ventero за указание на проблему.

Обновить:

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

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

.,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.
Ventero

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

63 - хорошо, мы head2head :), хотелось бы, чтобы я мог понять сценарий гольфа;)
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

@manatwork, кажется, принимает входные данные в качестве параметра.
Шион

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

Спасибо, получил его. Мой C кажется более грубым, чем я думал.
manatwork

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

7

Рубин, 72 71 61 символов

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

Эта версия ruby ​​использует регулярное выражение для проверки ввода. К счастью, строковый метод Ruby succделает большую часть работы за нас (включая обход).

Edit: 61 символов с помощью Хрон и Ventero .


Мой получился слишком похожим на ваш, чтобы постить отдельно. Тот же подход, но на несколько знаков короче (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

Рубин: 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 Спасибо! Как я мог пропустить это ..
defhlt

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 на if, если разрешено реорганизовать код и избавиться от ";" в конце

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; 
  • печатать символы рекурсивно вместо всего объекта
  • все еще не могу выйти из сравнения х в "." в двух местах ... :(
  • точка с запятой в конце обязательна, иначе функция print (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 ;-).
Буа

6

Perl, 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опции.

Самый большой разрез был возможен только из-за того, что он видел поведение ++персонажей в ответе Джона Перди .


Вы можете сбрить пару символов, удалив последние 2 точки с запятой
ardnew

@ardnew Спасибо. :-)
Гарет

1
эта вещь впечатляет
буа

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

s/a.$1/az/сохранить еще 2 chop().($2?$/:$")-> еще chop,$2?$/:$"4
моб

5

Perl, 149 , 167

Обновить

  • Добавлена ​​проверка работоспособности.
  • Взял ardnew предложение о применении сепаратора.
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

Python, 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 символов.
manatwork

1
@manatwork Спасибо, я изменил это.
Лортабак

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"]

использование


Третий вариант использования - это f ["H"] или f ["H."]?
Аверроэс

Мне пришлось исправить обработку ".", Добавив 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:" преобразует свой числовой правый аргумент в символы Юникода. Числовой аргумент генерируется из значений 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, Боб.
Боб Террио

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требуется, что сэкономит пару символов
ardnew

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

Я не очень разбираюсь в C, что, вероятно, показывает ...>. <У меня было ощущение, что символы, являющиеся целыми числами, были бы полезны, но на самом деле это не оказало такого большого влияния, как я надеялся ... Я оставлю здесь свои попытки, не стесняйтесь предлагать улучшения.

Unminified версия:

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"."

проверьте, соответствует ли t требуемому входу

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

С (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утверждение может быть сокращено, сохраняя кучу ...
Гаффи

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: Если к входу добавлен дополнительный параметр (простая точка), алфавит должен быть напечатан по одной букве в каждой строке. В противном случае алфавит должен быть напечатан в той же строке, разделенной простым пробелом. 4: Если в программу введен неправильный ввод, она ничего не напечатает. Это мисс 4 из 4.
RobIII

^ Кроме этого, я призываю вас взглянуть на мои предыдущие комментарии здесь . Вы можете заменить charна var1 балл и побрить его, потерять .ToCharArray()(a string - массив символов, с которым вы уже можете проходить !), Потерять, string[] aпоскольку вы не имеете дело с аргументами командной строки, потерять пространство имен, свою константу 'c' следует читать с консоли, потерять строку алфавита и использовать вместо него ASCII и т. д. Хорошо, что вы играете, но, пожалуйста, постарайтесь приложить немало усилий; большинство ваших представлений, кажется, только троллинг.
RobIII


0

Bash: 110 байт

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

С точки зрения объяснения, это довольно просто, никаких волшебных уловок - это просто то, для чего bash изначально подходит. С точки зрения неочевидных битов:

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

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