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

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);}
schnaader
источник
Любая инструкция о том, как его скомпилировать? Я получаю ошибку сегментации при запуске.
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
manatwork
источник
6

Руби, 101 95

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

Попробуйте онлайн

defhlt
источник
Не следует «Если в программу поступает неправильный ввод, она ничего не печатает».
Мэтт
может сэкономить несколько символов с ('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опции.

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

Gareth
источник
Вы можете сбрить пару символов, удалив последние 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
GRC
источник
Я не фанат этого ограничения, но оно существует, и ваша программа не следует ему: «Если в программу будет отправлен неправильный ввод, она ничего не напечатает».
Мэтт
Кроме того, похоже, что вы печатаете на один символ больше, чем нужно. Пример вывода составляет 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":" ";
lortabac
источник
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"]

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

DavidC
источник
Третий вариант использования - это 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":" ");
pimvdb
источник
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
  );
}
FireFly
источник
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
Gaffi
источник
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 за указание на это

kazamatzuri
источник
код, кажется, длиной 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

ajax333221
источник
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]));
beginnerProg
источник
Вы можете отформатировать текст так, чтобы он отображался как блок кода. Прочитайте руководство здесь форматирования своих сообщений. Кроме того, вы можете сохранить некоторые символы, используя имена переменных одного символа.
Гарет
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);
        }
    }
}
PauloHDSousa
источник
Не забудьте добавить объяснение к вашему ответу.
Джастин
Эта программа даже не пытается играть по правилам. 1: Если буква заглавная, вы должны отобразить алфавит в верхнем регистре. 2: Напечатанный алфавит должен заканчиваться буквой прецедента вставленного. 3: Если к входу добавлен дополнительный параметр (простая точка), алфавит должен быть напечатан по одной букве в каждой строке. В противном случае алфавит должен быть напечатан в той же строке, разделенной простым пробелом. 4: Если в программу введен неправильный ввод, она ничего не напечатает. Это мисс 4 из 4.
RobIII
^ Кроме этого, я призываю вас взглянуть на мои предыдущие комментарии здесь . Вы можете заменить charна var1 балл и побрить его, потерять .ToCharArray()(a string - массив символов, с которым вы уже можете проходить !), Потерять, string[] aпоскольку вы не имеете дело с аргументами командной строки, потерять пространство имен, свою константу 'c' следует читать с консоли, потерять строку алфавита и использовать вместо него ASCII и т. д. Хорошо, что вы играете, но, пожалуйста, постарайтесь приложить немало усилий; большинство ваших представлений, кажется, только троллинг.
RobIII
0

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

Благодарим шнаудера за трюк с д + 6 и 31.

http://ideone.com/ts1Gs9

Mattnewport
источник
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, который просто выводит его снова.
буйство
источник
Не забудьте добавить объяснение.
Джастин