Cetak alfabet khusus

20

Tantangan

Tampilkan alfabet dari huruf tertentu yang dibaca dari input konsol. Jika huruf besar, Anda harus menampilkan alfabet huruf besar. Alfabet yang dicetak harus diakhiri dengan huruf preseden dari yang dimasukkan. Jika parameter tambahan ditambahkan ke input (titik sederhana .) alfabet harus dicetak satu huruf di setiap baris. Jika tidak, alfabet harus dicetak pada baris yang sama, dipisahkan oleh spasi sederhana. Jika input yang salah dikirimkan ke program, ia tidak akan mencetak apa pun.

Contoh input:

Memasukkan:

c

Program ouput:

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

Memasukkan

H.

Program ouput:

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
Averroes
sumber
Sage Notebook beroperasi di "level konsol", jadi apakah "input konsol" yang diperlukan dalam hal ini hanya mengetik input ke dalam sel lembar kerja?
res
kode menang terpendek?
ardnew
@ardnew Ya, kode terpendek menang.
Averroes
@res Saya pikir bahwa sementara Anda perlu kode pembacaan input dari beberapa cara itu bisa adil dari perspektif aturan.
Averroes
6
@Averroes Hukuman untuk menggunakan GolfScript adalah jumlah waktu yang diperlukan untuk mempelajari bahasa yang tidak memiliki penggunaan nyata di luar kompetisi semacam ini. Saya tidak berpikir menghukum orang karena menggunakan alat yang tepat untuk pekerjaan itu akan menjadi sangat produktif.
Gareth

Jawaban:

12

GolfScript 48 75 73 70 67 66 63 57 53

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

Demo online:

Memperbarui:

Sekarang aturan terakhir juga diterapkan. Terima kasih kepada Ventero karena menunjukkan masalah ini.

Memperbarui:

Saya menulis ulang kode dari awal dan menemukan cara baru untuk mempersingkat lebih jauh.

Sejarah modifikasi:

.,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]=* 
Cristian Lupascu
sumber
2
Solusi ini tidak mengikuti persyaratan terakhir:If wrong input is send to the program it will not print anything.
Ventero
@Ventero Benar. Saya akan memperbaikinya.
Cristian Lupascu
63 - bagus, kami head2head :), berharap aku bisa mengerti skrip golf;)
bua
Saya merasakan hal yang sama tentang Q. Kerja bagus! ;-)
Cristian Lupascu
+1 luar biasa! bersedia untuk istirahat 50 ;-)?
bua
10

C, 135 129 128 karakter

Sial, begitu banyak angka sihir yang berbeda, tetapi tidak ada cara untuk menghilangkannya.

Harus dijalankan dengan input sebagai parameter program. Sekarang ikuti persyaratan "input salah".

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

Penjelasan:

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

Bagian ini **b+6&31menggunakan fakta bahwa kode ASCII untuk karakter huruf kecil / huruf besar adalah sama jika hanya melihat 5 bit terakhir dan 5 bit sisanya berada dalam kisaran 1..26.

Versi tanpa persyaratan "input salah" (82 karakter):

main(a,b)char**b;{for(b++;++a<28;)printf("%c%c",**b-=**b+6&31?-1:25,1[*b]?10:32);}
schnaader
sumber
Adakah instruksi tentang cara mengompilasinya? Saya mendapatkan kesalahan Segmentasi saat menjalankan.
manatwork
@manatwork tampaknya mengambil input sebagai parameter.
shiona
Ya, memang, diedit untuk menjelaskan. Misalnya jika nama programnya adalah test, sebut seperti test catautest X.
schnaader
Terima kasih, mengerti. C saya tampaknya lebih kasar dari yang saya kira.
manatwork
2
K & R gaya definisi dapat membantu: main(a,b)char**b;{. Juga, orang b++akan membiarkan Anda mengganti *b[1]-> **bdan b[1][1]-> 1[*b].
ugoren
7

Ruby, 72 71 61 karakter

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

Versi ruby ​​ini menggunakan ekspresi reguler untuk memverifikasi input. Untungnya, metode string Ruby succmelakukan sebagian besar pekerjaan untuk kami (termasuk bungkus-sekitar).

Sunting: 61 karakter dengan bantuan chron dan Ventero .

Howard
sumber
Milik saya berakhir terlalu mirip dengan milik Anda sehingga repot memposting secara terpisah. Pendekatan yang sama, tetapi beberapa karakter lebih pendek (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge
2
Dan ini adalah 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- pada dasarnya sama dengan Anda hanya menyalahgunakan $_dan$/
Paul Prestidge
2
@ sink: +=Sebagai gantinya +, Anda bisa meletakkan tanda kurung di sekitar $1?$/:' '.
Ventero
@ sink dan Ventero: Terima kasih. Menambahkan kode Anda ke solusi saya.
Howard
6

Ruby: 127 113 92 (?) Karakter

(Saya tidak dapat menemukan aturan tentang skor penalti menggunakan -p. Menambahkan 1 untuk saat ini. Jika salah, mohon koreksi saya.)

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

Contoh dijalankan:

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
sumber
6

Ruby, 101 95

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

Cobalah online

defhlt
sumber
Tidak mengikuti "Jika input yang salah dikirimkan ke program, ia tidak akan mencetak apa pun."
Matt
bisa menghemat beberapa karakter dengan ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge
@ sink, terima kasih! Bagaimana saya bisa melewatkan itu ..
defhlt
6

GolfScript, 80 72 Karakter

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

Banyak kode yang menguji input yang valid dan opsi "print nothing". Logika sebenarnya hanya 37 karakter.

Uji kasus secara online

Howard
sumber
6

penalti q / k4 66 64 63 60 58 56 + 2

penalti untuk variabel global init, algoritma adalah 56 seperti di bawah ini:

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]
  • ubah dari jika-lain menjadi jika diizinkan mengatur ulang kode dan singkirkan ";" pada akhirnya

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • akhirnya menyingkirkan cek berlebihan ini

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • cetak karakter secara rekursif sebagai gantinya seluruh objek
  • masih tidak dapat keluar dari pembalikan identitas x dalam "." di dua tempat ... :(
  • titik koma pada akhirnya diperlukan, jika tidak fungsi cetak (1 @) akan mencetak nilai kembali ke stdout .... sialan

64:

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

EDIT:

Menambahkan penalti 2 untuk inisialisasi global (x :), sama jika membungkus fungsi ke dalam tanda kurung (seperti yang disarankan slackware)
tidak yakin apakah mengubah namespace harus dihukum juga ... maka itu adalah 3 lainnya

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

Contoh:

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:...
bua
sumber
+1 Kemajuan bagus. Saya akan mencoba mencari cara lain untuk mempersingkat kode saya sekarang.
Cristian Lupascu
Bisakah itu benar-benar disebut k valid jika menggunakan definisi dalam qk? ;-) Juga, jika Anda membungkusnya dalam suatu fungsi, Anda dapat melewatkan langkah setup x: "a", misalnya {$ [...]}
skeevey
@lackwear Anda benar, itu sebabnya ini disebut q / k4 ;-).
bua
6

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

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

Pemakaian:

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

Satu karakter telah ditambahkan ke hitungan untuk nopsi.

Pemotongan terbesar hanya mungkin karena melihat perilaku ++pada karakter dalam jawaban Jon Purdy .

Gareth
sumber
Anda dapat mencukur pasangan karakter dengan menghapus 2 titik koma terakhir
ardnew
@ardnew Terima kasih. :-)
Gareth
1
Hal ini mengesankan
bua
@ Bua Terima kasih, saya masih mencoba menemukan karakter sehingga saya dapat menangkap Anda dan w0lf. :-)
Gareth
s/a.$1/az/untuk menghemat 2 lagi. chop().($2?$/:$")-> chop,$2?$/:$"untuk 4 lainnya
mob
5

Perl, 149 , 167

Memperbarui

  • Menambahkan cek kewarasan.
  • Mengambil saran baru tentang aplikasi pemisah.
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
Thor
sumber
Anda dapat menggantinya $s=($d)?"\n":" ";dengan $s=$d?$/:$";dan mungkin hanya menyingkirkan $ssemuanya
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
sumber
Saya bukan penggemar pembatasan ini, tetapi ada dan program Anda tidak mengikutinya: "Jika input yang salah dikirimkan ke program, ia tidak akan mencetak apa pun."
Matt
Juga, sepertinya Anda mencetak satu karakter lebih dari yang seharusnya. Output contoh adalah 25 karakter.
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":" ";
lortabac
sumber
1
Ini adalah tantangan kode-golf , jadi optimisasi kecepatan dan penggunaan sumber daya tidak diperlukan. Alih-alih menyimpan $v[1]=='.'?"\n":" "hasil dalam variabel $ s, biarkan PHP menghitungnya setiap kali dalam echopernyataan. Dengan begitu Anda dapat menyimpan 6 karakter.
manatwork
1
@manatwork Terima kasih, saya mengubahnya.
lortabac
4

Mathematica 158 159 204 199 183 167 165 162

Kode

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

Pemakaian

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

pemakaian

DavidC
sumber
Kasus penggunaan ketiga adalah f ["H"] atau f ["H."]?
Averroes
Saya harus memperbaiki penanganan ".", Menambahkan 50 karakter ke kode. Tetapi sekarang bekerja sesuai dengan instruksi
DavidC
3

J 43

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

Contoh:

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

opqr tuvwxyzabcdefghijklmn

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

Solusi ini berkembang pada forum pemrograman J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Penulis: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

Penjelasan

Frase J dieksekusi mulai di sebelah kanan, meneruskan hasil yang sedang berjalan ke kiri saat dievaluasi. Karena bersifat interaktif, kita dapat melihat potongan-potongan solusi secara terpisah untuk lebih memahami mereka.

Bagian tengah menghasilkan alfabet huruf besar dan kecil di Unicode:

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

Kata kerja "u:" mengubah argumen hak numerik menjadi karakter Unicode. Argumen numerik dihasilkan dari nilai ASCII untuk karakter huruf besar dan kecil dengan menambahkan angka untuk "A" dan "a" masing-masing ke nilai dari 0 hingga 25 yang dihasilkan oleh "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

Bagian kanan,

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

mencari ke atas (i.) posisi argumen kanan (]) di sebelah kiri ([) - yang merupakan vektor huruf di atas - dan menjatuhkan (}.) satu lagi (>:) daripada angka itu. '' 0 'menerapkan frasa ini untuk argumen 0-dimensional (skalar).

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

Frasa "25 {." Mengambil 25 elemen pertama dari vektor di sebelah kanan.

Frasa kedua dari belakang "1j1 #" di sebelah kiri mereplikasi argumen kanannya sesuai dengan angka di sebelah kiri. Sejumlah sederhana melakukan replikasi sederhana:

   2 # 'ABCD'
AABBCCDD

Namun, bilangan kompleks - ditunjukkan oleh "j" antara bagian nyata dan imajiner - memasukkan elemen isi sesuai dengan bagian imajiner. Di sini kami menunjukkan satu elemen isian dengan elemen di sebelah kanan "j".

   2j1 # 'ABCD'
AA BB CC DD 

Seperti kebanyakan primitif J, kata kerja replikasinya (#) bekerja pada array numerik dengan cara analagous tentang cara kerjanya pada array karakter. Seperti yang ditunjukkan di sini,

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

kita melihat bahwa elemen isi numerik default adalah nol sedangkan untuk karakter itu adalah karakter spasi.

Akhirnya, token paling kiri "|:" memindahkan hasil dari kata kerja sebelumnya ke kanan.

Penjelasan diberikan oleh Devon McCormick. Devon terima kasih.

bob therriault
sumber
+1 Solusi dan penjelasan yang sangat bagus. Saya mempertimbangkan untuk mencobanya di J tetapi tidak dapat menemukan cara yang baik (jalan pendek) untuk memeriksa apakah inputnya valid. Saya pikir saya akan setidaknya dua kali selama ini.
Gareth
Terima kasih Gareth, Jika Anda melihat solusi awal di tautan diskusi, Anda akan melihat banyak dari permulaan kami lebih panjang. Salah satu hal yang rapi yang kami temukan adalah beragam pendekatan yang bisa kami gunakan dengan J. cheers, bob
bob therriault
3

brainfuck, 303

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

Saat ini tidak mendukung If wrong input is send to the program it will not print anythingbagian, dan mungkin bisa lebih pendek. Saya berencana memperbaikinya nanti. Saat ini otak saya terlalu sibuk untuk melanjutkan.

kotak kardus
sumber
2

C, 110

Terkadang mencetak "spasi" antar huruf, kadang tidak.

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

Sedikit lebih mudah dibaca:

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

Berjalan:

$ ./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
shiona
sumber
2

JavaScript, 137

Sayangnya agak bertele-tele ( String.fromCharCodedan 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
sumber
2

Perl, 77 76 70 68

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

Suntingan:

  1. Menyimpan karakter menggunakan regex alih-alih substr.

  2. Disimpan 6 karakter menggunakan mapbukan for.

  3. Disimpan 2 karakter dengan menghilangkan baris terakhir.

Jon Purdy
sumber
3
Bagus, tetapi seperti yang Anda tunjukkan tidak memenuhi persyaratan bahwa input yang tidak valid tidak menghasilkan output. Perbaiki itu dan Anda akan mendapatkan upvote saya.
Gareth
sepertinya tidak berfungsi untuk saya pada perl 5.14.2. juga saya tidak percaya \npada final Anda printdiperlukan, yang akan menghemat beberapa karakter
ardnew
@ardnew: Saya menulisnya di komputer kerja saya, yang memiliki 5.12.3. Akan membunuh \n, terima kasih.
Jon Purdy
2

R, 219

Jelek, lama ... masih bekerja.

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

Pemakaian:

f("a")
f("c.")
f("H")
f("z")
f("Z.")
f("seven")
Paolo
sumber
2

C, 146 karakter (mengerikan)

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

Saya tidak terlalu berpengalaman dalam C, yang mungkin menunjukkan ...>. <Saya punya perasaan bahwa karakter menjadi bilangan bulat akan membantu, tetapi tampaknya tidak membuat dampak sebesar yang saya harapkan ... Saya akan meninggalkan upaya saya di sini, jangan ragu untuk menyarankan perbaikan.

Versi tidak minminasi:

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
sumber
2

VBA 225

Diformat untuk dijalankan dari jendela langsung:

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

Dipecah menjadi garis-garis individual (perlu dikelilingi oleh Subblok dan membutuhkan printmetode yang berbeda untuk bekerja dalam modul, sehingga membuat kode lebih lama):

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

Penjelasan:

Cobalah online.

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
Kevin Cruijssen
sumber
1

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

Bukan bahasa modern;) Saya yakin ada sedikit ruang optimasi yang tersisa ..

Penjelasan:

r t 

baca input

i t?1A.1"."

periksa apakah t cocok dengan input yang diperlukan

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

dasar untuk perulangan melalui alfabet. Perhatikan bahwa gondong benar-benar mengevaluasi dari kiri ke kanan. Benar = 1, jadi Anda mendapatkan 65 atau 97 sebagai hasilnya untuk p, # adalah operator modulo

tes:

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>

(Anda akan memerlukan runtime env mumps, yaitu Caché untuk menjalankan ini ini)

sunting: judul tebal

sunting: punya solusi yang salah, diperbaiki sekarang. Terima kasih kepada rtfs dan Averroees untuk menunjukkan ini

Kazamatzuri
sumber
panjang kode 79 karakter, bukan 80
Cristian Lupascu
sayangnya ruang pertama bukan opsional, jadi saya pikir saya harus menghitungnya.
kazamatzuri
Kasing uji tidak berakhir pada huruf preseden yang dilewatkan sebagai parameter, bukan?
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

Versi yang dikomentari:

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
sumber
0

Ini adalah usaha pertama saya dengan APL.

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

jika saya dapat menggunakan variabel global tunggal A←2 26⍴6↓26⌽⎕UCS 65+⍳58maka saya dapat mempersingkat di atas ke bawah sebagai berikut:

{1 1≡(2⌈⍴⍵)⍴⍵∊'.',,A:⊃(~=/2⍴⍵)⌷(,X,' ')(X←25 1⍴1↓(X⍳⊃⍵)⌽X←(⎕A∊⍨⊃⍵)⌷A)}⍞
Aaron W. Hsu
sumber
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;
}
Carl
sumber
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));}

pembedahan

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. 

Bekerja] $ ./test 5

Bekerja] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Bekerja] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Bekerja] $ ./test g hijklmnopqrstuvwxyzabcdef

Bekerja] $ ./test [

Bekerja] $ ./test a bcdefghijklmnopqrstuvwxyz

Bekerja] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Terima kasih atas makanannya.

essbeev
sumber
Anda tidak menambahkan baris baru jika '.' diberikan. Juga, Anda tidak boleh mengeluarkan apa pun jika inputnya tidak [A-Za-z]\.?, jika saya mengerti pertanyaannya dengan benar.
marinus
# 1. oh! saya asyik membuat kode pendek .. # 2. lihat output dari 'test [' tidak mencetak apa-apa. @marinus
essbeev
0

Perl, 226 karakter

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
sumber
Anda dapat memformat teks Anda agar muncul sebagai blok kode. Baca panduan di sini untuk memformat posting Anda. Selain itu, Anda dapat menyimpan beberapa karakter dengan menggunakan nama variabel karakter tunggal.
Gareth
1
Input yang tidak valid seharusnya tidak mencetak apa pun, sehingga diepernyataan Anda dapat dikurangi, menghemat banyak ...
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);}}}

Tidak terkompresi

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
sumber
Jangan lupa untuk menambahkan penjelasan pada jawaban Anda.
Justin
Program ini bahkan tidak mencoba untuk bermain sesuai aturan. 1: Jika huruf besar, Anda harus menampilkan alfabet huruf besar. 2: Alfabet yang dicetak harus diakhiri dengan huruf preseden dari yang dimasukkan. 3: Jika parameter tambahan ditambahkan ke input (titik sederhana.) Alfabet harus dicetak satu huruf di setiap baris. Jika tidak, alfabet harus dicetak pada baris yang sama, dipisahkan oleh spasi sederhana. 4: Jika input yang salah dikirimkan ke program, ia tidak akan mencetak apa pun. Ini adalah miss 4-out-of-4.
RobIII
^ Selain itu saya mendorong Anda untuk melihat komentar saya sebelumnya di sini . Anda dapat mengganti chardengan vardan mencukur 1 poin dari skor Anda, kehilangan .ToCharArray()(a string adalah char-array yang sudah bisa Anda ulangi!), Kehilangan string[] akarena Anda tidak berurusan dengan argumen baris perintah, kehilangan namespace, Konstanta Anda 'c' harus dibaca dari input konsol, kehilangan string alfabet dan gunakan ASCII sebagai gantinya dll. Ini bagus untuk Anda mainkan, tetapi cobalah untuk melakukan upaya yang layak; sebagian besar kiriman Anda tampaknya hanya memancing.
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));}

Penghargaan untuk schnaader untuk trik d + 6 & 31.

http://ideone.com/ts1Gs9

mattnewport
sumber
0

Bash: 110 byte

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

Dalam hal penjelasan, ini cukup mudah, tidak ada trik sulap - ini hanya sesuatu yang secara intrinsik cocok untuk bash. Dalam hal bit yang tidak jelas:

  • {a..z}adalah trik yang sangat jarang digunakan di bash - itu diperluas ke a b c d.... Anda dapat melakukan hal yang sama untuk menghasilkan urutan numerik.
  • Bash dapat melakukan pencocokan regex, [[ $1 =~ [a-z] ]]menjalankan pencocokan regex terhadap argumen program pertama untuk karakter dari a hingga z. Demikian juga untuk AZ. Anda membutuhkan tanda kurung ganda untuk itu, [tidak bisa melakukannya.
  • ${1:1:1}mendapat substring dari $ 1 (argumen pertama), satu karakter dalam, satu karakter panjang - yaitu, ia mengembalikan karakter kedua dari string, seperti yang kita harapkan ..
  • sed 's/ /\n/g'regex sederhana: mencari dan mengganti spasi dengan baris baru. Jika .karakter kedua dari string, kita masukan pipa untuk ini, atau sebaliknya ...
  • cat adalah trik terakhir di sini - jika kita tidak ingin mengganti spasi dengan baris baru, kita memasukkan stdin ke cat sebagai gantinya yang hanya mengeluarkannya lagi.
Kerusuhan
sumber
Jangan lupa menambahkan penjelasan.
Justin