พิมพ์ตัวอักษรที่กำหนดเอง


20

ความท้าทาย

แสดงตัวอักษรจากตัวอักษรที่กำหนดอ่านจากอินพุตคอนโซล หากตัวอักษรเป็นตัวพิมพ์ใหญ่คุณจะต้องแสดงตัวอักษรตัวพิมพ์ใหญ่ ตัวอักษรที่พิมพ์ต้องลงท้ายด้วยตัวอักษรก่อนหน้าของตัวอักษรที่ใส่ หากเพิ่มพารามิเตอร์เพิ่มเติมให้กับอินพุต (จุดง่าย.) ตัวอักษรควรพิมพ์หนึ่งตัวอักษรในแต่ละบรรทัด มิฉะนั้นตัวอักษรควรจะพิมพ์ในบรรทัดเดียวกันคั่นด้วยช่องว่างที่เรียบง่าย หากอินพุตผิดส่งไปที่โปรแกรมมันจะไม่พิมพ์อะไรเลย

ตัวอย่างอินพุต:

การป้อนข้อมูล:

c

โปรแกรม 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

อินพุต

H.

โปรแกรม 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

Sage Notebook ทำงานที่ "ระดับคอนโซล" ดังนั้นจำเป็นต้องใส่ "คอนโซลอินพุต" ในกรณีนี้เพียงพิมพ์อินพุตลงในเซลล์แผ่นงานหรือไม่
res

รหัสสั้นที่สุดชนะ?
ardnew

@ardnew ใช่รหัสที่สั้นที่สุดชนะ
เฉลี่ย

@res ฉันคิดว่าในขณะที่คุณจำเป็นต้องใช้รหัสการอ่านอินพุตของวิธีการบางอย่างก็สามารถเป็นธรรมจากมุมมองของกฎ
เฉลี่ย

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

@Ventero ถูกต้อง ฉันจะแก้ไขสิ่งนี้
Cristian Lupascu

63 - ความสุขที่เรากำลัง Head2Head :) หวังว่าฉันจะเข้าใจ golfscript;)
บัว

ฉันรู้สึกแบบเดียวกันกับ Q. งานที่ยอดเยี่ยม! ;-)
Cristian Lupascu

+1 ยอดเยี่ยม! ยินดีที่จะทำลาย 50 ;-)?
บัว

10

C, 135 129 128 ตัวอักษร

ห่าเลขเวทย์มนตร์ที่แตกต่างกันมากมาย แต่ไม่มีทางที่จะกำจัดพวกมันได้

จะต้องมีการเรียกใช้กับอินพุตเป็นพารามิเตอร์โปรแกรม ตอนนี้เป็นไปตามข้อกำหนด "การป้อนข้อมูลผิด"

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

คำอธิบาย:

c;                   // Variable that will be used later
main(a,b)char**b;{   // There's one parameter => a = 2, b[1] = the parameter
                     // Wrong input checks: We want...
  if(
     a==2 &&         // 1 parameter and ...
     isalpha(**++b)  // lower- or uppercase letter as parameter,
                     // increase b so we can access it better
     &&              // and ...
     !(c=1[*b]) ||   //   either no further character,
                     //     save the character in c, or...
     (c==46&&!2[*b]) //   a dot as next character and no further characters
    )                // if check succeeded, execute the for loop, else do nothing
  for(;++a<28;)      // This will loop 26 times (2..27)
    printf("%c%c",   // Print two characters
                     // First character to print:
      **b            // We'll print the first character of the parameter,
       -=            // but decrement it before printing
       **b+6&31?     // if the last five bits (31 = 11111b) are not 26 (6 == -26 mod 32)
        -1           //   decrement it by -1 (aka increment it)
        :25,         //   else (char=z/Z) decrement by 25, so we start over at a/A
                     // Second character to print:
      c?             // c is either ASCII 0 or a dot (ASCII 46)
       10            //   dot     -> print a newline
       :32);         //   ASCII 0 -> print a space (ASCII 32)
}

**b+6&31ส่วนหนึ่งใช้ความจริงที่ว่ารหัส ASCII สำหรับตัวพิมพ์เล็ก / ตัวอักษรตัวพิมพ์ใหญ่จะเหมือนกันถ้าเพียง แต่มองไปที่ช่วง 5 บิตและส่วนที่เหลืออีก 5 บิตอยู่ในช่วง 1..26

รุ่นที่ไม่มีข้อกำหนด "การป้อนข้อมูลผิด" (82 ตัวอักษร):

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

คำแนะนำใด ๆ เกี่ยวกับวิธีการรวบรวมมัน? ฉันได้รับการแบ่งกลุ่มผิดพลาดเมื่อทำงาน
จัดการ

@ manatwork ดูเหมือนว่าจะรับอินพุตเป็นพารามิเตอร์
shiona

ใช่แน่นอนแก้ไขเพื่อชี้แจง เช่นถ้าชื่อโปรแกรมtestเรียกมันว่าtest cortest X.
schnaader

ขอบคุณเข้าใจแล้ว ดูเหมือนว่าฉัน C จะมีความเป็นสนิมมากกว่าที่ฉันคิด
จัดการ

2
สไตล์นิยาม K & R main(a,b)char**b;{สามารถช่วย: นอกจากนี้หนึ่งb++จะช่วยให้คุณเปลี่ยน*b[1]-> **bและ->b[1][1] 1[*b]
ugoren

7

Ruby, 72 71 61 ตัวอักษร

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

รุ่นทับทิมนี้ใช้นิพจน์ทั่วไปเพื่อตรวจสอบอินพุต โชคดีที่วิธีสตริงของ Ruby succทำหน้าที่ส่วนใหญ่ให้กับเรา (รวมถึงการล้อมรอบ)

แก้ไข: 61 ตัวอักษรด้วยความช่วยเหลือของChronและVentero


การทำเหมืองสิ้นสุดลงคล้ายกับของคุณมากเกินไปไม่ต้องโพสต์แยกต่างหาก วิธีการเดียวกัน แต่สั้นกว่า (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

@ ประสานและ Ventero: ขอบคุณ เพิ่มรหัสของคุณในโซลูชันของฉัน
ฮาวเวิร์ด

6

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

ลองออนไลน์


ไม่ทำตาม "ถ้าส่งผิดไปยังโปรแกรมมันจะไม่พิมพ์อะไรเลย"
แมตต์

สามารถบันทึกตัวละครสองสามตัวด้วย('a'..'z').to_a=>[*?a..?z]
Paul Prestidge

@ ประสานขอบคุณ! ฉันจะคิดถึงมันได้ยังไง ..
defhlt


6

q / k4 66 64 63 60 58 56 + 2 ลูกจุดโทษ

บทลงโทษสำหรับตัวแปรทั่วโลก init, อัลกอริทึมคือ 56 ดังต่อไปนี้:

56:

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

58:

if[&/x in".",l:(a;A)90>*x;1@/(1_,/|_[0,l?x;l]),'"  \n"@#x]
  • เปลี่ยนจาก if-else เป็นถ้าได้รับอนุญาตให้จัดระเบียบรหัสใหม่และกำจัด ";" ในตอนท้าย

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 .... damn

64:

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

แก้ไข:

เพิ่มบทลงโทษ 2 สำหรับการเริ่มต้นทั่วโลก (x :) เช่นเดียวกันถ้าฟังก์ชั่นการตัดเป็นวงเล็บ (ตามที่แนะนำใน slackware)
ไม่แน่ใจว่าการเปลี่ยนเนมสเปซควรถูกลงโทษเช่นกัน ... จากนั้นเป็นอีก 3

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

ตัวอย่าง:

q)\         - switch interpreter to k4
 \d .Q     - change to native namespace
  x:"c"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
d e f g h i j k l m n o p q r s t u v w x y z a b

  x:"@"
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]    
  x:"H."
  if[&/x in".",l:(a;A)90>*x;1@/1_,/|_[0,l?x;l,'"  \n"@#x]]
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E
F
G
  x:...

+1 ความคืบหน้าดี ฉันจะพยายามหาวิธีอื่นเพื่อย่อรหัสของฉันตอนนี้
Cristian Lupascu

มันสามารถถูกเรียกว่าถูกต้อง k ได้หรือไม่ถ้าใช้นิยามในรูป qk? ;-) นอกจากนี้หากคุณใส่ไว้ในฟังก์ชั่นคุณสามารถข้าม x: "a" ขั้นตอนการตั้งค่าเช่น {$ [... ]}
skeevey

@slackwear คุณพูดถูกนั่นคือเหตุผลที่เรียกว่า q / k4 ;-)
บัว

6

Perl, 131 127 117 112 106 104 102 98 96 92 91 90 93 71 66 65 64 58 ตัวอักษร

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

การใช้งาน:

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

เพิ่มหนึ่งตัวละครในการนับสำหรับnตัวเลือก

ตัดที่ใหญ่ที่สุดเป็นไปได้เพียงเพราะเห็นพฤติกรรมของ++ตัวละครในคำตอบของจอนจัง


คุณสามารถโกนทิ้งสองสามตัวอักษรโดยการลบเครื่องหมายอัฒภาค 2 อันสุดท้าย
ardnew

@ ขอบคุณมาก :-)
Gareth

1
สิ่งนี้น่าประทับใจ
บัว

@Bua ขอบคุณฉันยังคงพยายามค้นหาตัวละครเพื่อที่จะสามารถจับคุณและ w0lf :-)
Gareth

s/a.$1/az/เพื่อประหยัดอีก 2 chop().($2?$/:$")-> chop,$2?$/:$"สำหรับอีก 4
คน

5

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

Python 83

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

ฉันไม่ใช่แฟนของข้อ จำกัด นี้ แต่มีอยู่และโปรแกรมของคุณไม่ปฏิบัติตาม: "หากอินพุตที่ไม่ถูกต้องถูกส่งไปยังโปรแกรมมันจะไม่พิมพ์อะไรเลย"
แมตต์

นอกจากนี้ดูเหมือนว่าคุณจะพิมพ์อักขระหนึ่งตัวมากกว่าที่ควร เอาต์พุตตัวอย่างคือ 25 อักขระ
แมตต์

4

PHP, 120 119 113

<?$v=fgets(STDIN);$f=$c=$v[0];ctype_alpha($c++)||die;for(;$c[0]!=$f;$c=$c[0],$c++)echo$c[0],$v[1]=='.'?"\n":" ";

1
นี่เป็นความท้าทายสำหรับนักกอล์ฟดังนั้นการเพิ่มความเร็วและการใช้ทรัพยากรจึงไม่จำเป็น แทนที่จะเก็บ$v[1]=='.'?"\n":" "ผลลัพธ์ไว้ในตัวแปร $ s ให้ PHP คำนวณทุกครั้งในechoคำสั่ง ด้วยวิธีนี้คุณสามารถสำรอง 6 ตัวอักษร
จัดการ

1
@ การจัดการขอบคุณฉันเปลี่ยนมัน
lortabac

4

Mathematica 158 159 204 199 183 167 165 162

รหัส

f@h_ := Most@RotateLeft[#, Position[#, h][[1, 1]]] &[FromCharacterCode /@ 
        (65~Range~90 + 32 Boole@LowerCaseQ@h)];
g = Characters@# /. {{p_} :> Row[f@p, " "], {p_, "."} :> Column@f@p, _ -> ""} &

การใช้

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

การใช้


กรณีการใช้งานที่สามคือ 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
ฉัน
j
k
l
m
n
o
p
q
r

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

โซลูชันนี้พัฒนาขึ้นในฟอรัมการเขียนโปรแกรม J: http://jsoftware.com/pipermail/programming/2012-August/029072.html

ผู้แต่ง: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault

คำอธิบาย

วลี J จะถูกดำเนินการเริ่มต้นทางด้านขวาผ่านผลลัพธ์ที่กำลังไปทางซ้ายเมื่อได้รับการประเมิน เนื่องจากมันเป็นแบบโต้ตอบเราสามารถดูส่วนของการแก้ปัญหาแยกเพื่อเข้าใจพวกเขา

ส่วนตรงกลางสร้างอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กใน Unicode:

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

กริยา "u:" แปลงอาร์กิวเมนต์ด้านขวาเป็นตัวเลขไปเป็นอักขระ Unicode อาร์กิวเมนต์ตัวเลขถูกสร้างจากค่า ASCII สำหรับอักขระตัวพิมพ์ใหญ่และตัวพิมพ์เล็กโดยการเพิ่มตัวเลขสำหรับ "A" และ "a" แต่ละค่าลงในค่าตั้งแต่ 0 ถึง 25 ที่สร้างโดย "i.26":

   65 97+/i.26
65 66 67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

ส่วนทางขวา

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

เงยหน้าขึ้นมอง (i.) ตำแหน่งของอาร์กิวเมนต์ที่ถูกต้อง (]) ทางด้านซ้าย ([) - ซึ่งเป็นเวกเตอร์ของตัวอักษรด้านบน - และลดลง (}.) อีกหนึ่ง (>:) มากกว่าตัวเลขนั้น '' 0 'ใช้วลีนี้กับอาร์กิวเมนต์ 0-scalar (scalar)

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

วลี "25 {." ใช้ 25 องค์ประกอบแรกของเวกเตอร์ทางด้านขวา

วลีที่ต่อท้าย "1j1 #" ทางซ้ายทำซ้ำอาร์กิวเมนต์ที่ถูกต้องตามหมายเลขด้านซ้าย หมายเลขธรรมดาทำการจำลองแบบง่าย ๆ :

   2 # 'ABCD'
AABBCCDD

อย่างไรก็ตามจำนวนเชิงซ้อน - ระบุโดย "j" ระหว่างส่วนจริงและจินตภาพ - แทรกองค์ประกอบเติมตามส่วนจินตภาพ ที่นี่เราระบุองค์ประกอบเติมหนึ่งโดยหนึ่งไปทางขวาของ "j"

   2j1 # 'ABCD'
AA BB CC DD 

เช่นเดียวกับ primitives J ส่วนใหญ่การทำซ้ำกริยา (#) จะทำงานกับอาร์เรย์ตัวเลขในแบบอะนาล็อกที่คล้ายคลึงกับวิธีการทำงานของอาร์เรย์อักขระ ดังที่แสดงไว้ที่นี่

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

เราจะเห็นว่าองค์ประกอบเติมตัวเลขเริ่มต้นเป็นศูนย์ในขณะที่สำหรับตัวละครมันเป็นตัวละครที่ว่าง

ในที่สุดโทเค็นซ้ายสุด "|:" จะสลับผลลัพธ์ของคำกริยาก่อนหน้าไปทางขวา

คำอธิบายจัดทำโดย Devon McCormick ขอบคุณ Devon


+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

JavaScript, 137

น่าเสียดายที่ verbose เล็กน้อย ( String.fromCharCodeและcharCodeAt)

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

2

เพิร์ล 77 76 70 68

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

การแก้ไข:

  1. ที่บันทึกไว้โดยใช้ตัวอักษร regex substrแทน

  2. ที่บันทึกไว้ 6 ตัวอักษรที่ใช้แทนmapfor

  3. บันทึก 2 ตัวอักษรโดยไม่ต้องขึ้นบรรทัดใหม่


3
ดีมาก แต่เนื่องจากคุณได้ชี้ให้เห็นว่ามันไม่เป็นไปตามข้อกำหนดที่อินพุตที่ไม่ถูกต้องไม่ให้เอาต์พุต แก้ไขปัญหานั้นแล้วคุณจะได้รับ upvote ของฉัน
Gareth

ดูเหมือนจะไม่ทำงานสำหรับฉันใน perl 5.14.2 นอกจากนี้ฉันไม่เชื่อว่า\nในรอบสุดท้ายของคุณprintเป็นสิ่งจำเป็นซึ่งจะช่วยประหยัดตัวอักษรสองสาม
ardnew

@ardnew: ฉันเขียนไว้ในคอมพิวเตอร์ที่ทำงานของฉันซึ่งมี 5.12.3 จะฆ่า\nขอบคุณ
Jon Purdy

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

Java 8, 127 ไบต์

a->{String r="",d=a.length>1?"\n":" ";char c=a[0],C=c;for(;++c<(c<97?91:123);r+=c+d);for(c=C<97?64:'`';++c<C;r+=c+d);return r;}

คำอธิบาย:

ลองออนไลน์

a->{                        // Method with character-array parameter and String return-type
  String r="",              //  Result-String, starting empty
         d=a.length>1?      //  If the length of the input is larger than 1
            "\n"            //   Set the delimiter to a new-line
           :                //  Else:
            " ";            //   Set the delimiter to a space
  char c=a[0],              //  Get the input letter
       C=c;                 //  And create a copy of it
  for(;++c<(c<97?91:123);   //  Loop from this letter + 1 to (and including) 'Z'/'z'
    r+=c+d);                //   And append the result with a letter + the delimiter
  for(c=C<97?64:'`';++c<C;  //  Loop again from 'A'/'a' to (and excluding) the input-letter
    r+=c+d);                //   And append the result with a letter + the delimiter
  return r;}                //  Return the result

1

คางทูม, 91 , 86 , 82 , 79 , 76

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

ไม่ใช่ภาษาที่ทันสมัย;) ฉันแน่ใจว่ามีพื้นที่เพิ่มประสิทธิภาพเหลืออยู่เล็กน้อย ..

คำอธิบาย:

r t 

อ่านอินพุต

i t?1A.1"."

ตรวจสอบว่า t ตรงกับอินพุตที่ต้องการ

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

พื้นฐานสำหรับการวนซ้ำผ่านตัวอักษร โปรดทราบว่าคางทูมจะประเมินจากซ้ายไปขวาอย่างเคร่งครัด True = 1 ดังนั้นคุณจะได้ 65 หรือ 97 เป็นผลให้ p, # เป็นตัวดำเนินการโมดูโล

การทดสอบ:

USER>d ^golf
d.e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
a
b
c

USER>d ^golf
tuvwxyzabcdefghijklmnopqrs
USER>d ^golf
h.i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
a
b
c
d
e
f
g

USER>d ^golf
hallo
USER>

(คุณต้องมี mumps runtime env คือCachéเพื่อทำสิ่งนี้)

แก้ไข: หัวเรื่องตัวหนา

แก้ไข: มีวิธีแก้ไขที่ไม่ถูกต้องแก้ไขในขณะนี้ ขอบคุณ rtfs และ Averroees ที่ชี้เรื่องนี้ออกมา


รหัสดูเหมือนจะมีความยาว 79 ตัวอักษรไม่ใช่ 80
Cristian Lupascu

น่าเสียดายที่พื้นที่แรกไม่ใช่ตัวเลือกดังนั้นฉันคิดว่าฉันต้องนับมันด้วย
kazamatzuri

กรณีทดสอบไม่ได้จบลงในตัวอักษรก่อนหน้าของสิ่งที่ส่งผ่านเป็นพารามิเตอร์ใช่หรือไม่
เฉลี่ย

1

JavaScript: 141

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

รุ่นที่แสดงความคิดเห็น:

c="", //write input here (examples "a", "B", "c.", "D.")
b=c[0].charCodeAt()<91, //true for upperC, false for lowerC
a="abcdefghijklmnopqrstuvwxyz", //the abc
b&&(a=a.toUpperCase()), //if upper, turn main string to upperC
a=a.split(c[0]), //split by the first char of input
a=a[1]+a[0], //swap the two parts
a=c[1]?a.split("").join("\n"):a //if input second char, add breaklines in between
//the output is inside 'a'

jsFiddle DEMO


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 [

การทำงาน] $ ./test a bcdefghijklmnopqrstuvwxyz

การทำงาน] $ ./test Z ABCDEFGHIJKLMNOPQRSTUVWXY


ขอบคุณสำหรับอาหารสำหรับความคิด


คุณไม่ได้เพิ่มบรรทัดใหม่หากมี '.' ได้รับ นอกจากนี้คุณไม่ควรแสดงผลใด ๆ หากอินพุตไม่ใช่[A-Za-z]\.?ถ้าฉันเข้าใจคำถามที่ถูกต้อง
marinus

# 1 โอ้! ฉันมุ่งมั่นในการทำให้รหัสสั้น .. # 2 ดูผลลัพธ์ของ 'test [' มันไม่ได้พิมพ์อะไรเลย @marinus
essbeev

0

Perl, 226 ตัวอักษร

die "Invalid input " if $ARGV[0] !~ /[a-z]\.?/i;
@listA=(a...z);
$index=ord(lc(substr($ARGV[0],0,1)))-97;
print join(substr($ARGV[0],1) ? "\n" : " ",map{$ARGV[0] =~ /[A-Z]/?uc $_:$_}(@listA[$index+1...25],@listA[0...$index]));

คุณสามารถจัดรูปแบบข้อความของคุณเพื่อให้ปรากฏเป็นบล็อครหัส อ่านคำแนะนำที่นี่เพื่อจัดรูปแบบโพสต์ของคุณ นอกจากนี้คุณสามารถบันทึกอักขระบางตัวได้โดยใช้ชื่อตัวแปรอักขระเดียว
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-out-of-4
RobIII

^ อื่น ๆ กว่าที่ผมอยากให้คุณดูที่ความคิดเห็นก่อนหน้านี้ของฉันที่นี่ คุณสามารถแทนที่charด้วยvarและโกน 1 คะแนนของคะแนนของคุณปล่อย.ToCharArray()(a string เป็น char-array ที่คุณสามารถทำซ้ำไปแล้ว!), สูญเสียstring[] aเนื่องจากคุณไม่ได้จัดการกับอาร์กิวเมนต์บรรทัดคำสั่ง, สูญเสีย namespace, ค่าคงที่ของคุณ 'c' ควรอ่านจากอินพุตคอนโซลสูญเสียสตริงตัวอักษรและใช้ ASCII แทนเป็นต้นมันยอดเยี่ยมมากที่คุณเล่น แต่โปรดพยายามอย่างดี การส่งของคุณส่วนใหญ่ดูเหมือนจะหลอกล่อเท่านั้น
RobIII


0

Bash: 110 ไบต์

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

ในแง่ของการอธิบายมันค่อนข้างตรงไปตรงมาไม่มีเทคนิคมายากล - นี่เป็นเพียงสิ่งที่ทุบตีนั้นเหมาะสำหรับการใช้งานภายใน ในแง่ของบิตที่ไม่ชัดเจน:

  • {a..z}เป็นเคล็ดลับป้อแป้มากในการทุบตี - a b c d...มันจะขยาย คุณสามารถทำเช่นเดียวกันเพื่อสร้างลำดับตัวเลข
  • Bash สามารถทำการจับคู่ regex [[ $1 =~ [a-z] ]]รันการจับคู่ regex กับอาร์กิวเมนต์โปรแกรมแรกสำหรับตัวละครจาก a ถึง z เช่นเดียวกันกับ AZ คุณจำเป็นต้องใช้วงเล็บเหลี่ยมสองชั้น แต่[ไม่สามารถทำได้
  • ${1:1:1}ได้รับการย่อยของ $ 1 (อาร์กิวเมนต์แรก) ตัวละครตัวหนึ่งในตัวละครตัวหนึ่งยาว - .นั่นคือมันจะกลับตัวอักษรสองของสตริงที่สิ่งที่เราคาดหวังว่าจะ
  • sed 's/ /\n/g'ง่าย regex: ค้นหาและแทนที่ช่องว่างด้วยการขึ้นบรรทัดใหม่ ถ้า.เป็นตัวละครตัวที่สองของสตริงเราจะใส่ท่อเข้าไปที่นี่หรืออย่างอื่น ...
  • cat เป็นเคล็ดลับสุดท้ายที่นี่ - หากเราไม่ต้องการแทนที่ช่องว่างด้วยการขึ้นบรรทัดใหม่เราป้อน stdin เพื่อ cat แทนซึ่งจะแสดงผลลัพธ์ออกมาอีกครั้ง

อย่าลืมเพิ่มคำอธิบาย
Justin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.