Özel alfabe yazdır


20

Meydan okuma

Konsol girişinden okunan belirli bir harfin alfabesini görüntüleyin. Harf büyükse, büyük harfli alfabeyi görüntülemeniz gerekir. Basılan alfabe eklenen sözcüğün emsal harfiyle bitmelidir. Girişe ek bir parametre eklenirse (basit bir nokta .) alfabe her satıra bir harf yazdırılmalıdır. Aksi takdirde, alfabe basit bir boşlukla ayrılmış aynı satıra yazdırılmalıdır. Programa yanlış giriş gönderilirse hiçbir şey yazdırılmaz.

Giriş örnekleri:

Giriş:

c

Program çıkışı:

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

Giriş

H.

Program çıkışı:

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 "konsol düzeyinde" çalışır, bu nedenle gerekli "konsol girişi" bu durumda sadece girdiyi bir çalışma sayfası hücresine yazmak mı?
res

en kısa kod kazanır mı?
ardnew

@ardnew Evet, en kısa kod kazanır.
Averroes

@res Bence bir şekilde giriş okumasını kodlamanız gerekse de kurallar açısından adil olabileceğini düşünüyorum.
Averroes

6
@Averroes GolfScript kullanmanın cezası, bu tür bir rekabetin dışında gerçek bir kullanımı olmayan bir dili öğrenmek için geçen süredir. İnsanları iş için doğru aracı kullandıkları için cezalandırmanın çok verimli olacağını düşünmüyorum.
Gareth

Yanıtlar:


12

GolfScript 48 75 73 70 67 66 63 57 53

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

Çevrimiçi demolar:

Güncelleme:

Şimdi son kural da uygulanmaktadır. Konuyu işaret ettiği için Ventero'ya teşekkürler .

Güncelleme:

Kodu sıfırdan yeniden yazdım ve daha da kısaltmanın yeni yollarını buldum.

Değişikliklerin geçmiş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
Bu çözüm son gereksinimi karşılamamaktadır:If wrong input is send to the program it will not print anything.
Ventero

@Ventero Doğru. Bunu düzeltirim.
Cristian Lupascu

63 - güzel, biz head2head :), golfscript anlayabiliyorum diliyorum;)
bua

S. Büyük iş için de aynı şekilde hissediyorum. ;-)
Cristian Lupascu

+1 harika! 50 ;-) kırmaya istekli misiniz?
bua

10

C 135 129 128 karakter

Kahretsin, birçok farklı sihirli sayı, ama onlardan kurtulmanın bir yolu yok.

Program parametresi olarak giriş ile çalıştırılmalıdır. Şimdi "yanlış giriş" gereksinimini izliyor.

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

Açıklama:

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

Bu **b+6&31bölüm, yalnızca son 5 bite bakıldığında ve kalan 5 bit 1..26 aralığındaysa, küçük harf / büyük harf karakteri için ASCII kodlarının aynı olması gerçeğini kullanır.

"Yanlış giriş" gereksinimi olmayan sürüm (82 karakter):

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

Nasıl derleneceğine dair bir talimat var mı? Çalışırken Segmentasyon hatası alıyorum.
manatwork

@manatwork girdiyi parametre olarak alıyor gibi görünüyor.
shiona

Evet, gerçekten, açıklığa kavuşturmak için düzenlendi. Örneğin, program adı ise test, test cya datest X.
schnaader

Teşekkürler, anladım. C'm düşündüğümden daha kötü görünüyor.
manatwork

2
K & F tanım tarzı yardımcı olabilir: main(a,b)char**b;{. Ayrıca, -> ve -> b++yerine geçmenize izin verilir . *b[1]**bb[1][1]1[*b]
ugoren

7

Ruby, 72 71 61 karakter

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

Bu yakut sürümü, girişi doğrulamak için normal bir ifade kullanır. Neyse ki, Ruby string yöntemi succbizim için işin çoğunu yapar (etrafı sarar).

Düzenleme: yardımıyla 61 karakter Chron ve Ventero .


Benimki, yayınlarını rahatsız etmek için seninkine çok benzedi. Aynı yaklaşım, ancak birkaç karakter daha kısa (65):c=gets[0];25.times{$><<c.next![-1]+($1?$/:' ')}if~/^[a-z](\.)?$/i
Paul Prestidge

2
Ve bu 62: gets;25.times{$><<$_=$_.next[0]+($1?$/:' ')}if~/^[a-z](\.)?$/i- temelde seninki ile aynı derecede kötüye kullanım $_ve$/
Paul Prestidge

2
@chron: +=Bunun yerine +parantezleri bırakabilirsiniz $1?$/:' '.
Ventero

@chron ve Ventero: Teşekkür ederim. Kodumu çözümüme ekledim.
Howard

6

Yakut: 127 113 (?) 92 karakter

(Kullanımdaki ceza puanı ile ilgili kuralı bulamıyorum -p. Şimdilik 1 eklendi. Eğer yanlışsa, lütfen beni düzeltin.)

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

Örnek çalışma:

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

Yakut, 101 95

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

Çevrimiçi deneyin


"Programa yanlış giriş gönderilirse hiçbir şey yazdırılmaz."
Matt

ile birkaç karakter kurtarabilir ('a'..'z').to_a=>[*?a..?z]
Paul Prestidge

@chron Teşekkürler! Bunu nasıl özleyebilirim ..
defhlt

6

GolfScript, 80 72 Karakter

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

Kodun birçoğu geçerli girdi ve "hiçbir şey yazdır" seçeneği için test yapıyor. Gerçek mantık yalnızca 37 karakterdir.

Online test senaryoları


6

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

küresel değişken init için ceza, algoritma aşağıdaki gibi 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]
  • kodu yeniden düzenlemeye ve ";" sonunda

60:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'"  \n"@#x;
  • sonunda bu gereksiz kontrolden kurtuldu

63:

1@/$[&/x in".",l:(a;A)90>*x;1_,/|_[0,l?x;l];" "],'" \n""."in x; 
  • tüm nesneler yerine karakterleri özyinelemeli olarak yazdırma
  • "" içindeki kimlik karşılaştırması x'i yine de kaldıramıyor . iki yerde ... :(
  • sonunda noktalı virgül gereklidir, aksi takdirde yazdırma işlevi (1 @) dönüş değerini stdout'a yazdırır.

64:

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

DÜZENLE:

Küresel başlatma için 2 ceza eklendi (x :), işlev parantez içine alınıyorsa (slackware'in önerdiği gibi),
ad alanının değiştirilmesinin de cezalandırılması gerekip gerekmediğinden emin değilim ... o zaman başka bir 3

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

Örnek:

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 İyi ilerleme. Şimdi kodumu kısaltmanın başka bir yolunu bulmaya çalışacağım.
Cristian Lupascu

Eğer qk'deki tanımları kullanıyorsa gerçekten geçerli k olarak adlandırılabilir mi? ;-) Ayrıca, bir işleve
sarırsanız

@slackwear haklısın, bu yüzden q / k4 ;-) denir.
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

Kullanımı:

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

nSeçenek için sayıya bir karakter eklendi .

En büyük kesim sadece Jon Purdy'nin cevabındaki++ karakterlerin davranışını görmesi nedeniyle mümkün oldu .


Son 2 noktalı virgül kaldırarak birkaç karakter tıraş olabilir
ardnew

@ardnew Teşekkürler. :-)
Gareth

1
bu şey etkileyici
bua

@bua Teşekkürler, seni ve w0lf'i yakalayabilmem için hala karakterleri bulmaya çalışıyorum. :-)
Gareth

s/a.$1/az/2 tasarruf daha. chop().($2?$/:$")-> chop,$2?$/:$"4 daha için
mafya

5

Perl, 149 , 167

Güncelleştirme

  • Sağlık kontrolü eklendi.
  • Ayırıcı uygulaması hakkında yeni bir öneri aldı.
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

Eğer yerini alabilir $s=($d)?"\n":" ";ile $s=$d?$/:$";ve belki de sadece kurtulmak $stamamen
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

Ben bu kısıtlamanın bir hayranı değilim, ama var ve program takip etmez: "Eğer programa yanlış giriş gönderilirse hiçbir şey yazdırmaz."
Matt

Ayrıca, bir karakterden daha fazla yazdırmanız gerektiği anlaşılıyor. Örnek çıktı 25 karakterdir.
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
Bu bir kod golf zorluğudur, bu nedenle hız ve kaynak kullanımı optimizasyonlarına gerek yoktur. $v[1]=='.'?"\n":" "Sonuçlarını $ s değişkeninde saklamak yerine , echoifadede her seferinde PHP'nin hesaplamasına izin verin . Bu şekilde 6 karakter ayırabilirsiniz.
manatwork

1
@manatwork Teşekkür ederim, değiştirdim.
lortabac

4

Mathematica 158 159 204 199 183 167 165 162

kod

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

kullanım

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

kullanım


Üçüncü kullanım durumu f ["H"] veya f ["H"]?
Averroes

Ben koda 50 karakter ekleyerek, "." İşleme düzeltmek zorunda kaldı. Ama şimdi talimatlara göre çalışıyor
DavidC

3

J 43

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

Örnekler:

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

Bu çözüm J programlama forumunda gelişti: http://jsoftware.com/pipermail/programming/2012-August/029072.html

Yazar: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

açıklama

J cümleleri sağdan başlayarak yürütülür ve devam eden sonucu değerlendirilirken sola aktarılır. Etkileşimli olduğundan, daha iyi anlamak için çözüm parçalarına ayrı ayrı bakabiliriz.

Orta kısım Unicode'da büyük ve küçük harf alfabe oluşturur:

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

"U:" fiili, sayısal sağ bağımsız değişkenini Unicode karakterlere dönüştürür. Sayısal argüman, büyük ve küçük harf karakterler için ASCII değerlerinden, her biri "i.26" tarafından oluşturulan 0 ile 25 arasındaki değerlere "A" ve "a" sayıları eklenerek oluşturulur:

   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

Sağ kısım,

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

sağdaki argümanın (]) solundaki ([) - yukarıdaki harflerin vektörü olan konumunu arar (i.) ve bu sayıdan bir (>:) daha fazla düşer (>.). '0' bu cümleyi 0 boyutlu (skaler) argümanlara uygular.

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

"25 {." İfadesi, sağdaki vektörün ilk 25 öğesini alır.

Soldaki sondan bir önceki "1j1 #" ifadesi, sağdaki bağımsız değişkeni soldaki sayıya göre çoğaltır. Basit bir sayı basit bir çoğaltma yapar:

   2 # 'ABCD'
AABBCCDD

Bununla birlikte, gerçek ve hayali kısımlar arasında "j" ile gösterilen karmaşık bir sayı, hayali kısma göre bir dolgu elemanı ekler. Burada bir dolgu elemanını "j" nin sağındaki ile belirtiyoruz.

   2j1 # 'ABCD'
AA BB CC DD 

Çoğu J ilkelinde olduğu gibi, çoğaltma fiili (#), karakter dizileri üzerinde nasıl çalıştığına benzer bir şekilde sayısal diziler üzerinde çalışır. Burada gösterildiği gibi,

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

varsayılan sayısal dolgu öğesinin sıfır olduğunu, karakterler için ise boşluk karakteri olduğunu görüyoruz.

Son olarak, en soldaki belirteç "|:" önceki fiillerin sonucunu sağa aktarır.

Devon McCormick tarafından sağlanan açıklama. Teşekkürler Devon.


+1 Gerçekten güzel bir çözüm ve açıklama. J denemeyi düşündüm ama girişin geçerli olup olmadığını kontrol etmek için iyi bir yol (kısa bir yol) anlayamadım. Bence benimki bundan en az iki kat daha uzun olurdu.
Gareth

Teşekkürler Gareth, Tartışma bağlantısındaki ilk çözümlere bakarsanız, başlangıçlarımızın çoğunun daha uzun olduğunu göreceksiniz. Bulduğumuz düzgün şeylerden biri de J. tezahüratları, bob ile kullanabileceği yaklaşımların çeşitliliği oldu
bob therriault

3

beyin sapı, 303

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

Şu anda If wrong input is send to the program it will not print anythingparçayı desteklemiyor ve muhtemelen daha kısa olabilir. Daha sonra düzeltmeyi planlıyorum. Şu anda beynim devam edemeyecek kadar küstah


2

C, 110

Bazen harfler arasına "boşluk" yazar, bazen yazdırmaz.

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

Çok daha okunaklı:

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

Koşar:

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

Ne yazık ki biraz ayrıntılı ( String.fromCharCodeve charCodeAt).

for(x=b=(n=prompt(m={122:97,90:65})).charCodeAt(r='');/^[a-z]\.?$/i.test(n)&&(x=m[x]||x+1)!=b;)r+=String.fromCharCode(x)+(n[1]?"\n":" ");

2

Perl, 77 76 70 68

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

Düzenlemeler:

  1. Bunun yerine regex kullanarak bir karakter kaydetti substr.

  2. Kullanılarak 6 karakter Kaydedilen mapyerine for.

  3. Son satırsonu atılarak 2 karakter kaydedildi.


3
Güzel, ama belirttiğiniz gibi, geçersiz girdinin çıktı vermemesi gerekliliğini karşılamıyor. Bunu düzeltin ve benim oyumu alacaksınız.
Gareth

5.14.2 üzerinde benim için çalışmıyor gibi görünüyor. Ayrıca i dont \nfinal print, bir kaç karakter kurtaracak gerekli olduğuna inanmıyorum
ardnew

@ardnew: 5.12.3 olan iş bilgisayarımda yazdım. Öldürecek \n, teşekkürler.
Jon Purdy

2

R, 219

Çirkin, uzun ... hala çalışıyor.

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

Kullanımı:

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

2

C, 146 karakter (korkunç)

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'de çok deneyimli değilim, muhtemelen gösteriyor ...>. <Tamsayı olan karakterlerin yararlı olacağına dair bir his vardı, ama aslında umduğum kadar büyük bir etki yaratmadı ... Yine de girişimimi burada bırakacağım, iyileştirme önermekten çekinmeyin.

Sonlandırılmamış sürüm:

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

Hemen pencereden çalışacak şekilde biçimlendirilmiş:

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

Ayrı satırlara bölünür ( Subblokla çevrelenmelidir ve printbir modülde çalışmak için farklı bir yönteme ihtiyaç duyar , böylece kodu daha uzun hale getirir):

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 bayt

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çıklama:

Çevrimiçi deneyin.

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

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

Böyle modern bir dil değil;) Eminim biraz optimizasyon alanı kalmıştır ..

Açıklama:

r t 

girişi oku

i t?1A.1"."

t'nin gerekli girdiyle eşleşip eşleşmediğini kontrol et

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

Alfabenin içinden döngü için temel. Kabakulakların soldan sağa katı bir şekilde değerlendirildiğini unutmayın. Doğru = 1, böylece p için 65 veya 97 elde edersiniz, # modulo operatörüdür

testler:

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>

(bunu yapmak için kabakulak çalışma zamanı env'sine, yani Caché'ye ihtiyacınız olacak)

düzenleme: kalın başlık

edit: şimdi düzeltilmiş yanlış bir çözüm vardı. Bunu işaret ettikleri için rtfs ve Averroees'e teşekkürler


kod 79 karakter uzunluğunda, 80 değil uzunluğunda görünüyor
Cristian Lupascu

ne yazık ki ilk alan isteğe bağlı değil, bu yüzden saymak zorunda olduğunu düşündüm.
kazamatzuri

Test senaryoları parametre olarak iletilen emsal harfle bitmez, değil mi?
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

Yorumlanan sürüm:

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

İşte APL ile ilk denemem.

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

Eğer tek bir global değişken kullanabilirsem, A←2 26⍴6↓26⌽⎕UCS 65+⍳58o zaman yukarıdakileri kısaltabilirim:

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

teşrih

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. 

Çalışır] $ ./test 5

Çalışır] $ ./test W XYZABCDEFGHIJKLMNOPQRSTUV

Çalışır] $ ./test M NOPQRSTUVWXYZABCDEFGHIJKL

Çalışır] $ ./test g hijklmnopqrstuvwxyzabcdef

Çalışır] $ ./test [

Çalışır] $ ./test a bcdefghijklmnopqrstuvwxyz

Çalışır] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


Düşünce için yiyecek için teşekkür ederim.


Bir '.' verilmiş. Ayrıca, giriş doğru değilse [A-Za-z]\.?, soruyu doğru anladıysam hiçbir şey çıkarmamalısınız .
marinus

# 1. ah! kısa kod yapımında dalmış .. # 2. 'test [' in çıktısına bakın hiçbir şey yazdırmıyor. @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]));

Metninizi kod bloğu olarak görünecek şekilde biçimlendirebilirsiniz. Yayınlarınızı biçimlendirmek için buradaki kılavuzu okuyun . Ayrıca, tek karakter değişkeni adlarını kullanarak bazı karakterleri kaydedebilirsiniz.
Gareth

1
Geçersiz bir girdi hiçbir şey yazdırmamalıdır, bu nedenle die
ifadeniz

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

sıkıştırılmamış

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

Cevabınıza bir açıklama eklemeyi unutmayın.
Justin

Bu program bile kurallara göre oynamaya bile çalışmaz. 1: Harf büyük harfse, büyük harfli alfabeyi görüntülemeniz gerekir. 2: Basılan alfabe eklenen sözcüğün emsal harfiyle bitmelidir. 3: Girdiye ek bir parametre eklenirse (basit bir nokta.) Alfabe her satıra bir harf yazdırılmalıdır. Aksi takdirde, alfabe basit bir boşlukla ayrılmış aynı satıra yazdırılmalıdır. 4: Programa yanlış giriş gönderilirse hiçbir şey yazdırılmaz. Bu 4'ün 4'ü özledim.
RobIII

^ Bunun dışında buradaki önceki yorumlarıma bir göz atmanızı tavsiye ediyorum . Sen yerini alabilir charile vargevşek, puanınızı ve tıraş 1 puan .ToCharArray()(a string ise , kaybedecek zaten yinelerler üzerinde! Bir karakter-dizi) string[] a, Kişisel sabiti 'c' ad, sen komut satırından ile ilgili değiliz çünkü kaybedecek konsol girişinden okunmalı, alfabe dizesini kaybetmeli ve bunun yerine ASCII kullanmalısınız. Oynamanız harika, ama lütfen iyi bir çaba göstermeye çalışın; gönderilerinizin çoğu yalnızca trolling yapıyor gibi görünüyor.
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 numarası için schnaader'a teşekkür ederiz.

http://ideone.com/ts1Gs9


0

Bash: 110 bayt

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

Açıklama açısından, oldukça basit, sihirli hileler yok - bu sadece bash'ın kendiliğinden uygun olduğu bir şey. Açık olmayan bitler açısından:

  • {a..z}bash'da çok az kullanılan bir numaradır - genişler a b c d.... Sayısal diziler oluşturmak için de aynısını yapabilirsiniz.
  • Bash normal ifade eşleştirmesi yapabilir, a'dan [[ $1 =~ [a-z] ]]z'ye kadar olan karakterler için ilk program bağımsız değişkenine karşı normal ifade eşleşmesi gerçekleştirir. Aynı şekilde AZ için. Bunun için çift köşeli parantezlere ihtiyacınız var, [yapamazsınız.
  • ${1:1:1}$ 1 (ilk argüman), bir karakter, bir karakter uzunluğunda bir alt dize alır - yani, dizenin ikinci karakterini, olmasını beklediğimiz döndürür ..
  • sed 's/ /\n/g'basit normal ifade: boşlukları arar ve yeni satırlarla değiştirir. Eğer .bu veya başka dize, biz boru girişinin ikinci karakteridir ...
  • cat buradaki son numara - boşlukları yeni satırlarla değiştirmek istemiyorsak, stdin'i kediye besliyoruz, bunun yerine tekrar çıktı.

Bir açıklama eklemeyi unutmayın.
Justin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.