In bảng chữ cái tùy chỉnh


20

Các thách thức

Hiển thị bảng chữ cái từ một chữ cái đã cho đọc từ đầu vào giao diện điều khiển. Nếu chữ cái viết hoa, bạn phải hiển thị bảng chữ cái viết hoa. Bảng chữ cái được in phải kết thúc bằng chữ cái tiền lệ của một chữ cái được chèn. Nếu một tham số additiontal được thêm vào đầu vào (một dấu chấm đơn giản .), bảng chữ cái sẽ được in một chữ cái trong mỗi dòng. Mặt khác, bảng chữ cái nên được in trong cùng một dòng, được ngăn cách bởi một không gian đơn giản. Nếu đầu vào sai được gửi đến chương trình, nó sẽ không in bất cứ thứ gì.

Ví dụ đầu vào:

Đầu vào:

c

Thông số của chương trình:

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

Đầu vào

H.

Thông số của chương trình:

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 hoạt động ở "cấp độ bàn điều khiển", vì vậy "đầu vào bàn điều khiển" bắt buộc trong trường hợp này chỉ cần nhập đầu vào vào một ô bảng tính?
res

Mã ngắn nhất thắng?
ardew

@ardnew Có, mã ngắn nhất sẽ thắng.
Averroes

@res Tôi nghĩ rằng trong khi bạn cần mã hóa cách đọc đầu vào theo một cách nào đó thì nó có thể công bằng từ góc độ quy tắc.
Averroes

6
@Averroes Hình phạt cho việc sử dụng GolfScript là lượng thời gian cần thiết để học một ngôn ngữ không có công dụng thực sự bên ngoài loại cạnh tranh này. Tôi không nghĩ rằng việc phạt mọi người vì sử dụng đúng công cụ cho công việc sẽ rất hiệu quả.
Gareth

Câu trả lời:


12

GolfScript 48 75 73 70 67 66 63 57 53

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

Bản demo trực tuyến:

Cập nhật:

Bây giờ quy tắc cuối cùng cũng được thực hiện. Cảm ơn Ventero đã chỉ ra vấn đề.

Cập nhật:

Tôi viết lại mã từ đầu và tìm ra những cách mới để rút ngắn hơn nữa.

Lịch sử sửa đổi:

.,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
Giải pháp này không tuân theo yêu cầu cuối cùng:If wrong input is send to the program it will not print anything.
Ventero

@Ventero Phải. Tôi sẽ sửa cái này.
Cristian Lupascu

63 - tốt đẹp, chúng tôi là head2head :), ước gì tôi có thể hiểu được golfscript;)
bua

Tôi cũng cảm thấy như vậy về Q. Tuyệt vời! ;-)
Cristian Lupascu

+1 tuyệt vời! sẵn sàng phá 50 ;-)?
bua

10

C, 135 129 128 ký tự

Chết tiệt, rất nhiều con số ma thuật khác nhau, nhưng không có cách nào để thoát khỏi chúng.

Phải được chạy với đầu vào là tham số chương trình. Bây giờ làm theo yêu cầu "đầu vào sai".

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

Giải trình:

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

Phần này **b+6&31sử dụng thực tế là mã ASCII cho ký tự chữ thường / chữ hoa là giống nhau nếu chỉ nhìn vào 5 bit cuối cùng và 5 bit còn lại nằm trong phạm vi 1..26.

Phiên bản không có yêu cầu "nhập sai" (82 ký tự):

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

Bất kỳ hướng dẫn về cách biên dịch nó? Tôi gặp lỗi Phân đoạn khi chạy.
manatwork

@manatwork dường như lấy đầu vào làm tham số.
shiona

Vâng, thực sự, chỉnh sửa để làm rõ. Ví dụ: nếu tên chương trình là test, hãy gọi nó như test choặctest X.
schnaader

Cảm ơn, hiểu rồi C của tôi dường như bị rỉ sét hơn tôi nghĩ.
manatwork

2
Phong cách định nghĩa K & R có thể giúp : main(a,b)char**b;{. Ngoài ra, người ta b++sẽ cho phép bạn thay thế *b[1]-> **bb[1][1]-> 1[*b].
ugoren

7

Ruby, 72 71 61 ký tự

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

Phiên bản ruby ​​này sử dụng biểu thức chính quy để xác minh đầu vào. May mắn thay, phương thức chuỗi Ruby succthực hiện hầu hết công việc cho chúng ta (bao gồm cả phần bao quanh).

Chỉnh sửa: 61 ký tự với sự trợ giúp của chronVentero .


Của tôi đã kết thúc quá giống với bạn để đăng bài riêng. Cách tiếp cận tương tự, nhưng ngắn hơn một vài ký tự (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge

2
Và đây là 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- về cơ bản giống như bạn đang lạm dụng $_$/
Paul Prestidge

2
@ sync: Sử dụng +=thay vì +, bạn có thể thả dấu ngoặc đơn xung quanh $1?$/:' '.
Ventero

@ sync và Ventero: Cảm ơn bạn. Đã thêm mã của bạn vào giải pháp của tôi.
Howard

6

Hồng ngọc: 127 113 92 (?) Ký tự

(Tôi không thể tìm thấy quy tắc về điểm số khi sử dụng -p. Đã thêm 1 ngay bây giờ. Nếu sai, vui lòng sửa lại cho tôi.)

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

Chạy mẫu:

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

Ruby, 101 95

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

Dùng thử trực tuyến


Không tuân theo "Nếu đầu vào sai được gửi đến chương trình, nó sẽ không in bất cứ thứ gì."
Matt

có thể tiết kiệm một vài ký tự với ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge

@ sync Cảm ơn! Làm thế nào tôi có thể bỏ lỡ điều đó ..
defhlt


6

q / k4 66 64 63 60 58 56 + 2 hình phạt

hình phạt cho biến toàn cầu init, thuật toán là 56 như sau:

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]
  • thay đổi từ if-other thành nếu được phép tổ chức lại mã và thoát khỏi ";" cuối cùng

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • cuối cùng đã thoát khỏi kiểm tra dư thừa này

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • in ký tự đệ quy thay vì toàn bộ một đối tượng
  • vẫn không thể thoát khỏi phần tổng hợp danh tính x trong "."ở hai nơi ... :(
  • Dấu chấm phẩy ở cuối là bắt buộc, nếu không, chức năng in (1 @) sẽ in giá trị trả về của nó thành thiết bị xuất chuẩn .... chết tiệt

64:

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

CHỈNH SỬA:

Đã thêm hình phạt 2 cho khởi tạo toàn cầu (x :), tương tự nếu gói chức năng vào ngoặc (như phần mềm được đề xuất)
không chắc chắn nếu thay đổi không gian tên cũng sẽ bị trừng phạt ... thì đó là 3

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

Thí dụ:

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 Tiến triển tốt đẹp. Tôi sẽ cố gắng tìm một cách khác để rút ngắn mã của tôi bây giờ.
Cristian Lupascu

Nó thực sự có thể được gọi là k hợp lệ nếu nó sử dụng định nghĩa trong qk? ;-) Ngoài ra, nếu bạn bọc nó trong một hàm, bạn có thể bỏ qua bước thiết lập x: "a", ví dụ {$ [...]}
nghi ngờ

@slackwear Bạn nói đúng, đó là lý do tại sao nó được gọi là q / k4 ;-).
bua

6

Perl, 131 127 117 112 106 104 102 98 96 92 91 90 93 71 66 65 64 58 ký tự

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

Sử dụng:

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

Một ký tự đã được thêm vào số đếm cho ntùy chọn.

Cắt lớn nhất chỉ có thể vì nhìn thấy hành vi của các ++nhân vật trong câu trả lời của Jon Purdy .


Bạn có thể cạo một vài ký tự bằng cách xóa 2 dấu chấm phẩy cuối cùng
ardew

@ardnew Cảm ơn. :-)
Gareth

1
điều này thật ấn tượng
bua

@bua Cảm ơn, tôi vẫn đang cố gắng tìm các nhân vật để tôi có thể bắt bạn và w0lf. :-)
Gareth

s/a.$1/az/để tiết kiệm thêm 2. chop().($2?$/:$")-> chop,$2?$/:$"để biết thêm 4
mob

5

Perl, 149 , 167

Cập nhật

  • Đã thêm kiểm tra vệ sinh.
  • Đã gợi ý về ứng dụng phân tách.
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

bạn có thể thay thế $s=($d)?"\n":" ";bằng $s=$d?$/:$";và có thể loại bỏ $shoàn toàn
ardew

4

Con trăn, 83

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

Tôi không phải là người hâm mộ của hạn chế này, nhưng nó tồn tại và chương trình của bạn không tuân theo nó: "Nếu đầu vào sai được gửi đến chương trình, nó sẽ không in bất cứ điều gì."
Matt

Ngoài ra, có vẻ như bạn in một ký tự nhiều hơn bạn nên. Đầu ra ví dụ là 25 ký tự.
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
Đây là một thách thức golf-code , vì vậy không cần tối ưu hóa tốc độ và sử dụng tài nguyên. Thay vì lưu trữ $v[1]=='.'?"\n":" "kết quả của biến trong biến $ s, hãy để PHP tính toán nó mỗi lần trong echocâu lệnh. Bằng cách đó bạn có thể tha 6 ký tự.
manatwork

1
@manatwork Cảm ơn bạn, tôi đã thay đổi nó.
lortabac

4

Toán học 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, _ -> ""} &

Sử dụng

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

sử dụng


Trường hợp sử dụng thứ ba là f ["H"] hoặc f ["H."]?
Averroes

Tôi đã phải sửa lỗi xử lý ".", Thêm 50 ký tự vào mã. Nhưng bây giờ nó hoạt động theo các hướng dẫn
DavidC

3

J 43

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

Ví dụ:

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

Giải pháp này đã phát triển trên diễn đàn lập trình J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Tác giả: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Giải trình

Các cụm từ J được thực hiện bắt đầu ở bên phải, chuyển kết quả đang diễn ra sang bên trái khi nó được đánh giá. Vì nó tương tác, chúng ta có thể tách biệt các phần của giải pháp để hiểu rõ hơn về chúng.

Phần giữa tạo ra bảng chữ cái in hoa và in thường trong Unicode:

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

Động từ "u:" chuyển đổi đối số đúng số của nó thành các ký tự Unicode. Đối số số được tạo từ các giá trị ASCII cho các ký tự chữ hoa và chữ thường bằng cách thêm các số cho "A" và "a" cho các giá trị từ 0 đến 25 được tạo bởi "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

Phần bên tay phải,

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

tìm kiếm (i.) vị trí của đối số bên phải (]) ở bên trái ([) - là vectơ của các chữ cái ở trên - và giảm (}.) thêm một (> :) so với số đó. '"0' áp dụng cụm từ này cho các đối số 0 chiều (vô hướng).

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

Cụm từ "25 {." Lấy 25 phần tử đầu tiên của vectơ bên phải.

Cụm từ áp chót "1j1 #" ở bên trái sao chép đối số bên phải của nó theo số bên trái. Một số đơn giản thực hiện một bản sao đơn giản:

   2 # 'ABCD'
AABBCCDD

Tuy nhiên, một số phức - được biểu thị bằng "j" giữa các phần thực và phần ảo - chèn một phần tử điền theo phần ảo. Ở đây chúng tôi chỉ ra một yếu tố điền bởi một bên phải của "j".

   2j1 # 'ABCD'
AA BB CC DD 

Như với hầu hết các nguyên hàm J, động từ sao chép (#) hoạt động trên các mảng số theo kiểu hậu môn cho đến cách nó hoạt động trên các mảng ký tự. Như được hiển thị ở đây,

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

chúng ta thấy rằng phần tử điền số mặc định là 0 trong khi đối với các ký tự thì đó là ký tự khoảng trắng.

Cuối cùng, mã thông báo ngoài cùng bên trái "|:" chuyển kết quả của các động từ đi trước sang phải.

Giải thích được cung cấp bởi Devon McCormick. Cảm ơn bạn.


+1 Giải pháp và giải thích thực sự tốt đẹp. Tôi đã cân nhắc thử nó trong J nhưng không thể tìm ra cách hay (một cách ngắn) để kiểm tra xem đầu vào có hợp lệ không. Tôi nghĩ của tôi sẽ có ít nhất gấp đôi thời gian này.
Gareth

Cảm ơn Gareth, nếu bạn nhìn vào các giải pháp ban đầu trong liên kết thảo luận, bạn sẽ thấy nhiều khởi đầu của chúng tôi dài hơn. Một trong những điều thú vị mà chúng tôi tìm thấy là sự đa dạng của các cách tiếp cận mà chúng tôi có thể sử dụng với J. cổ vũ, bob
bob therriault

3

cân não, 303

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

Hiện tại nó không hỗ trợ If wrong input is send to the program it will not print anythingphần này và có lẽ nó có thể ngắn hơn. Tôi có kế hoạch sửa chữa nó sau. Ngay bây giờ bộ não của tôi quá **** ed để tiếp tục.


2

C, 110

Đôi khi in "khoảng trắng" giữa các chữ cái, đôi khi không.

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

Dễ đọc hơn:

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

Chạy:

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

Thật không may một chút dài dòng ( String.fromCharCodecharCodeAt).

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"

Chỉnh sửa:

  1. Đã lưu một ký tự bằng regex thay vì substr.

  2. Đã lưu 6 ký tự bằng cách sử dụng mapthay vì for.

  3. Đã lưu 2 ký tự bằng cách bỏ dòng mới cuối cùng.


3
Đẹp, nhưng như bạn đã chỉ ra, nó không đáp ứng yêu cầu rằng đầu vào không hợp lệ không cung cấp đầu ra. Khắc phục điều đó và bạn sẽ nhận được upvote của tôi.
Gareth

dường như không hoạt động với tôi trên perl 5.14.2. Ngoài ra tôi không tin rằng \ntrận chung kết của bạn printlà bắt buộc, điều này sẽ giúp tiết kiệm một vài ký tự
ardew

@ardnew: Tôi đã viết nó trên máy tính làm việc của tôi, có 5.12.3. Sẽ giết \n, cảm ơn.
Jon Purdy

2

R, 219

Xấu xí, lâu ... vẫn hoạt động.

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

Sử dụng:

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

2

C, 146 ký tự (khủng khiếp)

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

Tôi không có nhiều kinh nghiệm về C, có lẽ cho thấy ...>. <Tôi có cảm giác rằng các ký tự là số nguyên sẽ hữu ích, nhưng nó thực sự không gây ảnh hưởng lớn như tôi hy vọng ... Mặc dù vậy, tôi sẽ để lại nỗ lực của mình ở đây, vui lòng đề xuất cải tiến.

Phiên bản chưa hoàn thành:

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

Định dạng để chạy từ cửa sổ ngay lập tức:

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

Được chia thành các dòng riêng lẻ (cần được bao quanh bởi Subkhối và cần một printphương thức khác để làm việc trong một mô-đun, do đó làm cho mã dài hơn):

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 byte

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

Giải trình:

Hãy thử trực tuyến.

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

Quai bị, 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["." !

Không phải là một ngôn ngữ hiện đại;) Tôi chắc chắn còn một chút không gian tối ưu hóa ..

Giải trình:

r t 

đọc đầu vào

i t?1A.1"."

kiểm tra xem t phù hợp với đầu vào cần thiết

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

cơ bản cho vòng lặp thông qua bảng chữ cái. Lưu ý rằng quai bị đang đánh giá nghiêm ngặt từ trái sang phải. True = 1, do đó, bạn nhận được 65 hoặc 97 kết quả cho p, # là toán tử modulo

kiểm tra:

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>

(bạn sẽ cần một env thời gian chạy quai bị, tức là bộ nhớ cache để chạy cái này)

chỉnh sửa: tiêu đề đậm

chỉnh sửa: đã có một giải pháp sai, sửa ngay bây giờ. Cảm ơn rtfs và Averroees đã chỉ ra điều này


mã có vẻ dài 79 ký tự chứ không phải 80
Cristian Lupascu

Thật không may, không gian đầu tiên không phải là tùy chọn, vì vậy tôi nghĩ rằng tôi phải đếm nó.
kazamatzuri

Các trường hợp kiểm tra không kết thúc bằng chữ cái tiền lệ của một thông qua như là tham số, phải không?
Averroes

1

JavaScript: 141

c="",b=c[0].charCodeAt()<91,a="abcdefghijklmnopqrstuvwxyz",b&&(a=a.toUpperCase()),a=a.split(c[0]),a=a[1]+a[0],a=c[1]?a.split("").join("\n"):a

Phiên bản đã bình luận:

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

Đây là nỗ lực đầu tiên của tôi với nó với APL.

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

Nếu tôi có thể sử dụng một biến toàn cục duy nhất A←2 26⍴6↓26⌽⎕UCS 65+⍳58thì tôi có thể rút ngắn các điều trên xuống như sau:

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

mổ xẻ

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. 

Hoạt động] $ ./test 5

Hoạt động] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Hoạt động] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Hoạt động] $ ./test g Hijklmnopqrstuvwxyzabcdef

Hoạt động] $ ./test [

Hoạt động] $ ./test a bcdefghijklmnopqrstuvwxyz

Hoạt động] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Cảm ơn bạn cho một số thực phẩm cho suy nghĩ.


Bạn sẽ không thêm dòng mới nếu một '.' được đưa ra. Ngoài ra, bạn không nên xuất bất cứ thứ gì nếu đầu vào không [A-Za-z]\.?, nếu tôi hiểu đúng câu hỏi.
bến

# 1. Oh! tôi đã mải mê làm mã ngắn .. # 2. xem đầu ra của 'test [' nó không in gì cả. @marinus
essbeev

0

Perl, 226 ký tự

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

Bạn có thể định dạng văn bản của bạn để xuất hiện dưới dạng một khối mã. Đọc hướng dẫn ở đây để định dạng bài viết của bạn. Ngoài ra, bạn có thể lưu một số ký tự bằng cách sử dụng tên biến ký tự đơn.
Gareth

1
Một đầu vào không hợp lệ sẽ không in được gì, vì vậy diecâu lệnh của bạn có thể được giảm bớt, tiết kiệm một bó ...
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);}}}

Không nén

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

Đừng quên để thêm một lời giải thích cho câu trả lời của bạn.
Justin

Chương trình này thậm chí không cố gắng chơi theo luật. 1: Nếu chữ cái viết hoa, bạn phải hiển thị bảng chữ cái viết hoa. 2: Bảng chữ cái được in phải kết thúc bằng chữ cái tiền lệ của một chữ cái được chèn. 3: Nếu một tham số additiontal được thêm vào đầu vào (một dấu chấm đơn giản.) Thì bảng chữ cái sẽ được in một chữ cái trong mỗi dòng. Mặt khác, bảng chữ cái nên được in trong cùng một dòng, được ngăn cách bởi một không gian đơn giản. 4: Nếu đầu vào sai được gửi đến chương trình, nó sẽ không in bất cứ thứ gì. Đây là 4 trong số 4 lần bỏ lỡ.
RobIII

^ Khác với điều đó tôi mong bạn hãy xem những bình luận trước đây của tôi ở đây . Bạn có thể thay thế charvới varvà cạo 1 điểm của điểm số của bạn, mất việc .ToCharArray()(một string một char-mảng bạn có thể đã lặp qua!), Mất string[] avì bạn đang phải đối phó với các đối số dòng lệnh, mất không gian tên, liên tục của bạn 'c' nên được đọc từ đầu vào giao diện điều khiển, mất chuỗi bảng chữ cái và sử dụng ASCII, v.v. Thật tuyệt khi bạn chơi, nhưng vui lòng cố gắng thực hiện một nỗ lực tốt; hầu hết các bài nộp của bạn dường như chỉ được trolling.
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));}

Tín dụng cho schnaader cho thủ thuật d + 6 & 31.

http://ideone.com/ts1Gs9


0

Bash: 110 byte

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

Về mặt giải thích, nó khá đơn giản, không có trò ảo thuật nào - đây chỉ là thứ mà bash thực sự rất phù hợp. Về mặt các bit không rõ ràng:

  • {a..z} là một mẹo rất được sử dụng trong bash - nó mở rộng ra a b c d... . Bạn có thể làm tương tự để tạo ra các chuỗi số.
  • Bash có thể kết hợp regex, [[ $1 =~ [a-z] ]] chạy một trận đấu regex với đối số chương trình đầu tiên cho các ký tự từ a đến z. Tương tự như vậy đối với AZ. Bạn cần dấu ngoặc kép cho nó mặc dù,[ không thể làm điều đó.
  • ${1:1:1} nhận được một chuỗi con $ 1 (đối số thứ nhất), một ký tự, dài một ký tự - nghĩa là, nó trả về ký tự thứ hai của chuỗi, thứ mà chúng ta mong đợi là . .
  • sed 's/ /\n/g'regex đơn giản: tìm kiếm và thay thế khoảng trắng bằng dòng mới. Nếu. là ký tự thứ hai của chuỗi, chúng ta chuyển đầu vào này hoặc nếu không ...
  • cat là mẹo cuối cùng ở đây - nếu chúng ta không muốn thay thế khoảng trắng bằng dòng mới, chúng ta sẽ cung cấp stdin cho cat thay vào đó chỉ đơn giản là xuất lại nó.

Đừng quên để thêm một lời giải thích.
Justin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.