অক্ষর এবং সংখ্যাগুলির সমস্ত সম্ভাব্য সংমিশ্রণ


13

সুতরাং আমি নিম্ন এবং উচ্চতর অক্ষর এবং সংখ্যার সমস্ত সংমিশ্রণ তৈরি করতে চাই যা একটি 5 টি অক্ষরের স্ট্রিং তৈরি করতে পারে।

সম্ভাবনা: a..z, A..Z এবং 0..9 9

বাশ এ আদৌ করার কি কোনও মার্জিত উপায় আছে?


1
আপনি কি নিজেকে ASCII বা লাতিন স্ক্রিপ্টে সীমাবদ্ধ রাখতে চান? অ্যাকসেন্টের মতো ডায়াক্রিটিক্স ((, â ...) সম্পর্কে কী?
স্টাফেন চেজেলাস

ফলোআপের জন্য ধন্যবাদ। স্পষ্টির জন্য মূল পোস্ট আপডেট হয়েছে।
18:25 এ 12 এডিভড

এটি কি সত্যিই বাশ হওয়ার দরকার ? পার্ল বা অ্যাওকের মতো ভাষা কি করবে?
টেরডন

1
তাহলে বাশ থেকে কেবল পার্ল বা পাইথনকে কল করবেন না কেন? বিশেষত এর সাথে perlএটি ওয়ান-লাইনার হিসাবে ব্যবহার করা খুব সহজ।
টেরডন

2
আপনি কি শিখতে চেষ্টা করছেন বা কেবল ফলাফল চান? দ্বিতীয় ক্ষেত্রে প্রচুর প্রোগ্রাম রয়েছে যা জন রিপার ( john) এবং এর মতো কাজ করে যা আপনাকে প্রচুর সম্ভাবনা দেয়।
YoMismo

উত্তর:


13

এখানে একটি বাশ সমাধান যা প্যারামিটার হিসাবে পছন্দসই দৈর্ঘ্য নেয় (আপনি permute 5আপনার ক্ষেত্রে এটি করতে চান ):

#!/bin/bash
charset=({a..z} {A..Z} {0..9})
permute(){
  (($1 == 0)) && { echo "$2"; return; }
  for char in "${charset[@]}"
  do
    permute "$((${1} - 1 ))" "$2$char"
  done
}
permute "$1"

যদিও এটি বেদনাদায়ক ধীরে ধীরে। সাহস আমি সি সুপারিশ? https://youtu.be/H4YRPdRXKFs?t=18s

#include <stdio.h>

//global variables and magic numbers are the basis of good programming
const char* charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char buffer[50];

void permute(int level) {
  const char* charset_ptr = charset;
  if(level == -1){
    puts(buffer);
  }else {
   while(buffer[level]=*charset_ptr++) {
    permute(level - 1);
   }
  }
}

int main(int argc, char **argv)
{

  int length;
  sscanf(argv[1], "%d", &length); 

  //Must provide length (integer < sizeof(buffer)==50) as first arg;
  //It will crash and burn otherwise  

  buffer[length]='\0';
  permute(length - 1);
  return 0;
}

চালাও এটা:

make CFLAGS=-O3 permute && time ./permute 5 >/dev/null #about 20s on my PC

উচ্চ-স্তরের ভাষাগুলি হিংস্র-জোর করে (যা আপনি যা করছেন তা মূলত) at


@ স্টাফেন চেজেলাস এই সম্পাদনার জন্য আপনাকে অনেক ধন্যবাদ। আমি নোংরা লিখছিলাম, "যথাযথ" উক্তিটি উপেক্ষা করে এ ক্ষেত্রে এটির প্রয়োজন নেই, তবে আমি শর্টকাটের জন্য খুব কৃতজ্ঞ!
PSkocik

আমি আপনার bashসমাধান চেষ্টা করেছিলাম । এটা খুব সুন্দর; আমি এটা প্রচুর পছন্দ করি. এটি প্রায় 24 ঘন্টা বা তার জন্য ভালভাবে কাজ করেছে আমি লক্ষ্য করেছিলাম যে আমার সিস্টেমটি সম্পূর্ণ লক হয়ে গেছে। `পাইথনের সাথে অনুরূপ কিছু চেষ্টা করে দেখেছি; অনুরূপ ফলাফল সহ, যদিও এটি যথেষ্ট দ্রুত ছিল।
ভয়েসেস

8

ইন bash, আপনি চেষ্টা করতে পারেন:

printf "%s\n" {{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}

তবে এটি চিরকালের জন্য গ্রহণ করবে এবং আপনার সমস্ত স্মৃতি ব্যবহার করবে। অন্য কোনও সরঞ্জাম ব্যবহার করা ভাল হবে perl:

perl -le '@c = ("A".."Z","a".."z",0..9);
          for $a (@c){for $b(@c){for $c(@c){for $d(@c){for $e(@c){
            print "$a$b$c$d$e"}}}}}'

সাবধান যে 6 এক্স 62 5 বাইট, তাই 5,496,796,992।

আপনি একই লুপটি করতে পারেন bash, তবে bashপশ্চিমে সবচেয়ে ধীরে শেল হওয়ায় এটি সময় নিতে পারে:

export LC_ALL=C # seems to improve performance by about 10%
shopt -s xpg_echo # 2% gain (against my expectations)
set {a..z} {A..Z} {0..9}
for a do for b do for c do for d do for e do
  echo "$a$b$c$d$e"
done; done; done; done; done

(আমার সিস্টেমে, perlসমমানের সাথে 20MiB / s এর বিপরীতে 700 কিবি / এস এ আউটপুট দেয় )।


আমি এটিও অনুভব করি যে আপনি যদি কোনও ফাইলকে আউটপুট দেওয়ার কোনও উপায় যুক্ত করেন তবে এটির উত্তরটি যুক্ত হবে; সম্ভবত এটি তৈরি করা হচ্ছে যাতে এটি আপনার র‌্যাম নষ্ট করে না, বা এটি সমস্ত
ম্যামের

2
@ হেলরিওভার, তারা সকলেই একটি ফাইল লিখে (স্টাডাউট করতে, যে কোনও ফাইল যা খোলা থাকে; যদি টার্মিনালে চালানো হয় তবে ডিভাইস ফাইলের মতো /dev/pts/something; এবং আপনি এটি শেল পুনর্নির্দেশ অপারেটরের সাহায্যে পরিবর্তন করতে পারেন), মেমরি নয়, তবে প্রথমটি তৈরি করে আউটপুট দেওয়ার আগে মেমরির পুরো আউটপুট (stdout এ খোলা ফাইলটিতে)।
স্টাফেন চেজেলাস

4

5 জিবি মেমরি চম্প না করে বিশদে খাঁটিভাবে এটি করার একটি উপায় এখানে রয়েছে:

for c1 in {A..Z} {a..z} {0..9}
do
    for c2 in {A..Z} {a..z} {0..9}
    do
        for c3 in {A..Z} {a..z} {0..9}
        do
            for c4 in {A..Z} {a..z} {0..9}
            do
                for c5 in {A..Z} {a..z} {0..9}
                do
                    printf "%s\n" "$c1$c2$c3$c4$c5"
                done
            done
        done
    done
done

2

এই বাশ সংস্করণটি এখনও পার্লের মতো দ্রুত নয় তবে এটি পাঁচটি নেস্ট লুপের চেয়ে চারগুণ দ্রুত:

printf -vtwo "%s " {{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}
for three in {{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}; do
    printf "$three%s\n" $two;
done

1

আপনি ব্যবহার করতে পারেন crunch(যা কমপক্ষে কালী বিতরণে উপলব্ধ)।

crunch 5 5 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890

1

ভাল ... মার্জিত ?, হ্যাঁ (কেবলমাত্র একটি দ্রুত নমুনা):

eval echo $(printf "%s" '{{a..z},{A..Z},{0..9}}'{,,} )

এই সম্পূর্ণ প্রকাশটি সম্ভবত আপনার কম্পিউটারকে ব্লক করবে:

eval echo $(printf "%s" '{{a..z},{A..Z},{0..9}}'{,,,,} )

একটি নন-ব্লকিং বিকল্প হ'ল কয়েকটি লুপ ব্যবহার করা:

nl=$'\n'; tab=$'\t'
n=${1:-3}
eval set -- "$2"

eval "varnames=($(echo {a..z}))"

for i in "${varnames[@]:0:$n}"; do
    header+='for '"$i"' do '
    middle+='$'"$i"
    traile+="done; "
done

loop="${header}${nl}    printf %s \"$middle\";${nl}$traile"
#echo "$loop"
eval "$loop"

এটিকে কল করুন:

./script 3 '{a..z} {A..Z} {0..9}'

যেখানে প্রথম যুক্তি হ'ল অক্ষরের সংখ্যা এবং দ্বিতীয়টি ব্যবহৃত অক্ষরের তালিকা (স্থান পৃথক)।

loopএটি স্ক্রিপ্টটি চালানোর জন্য একটি পরিবর্তনশীল ( ) তৈরি করবে এবং সর্বশেষ ইওল সেই স্ক্রিপ্টটি কার্যকর করবে। উদাহরণস্বরূপ:

$ ./script 5 '{a..z} {A..Z} {0..9}'

এর মান loopহবে:

for a do for b do for c do for d do for e do
    echo "$a$b$c$d$e";
done; done; done; done; done;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.