เขียนโปรแกรมที่ดำเนินการผสมตัวอักษรกำลังดุร้ายจนกว่าจะพบคำว่า "รหัสผ่าน"


16

โปรแกรมควรพิมพ์ตัวอักษรทุกตัวรวมกัน (ตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่มันไม่สำคัญ) ตามลำดับตัวอักษร มันต้องเริ่มต้นด้วยและการรวมกันพิมพ์สุดท้ายที่ควรจะเป็นapassword

ผลลัพธ์ควรเป็น:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password

2
ตัวคั่นต้องเป็นช่องว่างหรือฉันสามารถใช้บรรทัดใหม่ได้หรือไม่
Ilmari Karonen

ใช่คุณทำได้มันเป็นเพียงการเปลี่ยนแปลงเล็กน้อย
ST3

คำตอบ:


32

Perl, 19 ตัวอักษร

say for a..password

ใช้บรรทัดใหม่เป็นตัวคั่นตามคำชี้แจงด้านบน ทำงานด้วยperl -M5.010(หรือเพียงperl -E 'say for a..password') เพื่อเปิดใช้งานsayคุณสมบัติPerl 5.10+ ต่อเมตานี้จะไม่นับเป็นตัวอักษรพิเศษ

(หากคุณยืนยันว่าช่องว่างเป็นตัวคั่น$,=$";say a..passwordมีความยาวเพียงสองตัวอักษรอย่างไรก็ตามมันก็ช้ามากและสิ้นเปลืองหน่วยความจำจนถึงจุดที่ใช้ไม่ได้ในทางปฏิบัติเนื่องจากมันพยายามสร้างรายการทั้งหมดในหน่วยความจำก่อนที่จะพิมพ์)


18

Ruby, 33 chars (เวอร์ชั่นที่เหมาะสม แต่ยาวกว่า)

?a.upto('password'){|c|$><<c+' '}

ฉันชอบ 'a'.upto('password') ; มันบอกคุณอย่างชัดเจนว่ากำลังทำอะไรอยู่ รูบีนั้นยิ่งใหญ่และแสดงออกอย่างนั้น:D

แน่นอน, print c,' 'จะมีความชัดเจนมากขึ้น แต่การใช้$>จะสั้นกว่าสองอักขระ

ทับทิม, 29 25 chars (เวอร์ชั่นช้า)

$><<[*?a..'password']*' '

อันนี้สั้นกว่า แต่มันพิมพ์โทเค็นทั้งหมดในครั้งเดียวดังนั้นจึงใช้เวลานานในการรัน!


1
นิสัยดีโดยเฉพาะตอนแรก
Cary Swoveland

ในเวอร์ชั่นช้า(?a..'password').to_aสามารถย่อให้เหลือ[*?a..'password']
Paul Prestidge

6

Perl, 33 32 24 ตัวอักษร

ทางออกใน 32 ตัวอักษร:

$_=a;print$_++,$"until/passwore/

ไม่มากที่จะพูดเกี่ยวกับเรื่องนี้ ฉันสามารถลดได้ถึง 27 ตัวอักษรถ้าฉันสามารถใช้การขึ้นบรรทัดใหม่แทนการเว้นวรรคเพื่อแยกรายการ

Ilmari Karonen ชี้ให้เห็นว่า..การโทรภายใน++ดังนั้นทางออกที่ดีกว่า (25 ตัวอักษร) จะเป็น:

print$_,$"for a..password

ด้วยการใช้ประโยชน์จากตัวเลือกบรรทัดคำสั่งของ Perl ต่อไปนี้เป็นวิธีแก้ปัญหาที่เทียบเท่า 24 อักขระ:

perl -l40e 'print for a..password'

กฎสำหรับการนับธง perlอยู่ที่นี่สำหรับผู้ที่ไม่คุ้นเคยกับพวกเขา

แน่นอนว่าโซลูชัน 21 ตัวของ Ilmariนั้นสั้นกว่า แต่ก็ต้องใช้เครื่องที่สามารถจัดสรรอาเรย์จำนวน 129,052,722,140 สตริง


จะไม่.$"แทนการ," "บันทึกตัวอักษร?
Mr. Llama

ใช่การกำกับดูแลทั้งหมดในส่วนของฉัน ขอบคุณ
breadbox



4

PHP 38 37 36 ตัวอักษร

<?for($w=a;$w<passwore;)echo$w++,~ß;

คุณต้องตั้งค่าการเข้ารหัสเป็น ISO 8859-1 และปิดการเตือน


ฉันไม่ได้ทดสอบสิ่งนั้น แต่มันทำอย่างนั้นจริงหรือ
ST3

@ ST3 มันเป็นวงที่เรียบง่าย ตัวแปร$wถูกตั้งค่าเริ่มต้นเป็น 'a' จากนั้นจะเพิ่มขึ้นจนถึงค่าแรกหลังจาก 'รหัสผ่าน' (สตริงสุดท้ายจะไม่ถูกพิมพ์)
lortabac

3
@ ST3 มันเป็นforวงปกติ ไม่มีอะไรแปลกในรหัสนี้ยกเว้นตัวละคร 2 ตัวสุดท้ายซึ่งเป็นช่องว่างแบบสองทางกลับด้าน อย่างไรก็ตามใช่ฉันทดสอบมันเป็นคำที่สั้นกว่า
lortabac

1
@ ST3 นี่คือการทดสอบจากการpasswoqs passwordเนื่องจากการเข้ารหัสของแผ่นจดบันทึกไม่ใช่ ISO 8859-1 ฉันจึงต้องแทนที่ด้วยช่องว่าง
lortabac

1
คุณสามารถบันทึกถ่านที่มีในสถานที่ของ$w<passwore $w!=passwore
Dabbler ที่มีคุณค่า

2

Ruby (40 ตัวอักษร)

ตีความสตริงตัวอักษร az เป็นตัวเลขในฐาน 26 โดยมี = 1, b = 2, ... , z = 26

ดังนั้น "รหัสผ่าน" จึงถือได้ว่าเป็นหมายเลข N =

16*(26**7) + 
1*(26**6) + 
19*(26**5) + 
19*(26**4) + 
23*(26**3) + 
15*(26**2) + 
18*(26**1) + 
4*(26**0)

หากเราให้s = "a"(นั่นคือ: 1) และเราทำการโทร (N-1) ไปที่s.succ!s จะเป็น"password"(N) กล่าวอีกนัยหนึ่ง N = 1 + (N-1)

สำหรับตัวอย่างที่จะทำงานได้เร็วขึ้นเพื่อพิสูจน์ว่าการคำนวณ N นั้นถูกต้องให้พิจารณา"pass"เป็นเป้าหมายโดยที่ N คือ

16*(26**3) + 
1*(26**2) + 
19*(26**1) + 
19*(26**0)

และ

s = "a"
(N-1).times { s.succ! }
puts s #== "pass"

เนื่องจากเราต้องการพิมพ์"a"ด้วยเราจึงต้องการ

s = "`"
N.times { print(s.succ! + " ") }

ดังนั้นกลับไปที่ "รหัสผ่าน" แบบเต็ม N = 129052722140ออกจาก:

s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}

ฉันตามล่าหารูปแบบที่กะทัดรัดกว่า129052722140 == 0x1e0c2443dbแต่หาไม่เจอ

(อัปเดตเพื่อแก้ไขปัญหาการขาดการพิมพ์"a"ต้องขอบคุณ Cary)


1
อาดัมนั่นคงเป็นคุณในใจของฉัน คุณไม่ต้องการที่จะเริ่มต้นก่อนที่จะ 'a'?
Cary Swoveland

ฉันคิดว่าสิ่งที่คุณจะได้รับคือการที่ฉันใช้NแทนการพูดN-1ซ้ำของฉัน! ขอบคุณฉันจะแก้ไขเพื่อแก้ไข (แม้ว่า 129052722140 เป็นหมายเลขที่น่าสนใจสำหรับ Google :))
Adam Prescott

1
0x1e0c2443db เป็นตัวอักษรให้มากที่สุดเท่าที่ 129052722139
steenslag

สิ่งที่ผมหมายถึงคือว่าถ้าs=?a, s.succ!เริ่มต้นที่ 'b'`
Cary Swoveland

1
ด้วยs=?aและN-1คุณจะได้รับ 'b c ... รหัสผ่าน'; ด้วยs =<backtick> และNคุณจะได้รับ 'a b ... รหัสผ่าน' 'a'เพื่อขอออกไปเริ่มต้นด้วย นั่นคือทั้งหมดที่
Cary Swoveland

2

Javascript, 73

นี่คือรหัสตัวอักษร @Briguys เวอร์ชัน 73 ซึ่งพิมพ์เฉพาะตัวอักษรผสม

for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)


2

APL (Dyalog), 46 34

{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '

ในทางทฤษฎีมันจะพิมพ์จนกระทั่ง PASSWORD แต่ฉันพบข้อผิดพลาดเต็มพื้นที่ทำงานหลังจาก ZZZZ: อาร์เรย์ 5 มิติน่ากลัวเกินไป

แก้ไข: ต้องนานเกินไปตั้งแต่ฉันเล่นซอกับ APL ครั้งสุดท้าย ฉันกล้าพลาดการเปรียบเทียบตัวตนได้อย่างไร ( ) !!!

คำอธิบาย

{...}: ประกาศฟังก์ชั่นที่ ...
⎕A∘.,⍵: นำผลิตภัณฑ์ด้านนอกมาเรียงต่อกัน (การรวมกันขององค์ประกอบของตัวถูกดำเนินการด้านซ้ายรวมกับองค์ประกอบของตัวถูกดำเนินการด้านขวาเช่นเดียวกับผลิตภัณฑ์คาร์ทีเซียน) ระหว่าง 26 อัลฟาตัวพิมพ์ใหญ่ ( ⎕A) และอาร์กิวเมนต์ ( )

{...}¨: และสำหรับแต่ละองค์ประกอบของชุดผลลัพธ์ให้เสียบส่วนนั้นเข้ากับฟังก์ชันที่ ...
⍞←⍵: พิมพ์ออกมา
'PASSWORD '≡และเปรียบเทียบกับ'PASSWORD '
: หากการเปรียบเทียบส่งคืนค่า true ( 1) ให้ยกเลิกโปรแกรม
: อื่นเพียงส่งคืนสตริงที่พิมพ์

: ในที่สุดฟังก์ชั่นด้านนอกเรียกคืนตัวเอง

(จากนั้นคุณกำลังนำผลิตภัณฑ์ชั้นนอกทับกันระหว่าง 26 อัลฟาและ 26 อัลฟาซึ่งจะให้ชุดตัวอักษร 2 ตัวทั้งหมดแล้วผลิตภัณฑ์ด้านนอกทับด้วยคอมแพคระหว่างชุดตัวอักษร 2 ตัวและ 26 อัลฟาเป็นต้น ... จนกว่าคุณจะ เข้าถึงรหัสผ่านซึ่งเป็นสาเหตุให้เกิดการยกเลิก)

' ': จุดประกาย!! การเริ่มฟังก์ชั่นวนซ้ำด้วยอักขระช่องว่าง


2

Python 2 - 153 152 151 149 ไบต์

from itertools import*;R=range
for l in iter(chain(*[product(*((map(chr,R(65,91)),)*n))for n in R(1,9)]).next,tuple("passwore")):print ''.join(l)

บันทึกหนึ่งไบต์โดยใช้ UPPERCASE และหนึ่งรายการโดยใช้การขึ้นบรรทัดใหม่แทนการเว้นวรรค


1

Golfscript 41

สำหรับการขาด'z'+1 == 'aa'ตรรกะ Golfscript ไม่สามารถชนะอันนี้

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, สร้างอาร์เรย์จาก 0 ถึง 168036262483
  • (; ปล่อย 0
  • {.. }%ย้ำผ่านอาร์เรย์
  • 27base แปลงองค์ประกอบเป็นฐาน 27 อาร์เรย์
  • {96+}% เพิ่ม 96 ถึงแต่ละหลัก
  • ' '+ แปลงเป็นสตริงและเพิ่มช่องว่างไปยังจุดสิ้นสุด
  • .96?0<* ตัดสตริงให้เป็นศูนย์ถ้ามันมีถ่าน 96

1

ในทับทิม39 40

a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}

129052722140..or (แก้ไข: ก่อนหน้านี้ฉันมี129052722ฉันสูญเสียตัวเลขบางส่วนในการตัดและวางเลขฐานสิบหกก่อนหน้า ( 0x7B13032) เป็นตัวเลขที่ไม่ถูกต้อง) ยืมa=?`จาก @Doorknob เพื่อบันทึกอักขระ


ฉันพยายามที่จะแก้ไขa=?` สิ่งนี้ดูแปลก ๆ และมีพื้นที่เพิ่มเติมตอนท้าย แต่อย่างน้อยก็ใช้งานได้: P
Doorknob

ดังนั้นหมายเลข 129052722 มาจากไหน โดยการคำนวณของฉันที่ดูเหมือนจะให้ช่วง "a" ถึง "kwkokg" ... เล็กไปหน่อย
breadbox

@ กล่องข้อความฉันคำนวณตัวเลขนั้นด้วยวิธีการดังต่อไปนี้ (ขออภัยสำหรับการจัดรูปแบบ แต่ความคิดเห็นมีข้อ จำกัด ใช่มั้ย): ORD_BASE_ASCII = 'a'.ord-1; def nbr(word); len = word.size; word.split('').inject(0) {|t,c| offset = c.ord - ORD_BASE_ASCII; t + offset*(26**(len -= 1))}; end มันง่ายที่จะยืนยันว่านี่ถูกต้องเพียงแค่พิมพ์บางลำดับ
Cary Swoveland

@ กล่องจดหมายคุณพูดถูก ดูการแก้ไข วิธีที่ฉันให้ในความคิดเห็นก็โอเค
Cary Swoveland

ข้อผิดพลาดของ Fencepost สคริปต์ของคุณกำลังคำนวณโดยใช้ = 1..z = 26 คุณต้องคำนวณ a = 0..z = 25 เพื่อให้ได้จำนวนที่ถูกต้อง การลบ -1 ออกจากบรรทัดแรกคุณจะได้รับ 120699639557 ซึ่ง (เพิ่มหนึ่งรายการสำหรับรายการศูนย์) ตรงกับการคำนวณของฉัน
breadbox

1

javascript: 57 56 ตัวอักษร (ขอบคุณ C5H8NNaO4)

นี่คือวิธีการแก้ปัญหาที่ประกอบด้วยตัวเลขเป็นอักขระที่เป็นไปได้ ("0", "1", "2", .. , "passwor9", "passwora", "passworb", "passworc", "รหัสผ่าน")

for(i=-1;i++<1982613533017;console.log(i.toString(36)));

นี่คือปริศนาสำหรับการทดสอบ (มี 100 ครั้งล่าสุดเท่านั้นจึงไม่ล็อคเบราว์เซอร์ของคุณ)


3
วิธีนี้ไม่ถูกต้องไม่เป็นไปตามข้อกำหนด
Doorknob

@ Doorknob - ใช่ฉันพูดถึงมันในคำตอบของฉัน มันยังพิมพ์กรณีทั้งหมดจากความต้องการเดิม แต่พิมพ์กรณีตัวอักษรและตัวเลขทั้งหมดเช่นกัน
Briguy37

นอกจากนี้หลังจากอ่านคำถามอีกครั้งถ้าฉันตั้งค่า i เป็น 9 ในรหัสของฉันมันจะตอบสนองทุกความต้องการของคำถามยกเว้นผลลัพธ์ตัวอย่างของเขาซึ่งเขาได้รับการยกเว้นแล้ว (และจะนำรหัสไปที่ 56 ตัวอักษร )
Briguy37

@ Briguy37 ข้อมูลจำเพาะบอกว่าprint every **letter** combinationยังไงก็ตามบันทึกตัวละคร:{} -> ;
C5H8NNaO4

@ C5H8NNaO4: การผสมผสานตัวอักษรแบบใดที่โซลูชันของฉันไม่พิมพ์? ขอบคุณสำหรับทิป!
Briguy37


0

Befunge (72)

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:" Lr$W~"67++**1+***6+`#@_

พิมพ์สตริง 'a' ถึง 'รหัสผ่าน' คั่นด้วยช่องว่างแล้วออก

ด้านล่างเป็นรุ่นที่พิมพ์ได้เฉพาะ 9 * 9 = 81 คำแรก ('a' ถึง 'dd') เพื่อเปรียบเทียบ 99*คือจำนวนของการทำซ้ำที่จะดำเนินการ

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:99*`#@_

0

JavaScript 80 76

for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}

ซอ - หยุดที่ "pa"

อย่างไรก็ตามสิ่งนี้จะทำสิ่งซ้ำ


คุณสามารถเริ่มต้นการวนซ้ำด้วยi=s=0เพื่อบันทึกอักขระอีกสามตัว
Ry-

@minitech เรียบร้อยแล้ว
เครื่องทำความเย็นคณิตศาสตร์

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