맞춤 알파벳 인쇄


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 예, 가장 짧은 코드가 승리합니다.
Averroes

@res 나는 어떤 방식으로 입력 판독을 코딩해야하지만 규칙 관점에서 볼 때 공정 할 수 있다고 생각합니다.
Averroes

6
@Averroes GolfScript 사용에 대한 벌칙은 이런 종류의 경쟁 이외의 언어를 실제로 사용하지 않는 언어를 배우는 데 걸리는 시간입니다. 올바른 도구를 사용하여 사람들에게 불이익을주는 것이 매우 생산적이라고 생각하지 않습니다.
Gareth

답변:


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

@ 벤 테로 맞아. 이 문제를 해결하겠습니다.
Cristian Lupascu

63-좋아, 우리는 head2head :), 내가 golfscript를 이해할 수 있기를 바란다;)
bua

Q에 대해서도 같은 생각이 듭니다. ;-)
크리스티안 루파 스쿠

+1 최고! 50 ;-)을 기꺼이?
bua

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파트는 마지막 5 비트 만보고 나머지 5 비트 만 1..26 범위에있는 경우 소문자 / 대문자의 ASCII 코드가 동일하다는 사실을 사용합니다.

"잘못된 입력"요구 사항이없는 버전 (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는 입력을 매개 변수로 사용하는 것 같습니다.
shiona

그렇습니다. 명확히하기 위해 편집했습니다. 예를 들어 프로그램 이름이 test다음과 같 test c거나 다음과 같이 호출하십시오.test X.
schnaader

고마워요 내 C는 생각했던 것보다 더 녹슬었던 것 같습니다.
manatwork

2
K & R 정의 스타일이 도움이 될 수 있습니다 main(a,b)char**b;{.. 또한 -> 및 -> b++을 대체 할 수 있습니다 . *b[1]**bb[1][1]1[*b]
ugoren

7

루비, 72 71 61 자

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

이 루비 버전은 정규식을 사용하여 입력을 확인합니다. 운 좋게도, Ruby 문자열 메소드 succ는 랩 어라운드를 포함하여 대부분의 작업을 수행합니다.

편집 : chronVentero 의 도움으로 61 자 .


광산은 당신과 너무 비슷한 방식으로 게시를 별도로하지 않았습니다. 같은 방법이지만 몇 글자는 더 짧습니다 (65) :c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge

2
그리고 이것은 62입니다 : gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i-기본적으로 당신의 학대 $_와 동일$/
Paul Prestidge

2
@chron : +=대신을 사용하여 +주위에 괄호를 놓을 수 있습니다 $1?$/:' '.
Ventero

@chron과 Ventero : 감사합니다. 내 솔루션에 코드를 추가했습니다.
Howard

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==?.?$/:' ')}

온라인으로 사용해보십시오


"프로그램에 잘못된 입력이 전송되면 아무 것도 인쇄되지 않습니다."
Matt

('a'..'z').to_a=> 로 몇 문자를 저장할 수 있습니다.[*?a..?z]
Paul Prestidge

@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 페널티

전역 변수 초기화에 대한 페널티, 알고리즘은 다음과 같이 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를 벗어날 수 없습니다 . 두 곳에서 ... :(
  • 끝에 세미콜론이 필요합니다. 그렇지 않으면 인쇄 기능 (1 @)이 반환 값을 stdout으로 인쇄합니다 .... 젠장

64 :

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

편집하다:

전역 초기화 (x :)에 대해 2의 페널티를 추가했습니다. 슬랙웨어가 제안한 것처럼 함수를 괄호로 묶는
경우에도 마찬가지입니다.

(.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 멋진 진행. 이제 코드를 단축하는 다른 방법을 찾으려고 노력할 것입니다.
Cristian Lupascu

qk에서 정의를 사용하는 경우 실제로 유효한 k라고 할 수 있습니까? ;-) 또한 함수로 감싸면 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옵션 의 개수에 한 문자가 추가되었습니다 .

Jon Purdy의 답변++ 에서 등장 인물 의 행동을 보았 기 때문에 가장 큰 컷 만 가능했습니다 .


마지막 2 개의 세미콜론을 제거하여 몇 개의 문자를 제거 할 수 있습니다
ardnew

@ardnew 감사합니다. :-)
Gareth

1
이 것은 인상적이다
bua

@bua 감사합니다, 나는 아직도 당신과 w0lf를 잡을 수 있도록 캐릭터를 찾으려고 노력하고 있습니다. :-)
Gareth

s/a.$1/az/2 개 더 절약 할 수 있습니다. chop().($2?$/:$")-> chop,$2?$/:$"더 많은 것을 위해
mob

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

나는이 제한의 팬이 아니지만, 존재하고 당신은 프로그램을 따르지 않습니다 : "입력이 잘못되면 프로그램이 출력되지 않습니다."
Matt

또한 한 글자 이상을 인쇄해야하는 것처럼 보입니다. 출력 예는 25 자입니다.
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":" ";

1
이는 코드 골프 문제이므로 속도 및 리소스 사용량 최적화가 필요하지 않습니다. $v[1]=='.'?"\n":" "의 결과를 변수 $ s 에 저장하는 대신 PHP가 echo명령문 에서 매번 계산하도록하십시오 . 그렇게하면 6자를 절약 할 수 있습니다.
manatwork

1
@manatwork 감사합니다. 변경했습니다.
lortabac

4

매쓰 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."]입니까?
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 구문은 오른쪽에서 시작하여 평가되는대로 진행중인 결과를 왼쪽으로 전달합니다. 대화식이므로 솔루션을보다 잘 이해하기 위해 솔루션을 개별적으로 볼 수 있습니다.

가운데 부분은 대문자와 소문자 알파벳을 유니 코드로 생성합니다.

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

"u :"동사는 숫자의 오른쪽 인수를 유니 코드 문자로 변환합니다. 숫자 인수는 "A"및 "a"의 숫자를 각각 "i.26"에 의해 생성 된 0에서 25까지의 값에 추가하여 대문자 및 소문자의 ASCII 값에서 생성됩니다.

   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

위의 문자로 구성된 벡터 인 왼쪽 ([)에서 오른쪽 인수 (])의 위치를 ​​찾은 다음 해당 숫자보다 하나 (> :)를 떨어 뜨립니다 (} :). ' "0'은이 구를 0 차원 (스칼라) 인수에 적용합니다.

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

"25 {."구문은 오른쪽에있는 벡터의 처음 25 개 요소를 사용합니다.

왼쪽의 두 번째 구문 "1j1 #"은 왼쪽의 숫자에 따라 오른쪽 인수를 복제합니다. 간단한 숫자는 간단한 복제를 수행합니다.

   2 # 'ABCD'
AABBCCDD

그러나 실수 부와 허수 부 사이에 "j"로 표시된 복소수는 허수 부에 따라 채우기 요소를 삽입합니다. 여기서 우리는 하나의 채우기 요소를 "j"의 오른쪽에 하나씩 나타냅니다.

   2j1 # 'ABCD'
AA BB CC DD 

대부분의 J 프리미티브와 마찬가지로 replicate 동사 (#)는 숫자 형 배열에서 문자형 배열에서 작동하는 방식에 대한 분석 방식으로 작동합니다. 여기에 표시된대로

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

기본 숫자 채우기 요소는 0 인 반면 문자의 경우 공백 문자입니다.

마지막으로 가장 왼쪽 토큰 "| :"은 앞의 동사 결과를 오른쪽으로 바꿉니다.

Devon McCormick이 제공 한 설명. 데본 감사합니다.


+1 정말 좋은 해결책과 설명. J로 시도하는 것을 고려했지만 입력이 유효한지 확인하는 좋은 방법 (짧은 방법)을 알 수 없었습니다. 내 생각보다 적어도 두 배나 길었을 것 같습니다.
Gareth

Gareth에게 감사드립니다. 토론 링크에서 초기 솔루션을 살펴보면 우리의 많은 시작이 더 길다는 것을 알 수 있습니다. 우리가 발견 한 깔끔한 것들 중 하나는 우리가 J. 환호, 밥과 함께 사용할 수 있다는 접근의 다양성이었다
밥 therriault

3

brainfuck, 303

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

현재이 If wrong input is send to the program it will not print anything부분 은 지원하지 않으며 더 짧을 수 있습니다. 나중에 고칠 계획입니다. 지금 내 뇌는 계속 진행하기에는 너무 ****입니다.


2

C, 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

자바 스크립트, 137

불행히도 조금 장황하다 ( String.fromCharCodeand 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

펄, 77 76 70 68

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

편집 :

  1. 대신 정규식을 사용하여 문자를 저장했습니다 substr.

  2. map대신을 (를) 사용하여 6자를 저장했습니다 for.

  3. 마지막 줄 바꿈을 생략하여 2자를 저장했습니다.


3
좋았지 만, 유효하지 않은 입력은 출력을 제공하지 않아야한다는 요구 사항을 충족시키지 못합니다. 문제를 해결하면 공감대를받을 수 있습니다.
Gareth

펄 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에서 경험이 많지 않지만 아마도 ...>. <문자가 정수 인 것이 도움이 될 것이라는 느낌이 들었지만 실제로는 내가 원하는만큼 큰 영향을 미치지 않는 것처럼 보입니다 ... 나는 여기에 내 시도를 남겨두고 개선을 제안하기 위해 자유롭게 느끼십시오.

축소되지 않은 버전 :

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

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

알파벳을 통한 기본 for 루프. 유행성 이하선염은 왼쪽에서 오른쪽으로 엄격하게 평가됩니다. True = 1이므로 p의 결과로 65 또는 97을 얻습니다. #은 모듈로 연산자입니다.

테스트 :

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에게 감사합니다


코드는,하지 (80)의 길이는 79 개 문자로 나타납니다
크리스티안 루파 스쿠

불행히도 첫 번째 공간은 선택 사항이 아니므로 계산해야한다고 생각했습니다.
kazamatzuri

테스트 사례가 매개 변수로 전달 된 사례의 선행 문자로 끝나지 않습니까?
Averroes

1

자바 스크립트 : 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 데모


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 [

작품] $. / bcdefghijklmnopqrstuvwxyz 테스트

작품] $. / test Z ABCDEFGHIJKLMNOPQRSTUVWXY


생각할 음식을 주셔서 감사합니다.


'.'인 경우 개행을 추가하지 않습니다. 주어진다. 또한 입력이 아닌 [A-Za-z]\.?경우 질문을 올바르게 이해하면 아무것도 출력하지 않아야합니다 .
marinus

#1. 오! 나는 코드를 짧게 만드는 데 열중했다 .. # 2. 'test ['의 출력을 참조하십시오. 아무것도 인쇄하지 않습니다. @marinus
essbeev

0

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

텍스트를 코드 블록으로 표시하도록 서식을 지정할 수 있습니다. 가이드를 읽으십시오게시물 형식을 지정 여기 . 또한 단일 문자 변수 이름을 사용하여 일부 문자를 저장할 수 있습니다.
Gareth

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

답변에 설명을 추가하는 것을 잊지 마십시오.
Justin

이 프로그램은 심지어 규칙에 따라 플레이하려고 시도조차하지 않습니다. 1: 문자가 대문자이면 알파벳을 대문자로 표시해야합니다. 2: 인쇄 된 알파벳은 삽입 된 알파벳의 선행 문자로 끝나야합니다. 3: 추가 매개 변수가 입력 (간단한 점)에 추가되면 알파벳은 각 줄에 한 문자 씩 인쇄되어야합니다. 그렇지 않으면 알파벳은 같은 줄에 간단한 공백으로 구분하여 인쇄해야합니다. 4: 잘못된 입력이 프로그램에 전송되면 아무것도 인쇄되지 않습니다. 이것은 4-4의 미스입니다.
RobIII

^ 그것 이외의 나는 당신이 나의 이전 의견을 여기 에서 볼 것을 촉구합니다 . 당신은 대체 할 수 charvar느슨한, 당신의 점수와 면도 한 점을 .ToCharArray()(a는 string 이다 의를 잃고 이미 반복 처리가 이상! 할 수있는 문자 배열) string[] a, 귀하의 일정 'C'네임 스페이스를, 당신이 명령 줄 인수를 처리하지 않는 때문에 잃을 콘솔 입력에서 읽고, 알파벳 문자열을 잃어 버리고 대신 ASCII를 사용하십시오. 플레이하는 것이 좋지만, 노력을 기울이십시오. 대부분의 작품은 트롤링 만하는 것 같습니다.
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));}

d + 6 & 31 트릭을위한 schnaader의 공로입니다.

http://ideone.com/ts1Gs9


0

배쉬 : 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에 공급하여 단순히 다시 출력합니다.

설명을 추가하는 것을 잊지 마십시오.
저스틴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.