การสร้างสตริงตัวอักษรผสมตัวเลขความยาว N


30

อะไรคือวิธีที่สั้นที่สุดในการสร้างสตริงแบบสุ่มที่มีความยาวที่กำหนดและอนุญาตให้ใช้ตัวอักษรและตัวเลขเท่านั้น?

  • ตัวอย่างของสตริงสุ่ม: โดยมี N = 9 เอาต์พุตจะเป็น aZua7I0Lk
  • ความยาวที่กำหนด N สามารถสันนิษฐานได้ว่ามากกว่า 0
  • หากจำเป็นคุณสามารถสมมติว่า 256 เป็นค่าสูงสุดสำหรับ N แต่ควรใช้โซลูชันที่มีขีด จำกัด สูงกว่าสำหรับ N และยังต้องการเวลาในการคำนวณที่รวดเร็ว
  • อักขระที่อนุญาต: 0-9, az และ AZ
  • อักขระสามารถเกิดขึ้นได้มากกว่าหนึ่งครั้งในสตริงเอาต์พุต
  • สตริงที่เป็นไปได้แต่ละอันควรมีแนวโน้มเท่ากัน

1
เราสามารถสมมติค่าสูงสุดสำหรับ N ได้หรือไม่?
JAD

คำตอบ:


4

เยลลี่ 4 ไบต์

ØBṗX

ลองออนไลน์!

คำอธิบาย

ØBṗX
ØB     All letters (uppercase and lowercase) and digits
  ṗ    Cartesian power with {the input}
   X   Select a random possibility

พลังคาร์ทีเซียนโดยทั่วไปจะสร้างรายการความยาวที่กำหนดทั้งหมดที่สามารถเกิดขึ้นจากชุดขององค์ประกอบที่กำหนด นั่นคือสิ่งที่เราต้องการตรงนี้


หากมีอักขระที่เกี่ยวข้องกับ UTF-8 นั่นน่าจะเป็นเพียง 4 ไบต์จริงหรือ หนึ่ง UTF-8 ตัวอักษรอาจจะมากกว่าเพียงแค่หนึ่งไบต์ ...
m13r

@ m13r Jelly ใช้หน้ารหัสของตัวเองซึ่งเป็นอักขระไบต์เดียวทั้งหมด
FlipTack

13

แท๊กซี่ 2577 ไบต์

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 l 1 l 1 r.[a]Go to Heisenberg's:n 1 r 1 r 3 r.Pickup a passenger going to Cyclone.Go to Go More:n 1 l 3 l 3 l.Go to Starchild Numerology:e 2 r.62 is waiting at Starchild Numerology.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 l 2 r.Pickup a passenger going to What's The Difference.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:n 2 r 2 r 1 r.Pickup a passenger going to Trunkers.Go to Trunkers:e 1 r 3 r 1 l.Pickup a passenger going to Multiplication Station.Go to Cyclone:w 2 r.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 2 l 1 r 3 l.Pickup a passenger going to Addition Alley.Go to Starchild Numerology:e 1 r 3 l 2 r.1 is waiting at Starchild Numerology.63 is waiting at Starchild Numerology.Pickup a passenger going to Addition Alley.Pickup a passenger going to The Underground.Go to Addition Alley:e 1 l 2 r 3 r 1 r.Pickup a passenger going to Joyless Park.Go to Writer's Depot:n 1 l 1 l.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789- is waiting at Writer's Depot.Pickup a passenger going to Chop Suey.Go to Joyless Park:n 3 r 2 r 2 l.Go to Chop Suey:w 1 r 1 r 1 l.[b]Pickup a passenger going to Narrow Path Park.Go to Narrow Path Park:n 1 l 1 r 1 l.Go to The Underground:e 1 r.Switch to plan "c" if no one is waiting.Pickup a passenger going to The Underground.Go to Fueler Up:s.Go to Chop Suey:n 3 r 1 l.Switch to plan "b".[c]Go to Joyless Park:n 1 r.Pickup a passenger going to The Underground.Go to Narrow Path Park:w 1 r 3 l.[d]Pickup a passenger going to KonKat's.Go to KonKat's:e 1 r.Pickup a passenger going to KonKat's.Go to The Underground:s.Switch to plan "e" if no one is waiting.Pickup a passenger going to The Underground.Go to Fueler Up:s.Go to Narrow Path Park:n 4 l.Switch to plan "d".[e]Go to KonKat's:n.Pickup a passenger going to Riverview Bridge.Go to Riverview Bridge:n 1 l.Go to Narrow Path Park:e 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:e 1 r 4 r 1 l.Go to Sunny Skies Park:s 1 r 1 l 1 r.Pickup a passenger going to The Underground.Go to The Underground:n 1 r 1 r 2 r.Switch to plan "f" if no one is waiting.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 3 l 2 l 1 l.Switch to plan "a".[f]

ลองออนไลน์!

แท็กซี่ถูกสุดไม่ได้ทำเพื่อการนี้ แต่คุณสามารถทำมันได้! ฉันจะพยายามอธิบายสิ่งที่เกิดขึ้นด้านล่างเวอร์ชั่นที่ไม่ตีกอล์ฟ

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left 1st left 1st right.
[a]
Go to Heisenberg's: north 1st right 1st right 3rd right.
Pickup a passenger going to Cyclone.
Go to Go More: north 1st left 3rd left 3rd left.
Go to Starchild Numerology: east 2nd right.
62 is waiting at Starchild Numerology.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st left 2nd right.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer: north 2nd right 2nd right 1st right.
Pickup a passenger going to Trunkers.
Go to Trunkers: east 1st right 3rd right 1st left.
Pickup a passenger going to Multiplication Station.
Go to Cyclone: west 2nd right.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: north 2nd left 1st right 3rd left.
Pickup a passenger going to Addition Alley.
Go to Starchild Numerology: east 1st right 3rd left 2nd right.
1 is waiting at Starchild Numerology.
63 is waiting at Starchild Numerology.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to The Underground.
Go to Addition Alley: east 1st left 2nd right 3rd right 1st right.
Pickup a passenger going to Joyless Park.
Go to Writer's Depot: north 1st left 1st left.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789- is waiting at Writer's Depot.
Pickup a passenger going to Chop Suey.
Go to Joyless Park: north 3rd right 2nd right 2nd left.
Go to Chop Suey: west 1st right 1st right 1st left.
[b]
Pickup a passenger going to Narrow Path Park.
Go to Narrow Path Park: north 1st left 1st right 1st left.
Go to The Underground: east 1st right.
Switch to plan "c" if no one is waiting.
Pickup a passenger going to The Underground.
Go to Fueler Up: south.
Go to Chop Suey: north 3rd right 1st left.
Switch to plan "b".
[c]
Go to Joyless Park: north 1st right.
Pickup a passenger going to The Underground.
Go to Narrow Path Park: west 1st right 3rd left.
[d]
Pickup a passenger going to KonKat's.
Go to KonKat's: east 1st right.
Pickup a passenger going to KonKat's.
Go to The Underground: south.
Switch to plan "e" if no one is waiting.
Pickup a passenger going to The Underground.
Go to Fueler Up: south.
Go to Narrow Path Park: north 4th left.
Switch to plan "d".
[e]
Go to KonKat's: north.
Pickup a passenger going to Riverview Bridge.
Go to Riverview Bridge: north 1st left.
Go to Narrow Path Park: east 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: east 1st right 4th right 1st left.
Go to Sunny Skies Park: south 1st right 1st left 1st right.
Pickup a passenger going to The Underground.
Go to The Underground: north 1st right 1st right 2nd right.
Switch to plan "f" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 3rd left 2nd left 1st left.
Switch to plan "a".
[f]

เริ่มต้น:
รับstdinรับค่า stdin เป็นข้อความแปลงเป็นตัวเลขแล้วไปติดที่ใดที่หนึ่งเพื่อรอ

วางแผนส่วนที่ 1: รับจำนวนเต็ม 1-62
สุ่มรับจำนวนเต็มแบบสุ่มจากนั้นรับ62เป็นจำนวน ทำซ้ำทั้งจำนวนเต็มแบบสุ่มและ62เพราะเราต้องการในภายหลัง คุณสามารถพกพาผู้โดยสาร 3 ในครั้งเดียวดังนั้นเราจึงจบลงด้วยrand, และrand 62(อีกอัน62จะรอจนกว่าเราจะกลับมา) ไปหารrandด้วย62และตัดทอนผลลัพธ์เพื่อรับจำนวนเต็ม กลับไปรับสำเนาอื่น62แล้วคูณด้วยจำนวนเต็มที่ถูกตัดทอนจากการหาร randสุดท้ายลบสินค้าจากสำเนาแรกของ นี่ทำให้เรามีตัวเลข 0-61 ตอนนี้เราต้องกลับไปที่รถกระบะ a 1และเพิ่มลงในผลลัพธ์เพื่อรับหมายเลข 1-62 mod(rand(),62)+1ใช่ทุกคนหลายสายของข้อความเป็นเพียง

วางแผนส่วนที่ 2: สร้างอาร์เรย์ของอักขระที่จะเลือก
รถกระบะสตริงที่มีอักขระที่ใช้ได้ทั้งหมดและอีกหนึ่งตัวที่เราไม่ต้องการ (อีกมากในภายหลัง) 63เราหยิบขึ้นมาก่อนหน้านี้การแข่งขันความยาวสายนี้ นำไปส่งที่ Chop Suey เพื่อแยกผู้โดยสารเป็นรายบุคคล

แผนข: ย้ายอาร์เรย์เพื่อให้เราสามารถเลือกตัวละครทีละตัว
ย้ายตัวละครทุกตัวไปที่ Narrow Path Park มันเป็นสแต็คเดียวที่มีอยู่และวิธีเดียวที่จะไม่มีผู้โดยสารที่หลงทางได้ ทุกสิ่งทุกอย่างใน Townsburg คือ FIFO ดังนั้นฉันจะต้องย้อนกลับไปหาผู้โดยสารทุกคนในการวนซ้ำโดยรวม ด้วยวิธีนี้ฉันสามารถทิ้งพวกเขาไว้ที่สวนสาธารณะและพวกเขาจะถูกผลักไสโดยตัวละครใหม่ 63 ตัวทุกครั้ง ครั้งแรกมากAมีแนวโน้มที่จะไม่หลบหนี

แผน C: เตรียมที่จะเลือกตัวละคร
นี่เป็นเพียงไม่กี่ป้ายที่ไม่จำเป็นต้องอยู่ในแผน D. จัดตำแหน่งรถแท็กซี่เพื่อเตรียมพร้อม

แผน D: รับตัวละครทั้งหมดที่เราไม่ต้องการ
เริ่มต้นด้วยตัวอักษรตัวแรกใน "อาเรย์" ที่กลับด้าน (นี่คือตัวอักษร 63 ที่เราไม่ต้องการ) เก็บและต่อตัวอักษรในขณะที่เรานับถอยหลังจากผลของmodฟังก์ชั่น ในแผนกเมื่อคุณตีศูนย์อักขระถัดไปคือตัวที่คุณต้องการ

แผน E: จมน้ำตายสิ่งที่คุณไม่ต้องการแล้วส่งคืนสิ่งที่เลือก
"[P] ลอบวางมือลงที่สะพานริเวอร์วิวดูเหมือนจะตกลงไปด้านข้างและลงไปในแม่น้ำเสมอ ... " เอาล่ะนั่นเป็นการกำจัดสายผู้แพ้ที่ต่อกันนี้ ไปรับตัวละครต่อไปและส่งไปยัง stdout ในที่สุดเรามาตรวจสอบจำนวนอักขระที่เราพิมพ์ไปแล้ว กลับไปที่ Sunny Skies เพื่อรับค่า stdin ที่เราทิ้งไว้นานแล้ว ลบหนึ่งและถ้าผลลัพธ์มีค่ามากกว่าศูนย์ให้ส่งกลับมาเพื่อรอและเริ่มต้นใหม่อีกครั้งที่แผนก


นี่เป็นภาษาทัวริงที่สมบูรณ์หรือไม่ ฉันไม่เคยได้ยินหรือ ถ้าเป็นเช่นนั้นนี่อาจเป็นคำตอบที่ยาวที่สุดในประวัติศาสตร์ของกอล์ฟ!
maple_shaft

4
@maple_shaft Taxi สนุกดี แต่ฉันสามารถรับประกันได้ว่านี่ไม่ใช่คำตอบที่ยาวที่สุดของรหัสกอล์ฟ มีคำตอบของยูนารีบางคำที่กล้าหาญอย่างจริงจัง
Engineer Toast

1
@maple_shaft ฉันขุดบ้าง คำตอบที่ใหญ่ที่สุดที่ฉันสามารถหาได้บน PPCG คือคำตอบเดิมจาก @ Dennis ♦ (แน่นอนว่า Dennis ♦) แต่มาจากcode-bowlingและได้รับการแก้ไข code-golfคำตอบที่ยาวที่สุดที่ฉันสามารถหาได้คือการส่ง Brain-Flakดั้งเดิมเกี่ยวกับความท้าทายพื้นฐาน มันมาที่ 9.5 * 10 ^ 580 ไบต์ คำตอบปัจจุบันที่ยาวที่สุดที่ฉันพบคือตัวทดสอบหลักใน Unary : 1.65 * 10 ^ 56 ไบต์
Engineer Toast

7

C (gcc) , 57 55 52 ไบต์

ขอบคุณ 2501 สำหรับตัวชี้ ...

i;f(n){for(;n-=isalnum(i=rand()%150)&&putchar(i););}

ลองออนไลน์!


rand()%74ควรเป็นrand()%75
2501

@ 2501 โทรดี
cleblanc

1
คุณสามารถลดขนาดเพิ่มเติมได้โดยใช้&&putchar(i)แทนผู้ประกอบการที่ประกอบไปด้วย
2501

ดี! ขอบคุณมาก
cleblanc

6

เยลลี่ 5 ไบต์

พลาดไม่ได้ - ดู4 byter ais523

ØBX$€

ลองออนไลน์!

อย่างไร?

ØBX$€ - Main link: n
    € - for each in range(n):
   $  -   last two links as a monad:
ØB    -     "base digits" - yields list of chars "01..9AB...Zab...z"
  X   -     random choice

ฉันจะไม่พิจารณาตัวละคร UTF-8 ว่ามีความยาวหนึ่งไบต์ oO หรือไม่?
m13r

@ m13r Jelly มีหน้ารหัสของตัวเอง - คลิกไบต์ในส่วนหัวของคำตอบของฉันเพื่อดู
Jonathan Allan

5

Shell + pwgen 13 ไบต์

pwgen -s $1 1

-s, - ปลอดภัย

สร้างรหัสผ่านแบบสุ่มที่ยากต่อการจดจำอย่างสมบูรณ์

ตัวอย่างผลลัพธ์

%pwgen -s 10 1
2cyhLovbfT

5

Java 8, 183 149 97 88 ไบต์

n->{for(int t;n-->0;t*=Math.random(),System.out.printf("%c",t+=t>9?t>35?61:55:48))t=62;}

ลองออนไลน์

-9 bytes โดยการตอบคำตอบ C @ 2501ของดังนั้นให้แน่ใจว่า upvote เขาเช่นกัน!

คำตอบเก่า 97 ไบต์

n->{for(int t;n-->0;t*=Math.random(),System.out.printf("%c",t>9?(t<36?65:97)+t%26:48+t%10))t=62;}

ลองออนไลน์

คำอธิบาย:

n->{                           // Method with integer parameter and String return-type
  for(int t;                   //  Temp integer
      n-->0                    //  Loop the input amount of times:
      ;                        //    After every iteration:
       t*=Math.random(),       //     Set `t` to a random integer in the range [0,62)
       System.out.printf("%c", //     Print as character:
         t+=                   //      The random integer, after we've added:
            t>9?               //       If the random integer is larger than 9:
             t>35?             //        If the random integer is larger than 35:
              61               //         Add 61
             :                 //        Else:
              55               //         Add 55
            :                  //       Else:
             48))              //        Add 48
    t=62;}                     //   (Re)set `t` to 62 for the random

n->{for(int t;n-->0;t*=Math.random(),System.out.printf("%c",...))t=62;}
                               // Similar as above
         t>9?                  //      If the random integer is larger than 9:
          (t<36?               //       If the random integer is smaller than 36:
            65                 //        Start with 65 ('A')
           :                   //       Else:
            97)                //        Start with 97 ('a')
               +t%26           //       And add the random integer modulo-26
         :                     //      Else:
          48                   //       Start with 48 ('0')
            +t%10)             //       And add the random integer modulo-10

4

C, 60 ไบต์

r;f(n){for(;n--;)r=rand()%62,putchar(r+=r>9?r>35?61:55:48);}

เห็นมันทำงานที่นี่

ดูการจัดจำหน่ายที่นี่

มันมีการกระจายอย่างสม่ำเสมอสมมติว่าrand() % 62มีการแจกแจงแบบสม่ำเสมอ เนื่องจาก 62 มักไม่แบ่ง RAND_MAX เท่า ๆ กันมีอคติน้อยมาก


4

Snowman , 58 ไบต์

((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR))

ลองออนไลน์!

นี่เป็นรูทีนย่อยที่ใช้จำนวนเต็มเป็นอินพุตและส่งคืนสตริงแบบสุ่ม

((             subroutine
  }            make b, e, g active
  #`           e = input (from +)
  ""*          store an empty string in +
  :            what follows is the block to prepend a random char to +
    48vn58nR|  generate range(48..58) and place in g (need b and e for next step)
    65vn91nR   generate range(65..91) in b
    ,aC|       move g to e, concatenate b and e, and move the result to g
    97vn123nR  generate range(97..123) in b
    ,aC        move g to e, concatenate b and e, keeping the result in b
    AsH        shuffle the array of candidate ASCII codes stored in b
    1AaL       equivalent to 0aAwR - get the first element wrapped in an array
    #aC        retrieve + and prepend the randomly generated character
    *          store back into +
  ;bR          repeat this block e times, where e has been set to the input
))             output is given via +

มันควรจะเป็น: ((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR)).
2501

@ 2501 อ่าใช่แล้ว คงที่ขอบคุณ
Doorknob

4

PowerShell, 58 54 ไบต์

-4 ต้องขอบคุณ Andrei Odegov - ส่งไปยังอาร์เรย์ของถ่านแทนการวนซ้ำเพื่อสร้างอาร์เรย์ของถ่าน

-join[char[]](65..90+97..122+48..57|random -C "$args")

สร้างช่วง1..2+4..5 = 1,2,4,5ของทุกรหัสอักขระที่ยอมรับจากนั้นเลือก$argsจำนวนขององค์ประกอบสุ่มโดยใช้random -Count- องค์ประกอบที่ส่งผลให้มีการคล้องผ่าน|%{}และกลายเป็น[char]s,ถูกโยนไปยังอาร์เรย์ของตัวอักษรโดยใช้[char[]]- แล้วสิ่งที่ทั้งจะห่อหุ้มในวงเล็บและ-joinเอ็ดร่วมกัน

PS C:\users\sweeneyc\Desktop> .\grstr.ps1 5
oaCE5
PS C:\users\sweeneyc\Desktop> .\grstr.ps1 10
UReh6McG7D
PS C:\users\sweeneyc\Desktop> .\grstr.ps1 30
t1YrhZf5egyzqnPlWUKV3cEoIudMTs

ไม่ทำงานสำหรับอินพุต 0 ซึ่งGet-Randomยอมรับเฉพาะตัวเลขที่สูงกว่า 1 สำหรับ-Countพารามิเตอร์


คุณสามารถส่งอาเรย์ไบต์ที่ได้มาทั้งหมดไปยังอาร์เรย์ของ chars ได้ สิ่งนี้จะช่วยในการประหยัด 4 ไบต์:-join[char[]](65..90+97..122+48..57|random -C "$args")
Andrei Odegov



2

Perl 5 , 41 ไบต์

40 ไบต์ของรหัส + -pธง

$\.=(a..z,A..Z,0..9)[rand 62]for 1..$_}{

ลองออนไลน์!

(a..z,A..Z,0..9)สร้างอาร์เรย์ที่มีตัวอักษรและตัวเลขทั้งหมด[rand 62]ส่งกลับองค์ประกอบสุ่มของอาร์เรย์นี้ซึ่งเป็นผนวก ( .=) ไป$\ซึ่งจะมีการพิมพ์โดยปริยายขอบคุณท้ายเพื่อธง-p}{


หรือสำหรับ bytecount เดียวกัน แต่ใช้พารามิเตอร์แทนอินพุตมาตรฐาน:

print+(a..z,A..Z,0..9)[rand 62]for 1..pop

ลองออนไลน์!


2

R, 51 ไบต์

ความยาวเท่ากับคำตอบ R อื่น ๆ แต่มีวิธีการต่างกัน

cat(sample(c(letters,LETTERS,0:9),scan(),T),sep="")

lettersและLETTERSทั้งคู่เป็นตัวแปรในตัวที่มีตัวอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ทั้งหมดตามลำดับ การเพิ่ม0:9เข้าไปนั้นเรามีทั้งตัวอักษรและตัวเลขทั้งชุด


2

R, 54 52 51 49 ไบต์

intToUtf8(sample(c(65:90,97:122,48:57),scan(),T))

คำอธิบาย:

  1. อ่านอินพุตจำนวนเต็มn :scan()
  2. เวกเตอร์ที่มีค่า ASCII: c(65:90,97:122,48:57)
  3. ตัวอย่างnค่า ASCII พร้อมการแทนที่:sample(c(65:90,97:122,48:57),scan(),T)
  4. แปลงค่า ASCII เป็นสตริงอักขระด้วย intToUtf8

ฉันพบวิธีการอื่นที่มีความยาวเท่ากัน
JAD

@JarkoDubbeldam ความคิดที่ดีนี่ช่วยฉันประหยัดสองไบต์
Sven Hohenstein

D'โอ้! เป็นงานที่ดี :)
JAD

2

JavaScript (ES6), 61 54 39 52 64 ไบต์

นี่เป็นเหมือนกอล์ฟตีกลับ! รับความนิยมอย่างมากในการนับจำนวนไบต์เพื่อให้แน่ใจว่าจะใช้ตัวละครเต็มรูปแบบจากทั้งสามกลุ่ม

f=n=>n--?btoa(String.fromCharCode(Math.random()*248))[0]+f(n):""
  • บันทึก 15 ไบต์ (ในขั้นตอนเดียว) ขอบคุณArnauldที่แนะนำให้ใช้ฟังก์ชั่นวนซ้ำ

ลองมัน

f=n=>n--?btoa(String.fromCharCode(Math.random()*248))[0]+f(n):""
i.addEventListener("input",_=>o.innerText=f(+i.value))
<input id=i type=number><pre id=o>


ฉันได้อัปเดตแล้วเพื่อให้รวมตัวละครทั้ง 3 กลุ่มไว้ @Arnauld; ฉันแค่พยายามหาดัชนีที่มีมากกว่า 2 ดัชนี ขอบคุณที่แนะนำตัวเลือกแบบเรียกซ้ำ
Shaggy

ฉันชอบความคิดนี้ แต่ฉันคิดว่าตอนนี้คุณกำลังสร้างตัวละคร[0-5w-z]โดยเฉพาะ
Arnauld

ฉันขอแนะนำbtoa(String.fromCharCode(Math.random()*248))[0]ให้ครอบคลุมช่วงทั้งหมดอย่างสม่ำเสมอ
Arnauld

เพิ่งสังเกตเห็นว่าตัวเอง @Annauld ดูเหมือนว่าฉันจะต้องรวมทั้งสองวิธี (แปลงtoStringแล้วเข้ารหัส) เพื่อรับประกันว่าอักขระทั้งหมดจากทั้ง 3 กลุ่มสามารถส่งคืนได้
Shaggy

ดีกว่า แต่ยังไม่สมบูรณ์: 014589ABEFIJMNQRUVYZcdghklopstwx(และไม่เหมือนกัน)
Arnauld

2

อลิซ 24 ไบต์

/w9u"Uz;r
\0.rdao"ki@/t&

ลองออนไลน์!

เลย์เอาต์นี้ดีกว่าที่ฉันมีอยู่เดิมมาก (32 ไบต์) แต่ฉันแน่ใจว่ายังไม่ดีที่สุด ...

คำอธิบาย

/      Reflect to SE. Switch to Ordinal.
       The IP now bounces diagonally up and down through the code.
09     Append 0 and 9 to an (implicit) empty string to create "09".
r      Range expansion, turns the string into "0123456789".
"az"   Push this string.
r      Range expansion, turns it into the lower-case alphabet.
i      Read all input as a string.
/      Reflect to E. Switch to Cardinal.
t      Implicitly convert the input string to the integer value N it
       contains and decrement it.
&      Run the next command N-1 times.
       The IP wraps around to the first column.
\      Reflect to NE. Switch to Ordinal. (This is not a command.)
w      Push the current IP address to the return address stack N-1
       times. This starts a loop whose body will run N times.
  .      Duplicate the lower-case alphabet.
  u      Convert it to upper case.
  d      Push the concatenation of all values on the stack. This pushes
         a single string with digits, lower-case and upper-case alphabet.
  U      Random choice. Pick a character from this string uniformly at random.
  o      Print it.
  ;      Discard the upper-case alphabet, because it will be regenerated
         in the next loop iteration (and if we leave it, then upper-case
         letters will become more and more likely as the output grows).
k      As long as there is still an address on the return address stack,
       jump back to that address (i.e. to the w). Once the return address
       stack has been depleted, this does nothing and the loop is exited.
@      Terminate the program.


2

Python 2, 79 83 79 ไบต์

import random as r,string as s;lambda x:''.join(r.sample(s.printable[:62]*x,x))

+4 ไบต์ (ไม่ใช่บัญชีสำหรับการทำซ้ำ)

-4 ไบต์ (ขอบคุณ @Rod สำหรับคำแนะนำในการใช้งานprintable[:62])


1
ใช้งานไม่ได้จะต้องมีการทำซ้ำ สามารถแก้ไขได้โดยใช้(s.letters+s.digits)*xแทนs.letters+s.digits
Rod

@ แก้ไขคงขอบคุณ!
Wondercricket

คุณสามารถใช้`r.sample(...)`[2::5]แทน''.join(r.sample(...))บันทึกไบต์ (python 2 เท่านั้น) และ(s.letters+s.digits)*xสามารถเปลี่ยนs.printable[:62]*xเป็นบันทึก 4 ไบต์
Rod

@Rod ขอบคุณสำหรับคำแนะนำ ฉันนำไปใช้printableไม่สามารถ[2::5]ไปทำงานได้ (บางทีฉันทำผิดหรือเปล่า?)
Wondercricket

คุณต้องล้อมรายการr.sample()ด้วย backticks `` ข้อมูลบางอย่างเกี่ยวกับเรื่องนี้
Rod



1

แบตช์ 175 ไบต์

@set s=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
@for /l %%i in (1,1,%1)do @call :c
@echo %s:~62%
:c
@set/an=%random%%%62
@call set s=%s%%%s:~%n%,1%%

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


1

Pykeขนาด 4 ไบต์

~JfH

ลองออนไลน์!

~J   -   "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  f  -  cominbations(^, length=input)
   H - random.choice(^)

ดูเหมือนจะไม่ทำงานสำหรับอินพุตใด ๆ ที่มากกว่า 3 และฉันไม่แน่ใจว่าสามารถสร้างอักขระเดียวกันได้มากกว่าหนึ่งครั้ง
ATaco

สิ่งนี้ใช้ไม่ได้กับอินพุตที่มากกว่า 3 ฉันลองที่นี่แล้ว: pyke.catbus.co.uk
m13r

ต้องการ RAM ประมาณ 1 GB เพียงเพื่อสร้างสตริงของตัวอักษรและตัวเลข 4 ตัว ... ไม่สามารถใช้งานได้กับอินพุต 10 โปรแกรมขัดข้องด้วยMemoryError
m13r

1

Pyth, 7 11 ไบต์

O^s++rG1GUT

ลองออนไลน์

คำอธิบาย

O^s++rG1GUT
    +rG1G      Take the uppercase and lowercase alphabets.
   +     UT    Add it to the list [0, ..., 9].
  s            Concatenate to get a string.
 ^         Q   Get all strings of length N.
O              Choose one at random.

ซึ่งรวมถึงตัวอักษรตัวพิมพ์เล็กและตัวเลขเท่านั้นไม่ใช่ตัวอักษรตัวพิมพ์ใหญ่
Blue

@muddyfish จับได้ดี คงที่


1

APL (Dyalog) ที่มีAGLขนาด 17 ไบต์

(⎕A,∆a,⎕D)[?⎕⍴62]

ลองออนไลน์!

(... )[... ] เข้าไปในดัชนี

⎕A,∆a,⎕D ตัวอักษรตัวพิมพ์ใหญ่ตามด้วยอักษรตัวพิมพ์เล็กตามด้วยตัวเลข

การใช้

62 (จำนวนสัญลักษณ์ที่เป็นไปได้

เปลี่ยนโฉมหน้าโดย

 อินพุตที่ประเมิน ( n )

? เปลี่ยนแต่ละ 62 เป็นตัวเลขสุ่มในช่วง 1 … 62

APL (APLX) , 17 ไบต์

(⎕A,⎕a,⎕D)[?⎕⍴62]


1

Pip , 13 ไบต์

LaORCz.AZ.J,t

ลองออนไลน์!

คำอธิบาย

               a is cmdline arg; t is 10; z is lcase alphabet; AZ is ucase (implicit)
La             Do the following, a times:
  O             Output (without newline)
   RC           random choice from:
     z           Lowercase letters
      .AZ        concatenated with uppercase letters
         .J,t    concatenated with range(10) joined into a string

1

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 63 tokenized ไบต์พื้นฐาน

 1 INPUT N
 2 IF NOT N THEN STOP
 3 FOR N=SGN PI TO N
 4 PRINT CHR$ (CODE "A"+RND*26);
 5 NEXT N

ไม่มีกรณีที่ต่ำกว่าตัวละครใน ZX81 โดยไม่ต้องใช้การชุมนุมหรือมีการเรียงลำดับของ UDG A-Zรอมหรือบางสิ่งบางอย่างบางส่วนและเวลาเป็นอยู่ก็เพียงเอาท์พุท หากป้อนค่าศูนย์โปรแกรมจะหยุดและกลับสู่โหมดโดยตรง



0

ซ้อนกัน , 33 ไบต์

:>[alpha 10:>ALPHA,,''#`randin]"!

ลองออนไลน์! รับอินพุตจากด้านบนของสแต็กและปล่อยเอาต์พุตที่ด้านบนของสแต็ก

:>[alpha 10:>ALPHA,,''#`randin]"!
:>                                  range from 0 to n-1
  [                           ]"!   on each, do:
   alpha                            push "abc...xyz"
         10:>                       push (0 1 2 ... 8 9)
             ALPHA                  push "ABC...XYZ"
                  ,,                concat twice
                    ''#`            join by nothing
                        randin      select random member in it
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.