কিভাবে একটি স্ট্রিং বিপরীত?


104

আমরা কীভাবে সরল স্ট্রিংগুলিকে বিপরীত করতে পারি?


4
আমি যতদূর বুঝতে পেরেছি, নীচে প্রদত্ত সমাধানগুলি পূর্বনির্ধারিত বা অক্ষরগুলির সংমিশ্রণগুলির সাথে কাজ করে না, a+´পরিবর্তে দেওয়ার মতো á। আমি ভাবছি যে এটি কীভাবে বিবেচনা করা যেতে পারে, এটি সাধারণ না করেই।
সিরিটিং

যদি আপনি প্রচুর সংখ্যক অনুরূপ উত্তর নিয়ে বিভ্রান্ত হন তবে আমার বেঞ্চমার্কটি পরীক্ষা করুন
সালভাদোর ডালি

উত্তর:


100

Go1 এ রুনি একটি বিল্টিন টাইপ।

func Reverse(s string) string {
    runes := []rune(s)
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

4
স্ট্রিং / অ্যারে / স্লাইস ইত্যাদির দৈর্ঘ্য নির্ধারণ করতে আপনি যানতে লেন () ব্যবহার করতে পারবেন না ... এখানে কেন? - লেন () -এর অর্থ বাইটস ইনপুটটির আকার। এটি এর দৈর্ঘ্যের সাথে মিলে না। - সমস্ত ইউটিএফ 8 এর রানগুলি একই আকারের নয়। এটি 1, 2, 4, বা 8 এর মতো হতে পারে - রুনির দৈর্ঘ্য পেতে আপনার ইউনিকোড / ইউটি 8 প্যাকেজের পদ্ধতি রুনকাউন্টইনস্ট্রিং ব্যবহার করা উচিত।
আনভেশ চেকা

17
@ অ্যাভেশেচেকা, এটি ভুল। দেখুন golang.org/pkg/builtin/#len - lên () একটি ফালি উপর স্পষ্টভাবে উপাদানের সংখ্যা, না বাইটে আকার ফেরৎ। এক ধরণের রুনস এটি করার সঠিক উপায়।
চৌবি

4
@ .ытфолд এটি অক্ষরের সংমিশ্রণে কাজ করে না। Play.golang.org/p/sBgZAV7gCb দেখুন, সম্মিলনকারী অক্ষরটি তার বেসের সাথে অদলবদল হয় না।
চৌবি

53

গোলং-বাদাম মেলিং তালিকায় রাশ কক্স পরামর্শ দেয়

package main 
import "fmt"
func main() { 
        input := "The quick brown 狐 jumped over the lazy 犬" 
        // Get Unicode code points. 
        n := 0
        rune := make([]rune, len(input))
        for _, r := range input { 
                rune[n] = r
                n++
        } 
        rune = rune[0:n]
        // Reverse 
        for i := 0; i < n/2; i++ { 
                rune[i], rune[n-1-i] = rune[n-1-i], rune[i] 
        } 
        // Convert back to UTF-8. 
        output := string(rune)
        fmt.Println(output)
}

20
আমি পছন্দ করি তারা কীভাবে এনকোডিংগুলি সম্পর্কে ভাবতে বাধ্য করে।
গিরিগিরিস অ্যান্ড্রেসেক

11
অফ-টপিক: কেন এটি [গোলং-বাদাম] এবং [গো-বাদাম] নয়?
জিমি

4
বাহ, ডাব্লুটিএফ যখন বিপরীত হয় তখন ডাবল অ্যাসাইনমেন্টের সাথে থাকে? মজাদার. এখন, অসম সংখ্যাযুক্ত রানসের স্ট্রিং সম্পর্কে চিন্তা করুন। মাঝেরটি একটি বিশেষ চিকিত্সা পেয়েছে, যদিও সর্বোপরি সঠিক ফলাফলের সাথে। :) একটি আকর্ষণীয় সামান্য অপ্টিমাইজেশন আমি এখনই চিন্তা করতাম না।
কিসাকি

4
বুঝতে পারছি না কেন এই রূপান্তরটি রুনে, কেন হবে না rune:=[]rune(input)?
সিরিটিং

4
রেঞ্জ লুপের জন্য আপনার প্রথমটির দরকার নেই। আউটপুট: = [] রুনে (ইনপুট); এন: = লেন (আউটপুট) এবং আপনার রুনি = রুনের দরকার নেই [0: n]
ডভলেলেজো

30

এটি কার্যকারিতা সম্পর্কে সমস্ত মাতামাতি ছাড়াই কাজ করে:

func Reverse(s string) (result string) {
  for _,v := range s {
    result = string(v) + result
  }
  return 
}

7
এটি যখন কাজ করে, যেহেতু স্ট্রিংগুলি অপরিবর্তনীয়, এটি অত্যন্ত অদক্ষ। আমি আরও কার্যকর সমাধান পোস্ট করেছি।
পিটারসো

5
এই অনেক খুব বুঝতে সহজ। এটিকে আরও শক্ত করে দিন :-) (এবং এটির সাথে "আরও একটি যোগ")
রোবপ্রোগ

4
প্রতিক্রিয়াযুক্ত স্ট্রিং যদি আপনার বাধা না দেয় তবে এটি সেরা উত্তর।
বানজোকট

4
@ ডলম্যান - এটি কেন অক্ষরের সংমিশ্রণটি পরিচালনা করবে না? স্ট্রিংয়ের একটি ব্যাপ্তি একটি রুনকে দেয় যা একটি কোডপয়েন্ট।
স্টান আর।

4
@ স্ট্যানআর একটি রুনি একটি গ্লাইফ নয়। একটি গ্লিফ একাধিক কোডপয়েন্ট / রান থেকে তৈরি করা যেতে পারে। Reedbeta.com/blog/programmers-intro-to-unicode/#combining-marks দেখুন কোডপয়েন্টগুলিকে বিপরীত করা একটি ভিন্ন বেস কোড পয়েন্টের সাথে সংযুক্ত চিহ্নগুলি সংযুক্ত করবে।
ডলম্যান

14

এটি 2 টি বিষয় বিবেচনা করে ইউনিকোড স্ট্রিংয়ে কাজ করে:

  • পরিসর ইউনিকোড অক্ষর গণনা করে স্ট্রিংয়ে কাজ করে
  • স্ট্রিংটি ইন স্লাইস থেকে তৈরি করা যেতে পারে যেখানে প্রতিটি উপাদান একটি ইউনিকোড অক্ষর।

সুতরাং এখানে এটি যায়:

func reverse(s string) string {
    o := make([]int, utf8.RuneCountInString(s));
    i := len(o);
    for _, c := range s {
        i--;
        o[i] = c;
    }
    return string(o);
}

আমি বরাদ্দ করব i:=len(o)-1এবং তারপরে একটি এক লাইনে ফোল্ড করব for _, c:=range s { o[i--]=c; }। আমি প্রথম বন্ধনী ছাড়া ঘৃণা করি - এটি অনুমোদিত:for(_, c:=range s) { o[i--]=c; }
লরেন্স ডল

আপনি কি ব্যাখ্যা করতে পারেন _ কি করে?
লরেন্স ডল

7
@ সফটওয়্যার_মোনকি: ও [i--] = সি গোতে অনুমোদিত নয়। - এবং ++ হ'ল বিবৃতি, প্রকাশ নয়। _ এর অর্থ সেই পরিবর্তনশীলটিকে বাতিল (উপেক্ষা) করা।
রেন্ডি সুগিয়ান্তো 'ইউকু'

4
Go 1.1+ দিয়ে এটি স্ট্রিং ([] ইনট) লাইনে ত্রুটি ফিরে আসে, পরিবর্তে যদি [] রুনি টাইপের জন্য ও ব্যবহার করা হয়, সমস্ত কাজ
ওটুক

4
@ ইউকু: তারপরেও ব্যর্থ হয়: = "লেস মাইস \ u0301rables"
স্টিফান স্টিগার

13

থেকে golang / উদাহরণস্বরূপ / stringutil / reverse.go: যান উদাহরণস্বরূপ প্রকল্প , অ্যান্ড্রু Gerrand দ্বারা

/*
Copyright 2014 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
     http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Reverse returns its argument string reversed rune-wise left to right.
func Reverse(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}

স্ট্রিংটিকে বিপরীত করার জন্য খেলার মাঠে যান

স্ট্রিং "ব্রাউন" বিপরীত করার পরে, সঠিক ফলাফলটি "নরব" হওয়া উচিত, "নরব" নয়।
ও বর্ণের উপরে কবরটি নোট করুন।


ইউনিকোডের বিপরীত ফলাফল "f⃝ds⃝a" এর সাথে যেমন "as⃝df̅" সংযুক্ত অক্ষর সংরক্ষণের জন্য,
দয়া করে নীচে তালিকাভুক্ত অন্য কোডটি দেখুন:

http://rosettacode.org/wiki/Revers_a_string#Go


4
থেকে পার্থক্য সে বিষয়ে পরিষ্কারভাবে বর্ণনা করার জন্য ধন্যবাদ stackoverflow.com/a/10030772/3093387 - এটা মনে হয় যে এই দুই সমাধান কিভাবে তারা মত "কটা" স্ট্রিং হ্যান্ডেল পার্থক্য।
josliber

রোজটাকোড সমাধানটি উল্লেখ করার জন্য ধন্যবাদ যা অক্ষরগুলির সংমিশ্রণ পরিচালনা করে
ডলম্যান

11

আমি এই প্রশ্নটি লক্ষ্য করেছি যখন সাইমন তার সমাধান পোস্ট করেছিলেন , যেহেতু স্ট্রিংগুলি অপরিবর্তনীয়, খুব অদক্ষ। অন্যান্য প্রস্তাবিত সমাধানগুলিও ত্রুটিযুক্ত; তারা কাজ করে না বা তারা অদক্ষ।

স্ট্রিংটি বৈধ UTF-8 নয় বা স্ট্রিংটিতে সম্মিলিত অক্ষর রয়েছে তা ব্যতীত এখানে একটি কার্যকর সমাধান রয়েছে।

package main

import "fmt"

func Reverse(s string) string {
    n := len(s)
    runes := make([]rune, n)
    for _, rune := range s {
        n--
        runes[n] = rune
    }
    return string(runes[n:])
}

func main() {
    fmt.Println(Reverse(Reverse("Hello, 世界")))
    fmt.Println(Reverse(Reverse("The quick brown 狐 jumped over the lazy 犬")))
}

4
রিটার্ন স্ট্রিং (রুনস) পাশাপাশি কাজ করে।

4
@ টমি: না, return string(runes)সব ক্ষেত্রেই কাজ করে না।
পিটারএসও

আপনি দয়া করে কেন আরও কিছুটা ব্যাখ্যা করতে পারেন? আমি একটি ছোট প্রোগ্রাম তৈরি করেছি এবং এটি সেখানে কাজ করে, তবে আপনি যেসব ক্ষেত্রে কথা বলবেন সেগুলি সেখানে ট্রিগার হয় না? play.golang.org/p/yk1sAFFjol

4
@ টমি: আপনার সংক্ষিপ্ত প্রোগ্রামটি কেবল প্রমাণ করে যে প্রিন্টার বা টার্মিনালে প্রেরণ করা হলে NUL অক্ষরটি একটি NOP। আপনার রিভার্স 2 ফাংশন অ-ASCII UTF-8 এনকোডযুক্ত স্ট্রিংয়ের জন্য ব্যর্থ। আমি আপনার সংক্ষিপ্ত প্রোগ্রামটি সংশোধন করেছি যাতে এটি একটি বৈধ পরীক্ষা: play.golang.org/p/Ic5G5QEO93
peterSO

আরও একটি ভুল "সমাধান" যা অক্ষরগুলির সংমিশ্রণটি সঠিকভাবে পরিচালনা করে না।
ডলম্যান

11

এখানে অনেক উত্তর আছে। এর মধ্যে কয়েকটি পরিষ্কার নকল ates তবে বাম দিক থেকেও, সেরা সমাধানটি নির্বাচন করা শক্ত।

সুতরাং আমি উত্তরগুলি দিয়ে গিয়েছিলাম, ইউনিকোডের জন্য কাজ করে না এমন একটিটি ফেলে দিয়েছি এবং নকলগুলিও সরিয়েছি। আমি বেঁচে থাকাদের দ্রুততম খুঁজে পেতে বেঞ্চমার্ক করেছি। সুতরাং এট্রিবিউশন সহ ফলাফলগুলি (যদি আপনি যে উত্তরগুলি মিস করেছেন তবে তা যদি লক্ষ্য করেন তবে যোগ করার মতো মূল্য নির্ধারণ করুন, মাপদণ্ডটি সংশোধন করতে নির্দ্বিধায়):

Benchmark_rmuller-4   100000         19246 ns/op
Benchmark_peterSO-4    50000         28068 ns/op
Benchmark_russ-4       50000         30007 ns/op
Benchmark_ivan-4       50000         33694 ns/op
Benchmark_yazu-4       50000         33372 ns/op
Benchmark_yuku-4       50000         37556 ns/op
Benchmark_simon-4       3000        426201 ns/op

সুতরাং এখানে rmuller দ্বারা দ্রুততম পদ্ধতি :

func Reverse(s string) string {
    size := len(s)
    buf := make([]byte, size)
    for start := 0; start < size; {
        r, n := utf8.DecodeRuneInString(s[start:])
        start += n
        utf8.EncodeRune(buf[size-start:], r)
    }
    return string(buf)
}

কিছু কারণে আমি একটি বেঞ্চমার্ক যোগ করতে পারছি না, সুতরাং আপনি এটি থেকে অনুলিপি PlayGroundকরতে পারেন (আপনি সেখানে পরীক্ষা চালাতে পারবেন না)। এটির নাম পরিবর্তন করে চালানgo test -bench=.


এই "সমাধানগুলি" কোনওটিই চিহ্নগুলি সঠিকভাবে সংযুক্ত করে না।
ডলম্যান

7

আমি নিম্নলিখিত Reverseফাংশনটি লিখেছি যা ইউটিএফ 8 এনকোডিং এবং সম্মিলিত অক্ষরকে সম্মান করে:

// Reverse reverses the input while respecting UTF8 encoding and combined characters
func Reverse(text string) string {
    textRunes := []rune(text)
    textRunesLength := len(textRunes)
    if textRunesLength <= 1 {
        return text
    }

    i, j := 0, 0
    for i < textRunesLength && j < textRunesLength {
        j = i + 1
        for j < textRunesLength && isMark(textRunes[j]) {
            j++
        }

        if isMark(textRunes[j-1]) {
            // Reverses Combined Characters
            reverse(textRunes[i:j], j-i)
        } 

        i = j
    }

    // Reverses the entire array
    reverse(textRunes, textRunesLength)

    return string(textRunes)
}

func reverse(runes []rune, length int) {
    for i, j := 0, length-1; i < length/2; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
}

// isMark determines whether the rune is a marker
func isMark(r rune) bool {
    return unicode.Is(unicode.Mn, r) || unicode.Is(unicode.Me, r) || unicode.Is(unicode.Mc, r)
}

এটিকে যথাসম্ভব দক্ষ ও পঠনযোগ্য করার জন্য আমি যথাসাধ্য চেষ্টা করেছি। ধারণাটি সহজ, সম্মিলিত অক্ষরগুলির সন্ধানকারী রুনগুলির মধ্য দিয়ে অতিক্রম করে তারপরে জায়গায় সম্মিলিত অক্ষরের রানগুলি বিপরীত করুন। একবার আমরা সেগুলি সবগুলি coveredেকে ফেললে, পুরো স্ট্রিংয়ের রানগুলিও ঠিক জায়গায় করুন।

বলুন আমরা এই স্ট্রিংটি বিপরীত করতে চাই bròwnòদুই runes, এক দ্বারা প্রতিনিধিত্ব করা হয় oএবং এই ইউনিকোড জন্য এক \u0301aযে "কবর" প্রতিনিধিত্ব করে।

সরলতার জন্য, এর মতো স্ট্রিংটি উপস্থাপন করি bro'wn। আমরা প্রথমে যা করি তা হ'ল সম্মিলিত অক্ষরগুলি অনুসন্ধান করা এবং সেগুলি বিপরীত করুন। সুতরাং এখন আমরা স্ট্রিং আছে br'own। শেষ পর্যন্ত, আমরা পুরো স্ট্রিংটি বিপরীত করি এবং শেষ করি nwo'rb। এটি আমাদের কাছে ফেরত দেওয়া হয়েছেnwòrb

আপনি এটি ব্যবহার করতে চাইলে https://github.com/shomali11/util আপনি এখানে এটি পেতে পারেন।

কয়েকটি ভিন্ন ভিন্ন দৃষ্টিকোণ প্রদর্শন করার জন্য এখানে কয়েকটি পরীক্ষার কেস দেওয়া হয়েছে:

func TestReverse(t *testing.T) {
    assert.Equal(t, Reverse(""), "")
    assert.Equal(t, Reverse("X"), "X")
    assert.Equal(t, Reverse("b\u0301"), "b\u0301")
    assert.Equal(t, Reverse("😎⚽"), "⚽😎")
    assert.Equal(t, Reverse("Les Mise\u0301rables"), "selbare\u0301siM seL")
    assert.Equal(t, Reverse("ab\u0301cde"), "edcb\u0301a")
    assert.Equal(t, Reverse("This `\xc5` is an invalid UTF8 character"), "retcarahc 8FTU dilavni na si `�` sihT")
    assert.Equal(t, Reverse("The quick bròwn 狐 jumped over the lazy 犬"), "犬 yzal eht revo depmuj 狐 nwòrb kciuq ehT")
}

এখনও অবধি এটিই একমাত্র উত্তর যা স্ট্রিংয়ের সাথে কাজ করে যা গ্রাফিম ক্লাস্টার চরগুলি (সম্মিলিত অক্ষর) অন্তর্ভুক্ত করে যেমন 🙏2️⃣👌👁কোনটি বিপরীত হয় 👁👌2️⃣🙏। অন্যান্য উত্তরগুলির বেশিরভাগই ফিরে আসে 👁👌⃣️2🙏paiza.io/projects/K8_kOmxn-cGRR3ksh1vFtw
KEINOS

4
//Reverse reverses string using strings.Builder. It's about 3 times faster
//than the one with using a string concatenation
func Reverse(in string) string {
    var sb strings.Builder
    runes := []rune(in)
    for i := len(runes) - 1; 0 <= i; i-- {
        sb.WriteRune(runes[i])
    }
    return sb.String()
}


//Reverse reverses string using string
func Reverse(in string) (out string) {
    for _, r := range in {
        out = string(r) + out
    }
    return
}

BenchmarkReverseStringConcatenation-8   1000000 1571 ns/op  176 B/op    29 allocs/op
BenchmarkReverseStringsBuilder-8        3000000 499 ns/op   56 B/op 6 allocs/op

স্ট্রিংস.বিল্ডার ব্যবহার স্ট্রিং কনট্যাকটেশন ব্যবহারের চেয়ে প্রায় 3 গুণ বেশি গতিযুক্ত


4
আমি অবাক হই, কেন এই প্রশ্নের সুনির্দিষ্ট উত্তর হওয়া সত্ত্বেও কোনও পদক্ষেপ নেই
নীলেশ

4

এখানে বেশ আলাদা, আমি আরও কার্যকরী পদ্ধতির কথা বলতে চাই, অন্য উত্তরের মধ্যে তালিকাভুক্ত নয়:

func reverse(s string) (ret string) {
    for _, v := range s {
        defer func(r rune) { ret += string(r) }(v)
    }
    return
}

আমি নিশ্চিত যে এটি দ্রুততম সমাধান নয়, তবে এটি দেখায় যে retপ্রতি ডিফার ফাংশন দ্বারা কীভাবে রিটার্ন ভেরিয়েবলটিকে আরও প্রক্রিয়াকরণের জন্য বন্ধ করে রাখা হয়।
ভ্লাদিমির বাউর 14

ধীরে ধীরে অক্ষরগুলির সংমিশ্রণটি সঠিকভাবে পরিচালনা করে না।
ডলম্যান

4
আমি কতটা দ্রুত তা নিশ্চিত নই, তবে এটি সুন্দর।
donatJ

Go 1.14 এ এর ​​পারফরম্যান্সের উন্নতি হতে পারে। কমপক্ষে রিলিজ নোটগুলির দাবি মুলতুবি শূন্যের ওভারহেড রয়েছে।
ভ্লাদিমির বাউর 12

3

স্টিফান202 এর মূল পরামর্শ অনুযায়ী বিল্ডিং, এবং ইউনিকোড স্ট্রিংয়ের জন্য কাজ করে বলে মনে হচ্ছে:

import "strings";

func Reverse( orig string ) string {
    var c []string = strings.Split( orig, "", 0 );

    for i, j := 0, len(c)-1; i < j; i, j = i+1, j-1 {
        c[i], c[j] = c[j], c[i]
    }

    return strings.Join( c, "" );
}

বিকল্প, স্ট্রিং প্যাকেজ ব্যবহার করা হচ্ছে না, তবে 'ইউনিকোড-নিরাপদ' নয়:

func Reverse( s string ) string {
    b := make([]byte, len(s));
    var j int = len(s) - 1;
    for i := 0; i <= j; i++ {
        b[j-i] = s[i]
    }

    return string ( b );
}

+1 ওই কাজগুলো. তবে আমি অবশ্যই বলব যে এটি এখনই অদ্ভুত (এখনকার জন্য) এমন সাধারণ কাজের জন্য বিভক্ত হওয়া এবং যোগদান করা জরুরি ...
স্টিফেন202

@ মার্টিন: এই সম্পাদনার জন্য দুঃখিত আমি দুর্ঘটনাক্রমে আপনার প্রশ্নের উত্তর আপডেট করেছি ... আমাকে খুব লজ্জা লাগছে
স্টেফান202

@ স্টেফান - কোন সমস্যা নেই স্ট্রিং প্যাকেজ বাইটস ফাংশনের উপর ভিত্তি করে আমি একটি বিকল্প সমাধান যুক্ত করেছি।
মার্টিন ক্লেটনটন

@ নসরাদেনা: আমি একই মুহুর্তের মধ্যে ফিরে এসেছি (আমি অবাক হয়ে দেখলাম যে মার্টিন আমার উত্তরটি ঠিক ঠিক একই লেখা দিয়ে লিখেছিলেন ... এবং তারপরে এটি আমার উপর
ছড়িয়ে পড়ে

@ মার্টিন: আপনি আমাকে জিজ্ঞাসা করলে দ্বিতীয় সংস্করণটি আরও ভাল দেখায় :)
স্টিফান202

3

এটি দ্রুততম বাস্তবায়ন

func Reverse(s string) string {
    size := len(s)
    buf := make([]byte, size)
    for start := 0; start < size; {
        r, n := utf8.DecodeRuneInString(s[start:])
        start += n
        utf8.EncodeRune(buf[size-start:], r)
    }
    return string(buf)
}

const (
    s       = "The quick brown 狐 jumped over the lazy 犬"
    reverse = "犬 yzal eht revo depmuj 狐 nworb kciuq ehT"
)

func TestReverse(t *testing.T) {
    if Reverse(s) != reverse {
        t.Error(s)
    }
}

func BenchmarkReverse(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Reverse(s)
    }
}

সমাধানগুলির দ্রুততম বাস্তবায়ন দাবি করার আগে আপনি কী সমাধানগুলি বেঞ্চমার্ক করেছিলেন?
সাগুরেট

হ্যাঁ আমি করেছি, সে কারণেই বেঞ্চমার্ক রিভার্স কোড উপস্থিত রয়েছে :)। তবে আমার আর ফলাফল নেই।
rmuller

দ্রুত সমাধান, তবে এখনও এটি ভুল কারণ এটি অক্ষরগুলির সংমিশ্রণটি সঠিকভাবে পরিচালনা করে না।
ডলম্যান

@ ডলমেন যেমন বলেছেন যে এটির সাথে মিলিত অক্ষরগুলি পরিচালনা করে না এটি কি সত্য? এখানে কি কোনও সমাধান আছে যা করে?
geraldss

2

এই কোড অক্ষর একত্রিত করার ক্রম অক্ষর সংরক্ষণ করে এবং অবৈধ ইউটিএফ -8 ইনপুট নিয়েও কাজ করা উচিত।

package stringutil
import "code.google.com/p/go.text/unicode/norm"

func Reverse(s string) string {
    bound := make([]int, 0, len(s) + 1)

    var iter norm.Iter
    iter.InitString(norm.NFD, s)
    bound = append(bound, 0)
    for !iter.Done() {
        iter.Next()
        bound = append(bound, iter.Pos())
    }
    bound = append(bound, len(s))
    out := make([]byte, 0, len(s))
    for i := len(bound) - 2; i >= 0; i-- {
        out = append(out, s[bound[i]:bound[i+1]]...)
    }
    return string(out)
}

ইউনিকোড / আদর্শের আদিমরা যদি কোনও স্ট্রিংয়ের সীমানা ছাড়িয়ে বরাদ্দ না করে পুনরায় পুনরায় প্রবেশের অনুমতি দেয় তবে এটি কিছুটা দক্ষ হতে পারে। Https://code.google.com/p/go/issues/detail?id=9055 দেখুন ।


কোন ধরনের "অবৈধ হল UTF-8 ইনপুট" STRING মান রয়েছে: যখন থেকে রূপান্তর []byteকরতে stringযান প্রতিস্থাপন "অবৈধ হল UTF-8 ইনপুট" একটি বৈধ কোডপয়েন্ট দিয়ে \uFFFD
ডলম্যান

আমি উপরের মন্তব্যটি বুঝতে পারি না। আপনি কি বলছেন যে অবৈধ ইউটিএফ -8যুক্ত স্ট্রিংটি উপস্থাপন করার সময় এই কোডটির আচরণটি ভুল?
Rog

না, আমি বলছি যে গো-তে অবৈধ ইউটিএফ -8 stringবিদ্যমান নেই। তবে এটি একটিতে থাকতে পারে []byte
ডলম্যান

একটি গো স্ট্রিংয়ে [] বাইটের মতো অবৈধ utf-8 থাকতে পারে। উদাহরণস্বরূপ: play.golang.org/p/PG0I4FJfEN
Rog

2

আপনার যদি গ্রাফিম ক্লাস্টারগুলি পরিচালনা করতে হয় তবে ইউনিকোড বা রিজেক্সপ মডিউলটি ব্যবহার করুন।

package main

import (
  "unicode"
  "regexp"
)

func main() {
    str := "\u0308" + "a\u0308" + "o\u0308" + "u\u0308"
    println("u\u0308" + "o\u0308" + "a\u0308" + "\u0308" == ReverseGrapheme(str))
    println("u\u0308" + "o\u0308" + "a\u0308" + "\u0308" == ReverseGrapheme2(str))
}

func ReverseGrapheme(str string) string {

  buf := []rune("")
  checked := false
  index := 0
  ret := "" 

    for _, c := range str {

        if !unicode.Is(unicode.M, c) {

            if len(buf) > 0 {
                ret = string(buf) + ret
            }

            buf = buf[:0]
            buf = append(buf, c)

            if checked == false {
                checked = true
            }

        } else if checked == false {
            ret = string(append([]rune(""), c)) + ret
        } else {
            buf = append(buf, c)
        }

        index += 1
    }

    return string(buf) + ret
}

func ReverseGrapheme2(str string) string {
    re := regexp.MustCompile("\\PM\\pM*|.")
    slice := re.FindAllString(str, -1)
    length := len(slice)
    ret := ""

    for i := 0; i < length; i += 1 {
        ret += slice[length-1-i]
    }

    return ret
}

আমি আপনাকে 1'000 upvotes দিতে চাই এই পৃষ্ঠার অন্যান্য সমস্ত বাস্তবায়ন একটি STRING কে ভুলভাবে বিপরীত করেছে (একটি STRING টি অক্ষরের অনুক্রম নয়)।
স্টেফান স্টেইগার

এটি কাজ করে না। আপনি যদি স্ট্রিংটিকে দ্বিগুণ করেন তবে আপনি আসল স্ট্রিংটি পাবেন না। এই উদাহরণটিতে ব্যবহৃত শীর্ষস্থানীয় সংমিশ্রন ডায়ারেসিস (\ u0308) পূর্ববর্তী অক্ষরগুলির সাথে মিলিত হয় যখন বিপরীত হয় তখন ডাবল উমলাউট তৈরি করে 'এ' তৈরি করে। যদি strআউটপুট উদ্ধৃত হয় তবে এটি নেতৃস্থানীয় উক্তিটি সংশোধন করে!
জোশুয়া কোল্ডেন

2

আপনি একটি বিদ্যমান বাস্তবায়ন আমদানি করতে পারেন:

import "4d63.com/strrev"

তারপরে:

strrev.Reverse("abåd") // returns "dåba"

অথবা ইউনিকোডের সমন্বয়যুক্ত অক্ষরগুলি সহ একটি স্ট্রিং উল্টাতে:

strrev.ReverseCombining("abc\u0301\u031dd") // returns "d\u0301\u031dcba"

এই বাস্তবায়নগুলি ইউনিকোড মাল্টিবাইট এবং বিপরীত হলে অক্ষর অক্ষরগুলির সঠিক ক্রম সমর্থন করে।

দ্রষ্টব্য: অনেকগুলি প্রোগ্রামিং ভাষায় অন্তর্নির্মিত স্ট্রিং বিপরীত ফাংশনগুলি সংমিশ্রণ সংরক্ষণ করে না এবং সংযুক্ত অক্ষরগুলি সনাক্তকরণের জন্য কার্যকরভাবে আরও কার্যকর সময় প্রয়োজন।


1

এটি অবশ্যই সর্বাধিক মেমরি দক্ষ সমাধান নয়, তবে একটি "সাধারণ" ইউটিএফ -8 নিরাপদ সমাধানের জন্য নিম্নলিখিতটি কাজটি করবে এবং রানগুলি না ভেঙে দেবে।

এটি আমার মতে পৃষ্ঠায় সর্বাধিক পঠনযোগ্য এবং বোধগম্য।

func reverseStr(str string) (out string) {
    for _, s := range str {
        out = string(s) + out
    }

    return
}

1

নিম্নোক্ত দুটি পদ্ধতি দ্রুত সমাধানের চেয়ে দ্রুত সঞ্চালিত যা অক্ষরগুলির সংমিশ্রণ সংরক্ষণ করে , যদিও এটি বলে না যে আমি আমার বেঞ্চমার্ক সেটআপে কিছু মিস করছি।

//input string s
bs := []byte(s)
var rs string
for len(bs) > 0 {
    r, size := utf8.DecodeLastRune(bs)
    rs += fmt.Sprintf("%c", r)
    bs = bs[:len(bs)-size]
} // rs has reversed string

দ্বিতীয় পদ্ধতি দ্বারা অনুপ্রাণিত এই

//input string s
bs := []byte(s)
cs := make([]byte, len(bs))
b1 := 0
for len(bs) > 0 {
    r, size := utf8.DecodeLastRune(bs)
    d := make([]byte, size)
    _ = utf8.EncodeRune(d, r)
    b1 += copy(cs[b1:], d)
    bs = bs[:len(bs) - size]
} // cs has reversed bytes

আপনি নিজের মানদণ্ডে যা হারিয়েছেন তা এখানে: আপনার সমাধানটি দ্রুততর কারণ এটি সংযুক্ত অক্ষরগুলি সংরক্ষণ করে না। এগুলি তুলনা করা কেবল অন্যায়।
ডলম্যান

1

দ্রষ্টব্য: এই উত্তরটি ২০০৯ সালের, সুতরাং এখনই সম্ভবত আরও ভাল সমাধান রয়েছে।


কিছুটা 'রাউন্ডআউট' দেখায়, এবং সম্ভবত খুব দক্ষ নয়, তবে স্ট্রিংগুলি থেকে কীভাবে রিডার ইন্টারফেসটি ব্যবহার করতে পারা যায় তা চিত্রিত করে। ইউটিএফ 8 স্ট্রিংয়ের সাথে কাজ করার সময় ইন্টারভিেক্টরগুলি বাফার হিসাবেও খুব উপযুক্ত বলে মনে হয়।

এটি 'আকার' অংশটি ছেড়ে দেওয়ার সময় এবং এমনকি সন্নিবেশ দ্বারা ভেক্টরে সন্নিবেশ করানোর সময় আরও ছোট হবে, তবে আমি অনুমান করি যে এটি কম দক্ষ হবে, কারণ পুরো ভেক্টরটি প্রতিবার নতুন রুন যুক্ত হওয়ার পরে একে একে পিছনে ঠেলাঠেলি করা দরকার ।

এই সমাধানটি অবশ্যই utf8 টি অক্ষরের সাথে কাজ করে।

package main

import "container/vector";
import "fmt";
import "utf8";
import "bytes";
import "bufio";


func
main() {
    toReverse := "Smørrebrød";
    fmt.Println(toReverse);
    fmt.Println(reverse(toReverse));
}

func
reverse(str string) string {
    size := utf8.RuneCountInString(str);
    output := vector.NewIntVector(size);
    input := bufio.NewReader(bytes.NewBufferString(str));
    for i := 1; i <= size; i++ {
        rune, _, _ := input.ReadRune();
        output.Set(size - i, rune);
    }
    return string(output.Data());
}

আপনি কেন এই সমস্ত অনুবর্তনকারী সেমিকোলন যুক্ত করবেন?
মরতেজা আর

@ অলিভিয়ের-মাসন গো কোডটি ভাগ করে নেওয়ার সময় গোফএমটি সম্পর্কে জানার সময় এসেছে।
ডোলম্যান

4
উত্তরটি আট বছর আগে থেকেই ছিল।
অলিভার ম্যাসন

@ অলিভারমাসন কোনও অপূর্ণ সমাধান সমাধান করতে (বা মুছতে) দেরি করেন না।
ডলম্যান

0

একটি সংস্করণ যা আমি মনে করি ইউনিকোডে কাজ করে। এটি utf8 এ নির্মিত হয়েছে une রুন ফাংশন:

func Reverse(s string) string {
    b := make([]byte, len(s));
    for i, j := len(s)-1, 0; i >= 0; i-- {
        if utf8.RuneStart(s[i]) {
            rune, size := utf8.DecodeRuneInString(s[i:len(s)]);
            utf8.EncodeRune(rune, b[j:j+size]);
            j += size;
        }
    }
    return string(b);
}

0

রুনে এক প্রকার, তাই এটি ব্যবহার করুন। তদতিরিক্ত, গো সেমিকোলন ব্যবহার করে না।

func reverse(s string) string {
    l := len(s)
    m := make([]rune, l)

    for _, c := range s {
        l--
        m[l] = c
    }
    return string(m)
}

func main() {
    str := "the quick brown 狐 jumped over the lazy 犬"
    fmt.Printf("reverse(%s): [%s]\n", str, reverse(str))
}

প্রশ্নটি পোস্ট করা হলে এটি সেমিকোলন ব্যবহার করে।
OneOfOne

আরও একটি ভুল "সমাধান" যা অক্ষরগুলির সংমিশ্রণটি সঠিকভাবে পরিচালনা করে না।
ডলম্যান

0

কোড নীচে চেষ্টা করুন:

package main

import "fmt"

func reverse(s string) string {
    chars := []rune(s)
    for i, j := 0, len(chars)-1; i < j; i, j = i+1, j-1 {
        chars[i], chars[j] = chars[j], chars[i]
    }
    return string(chars)
}

func main() {
    fmt.Printf("%v\n", reverse("abcdefg"))
}

আরও তথ্যের জন্য http://golangcookbook.com/chapters/strings/reverse/
এবং http://www.dotnetperls.com/reverse-string-go দেখুন


0

সাধারণ স্ট্রিংয়ের জন্য এ জাতীয় নির্মাণ ব্যবহার করা সম্ভব:

func Reverse(str string) string {
    if str != "" {
        return Reverse(str[1:]) + str[:1]
    }
    return ""   
}

0

এর সাথে একটি সাধারণ স্ট্রোক rune:

func ReverseString(s string) string {
    runes := []rune(s)
    size := len(runes)
    for i := 0; i < size/2; i++ {
        runes[size-i-1], runes[i] = runes[i],  runes[size-i-1]
    }
    return string(runes)
}

func main() {
    fmt.Println(ReverseString("Abcdefg 汉语 The God"))
}
: doG ehT 语汉 gfedcbA

0
func Reverse(s string) string {
    r := []rune(s)
    var output strings.Builder
    for i := len(r) - 1; i >= 0; i-- {
        output.WriteString(string(r[i]))
    }

    return output.String()
}

উত্তরের জন্য ধন্যবাদ, তবে 32 টি উত্তর এবং কার্যত একরকম কিছু সহ, এটি কি বক্তৃতাতে সত্যই নতুন কিছু যুক্ত করে? যদি তা হয় তবে দয়া করে কেন এটি কার্যকর of তার কিছু ব্যাখ্যা দিয়ে ন্যায়সঙ্গত করুন। কোড-কেবলমাত্র উত্তরগুলি নিম্ন-মানের হিসাবে বিবেচিত হয়।
ggorlen

-1

এখানে আরও একটি সমাধান রয়েছে:

func ReverseStr(s string) string {
    chars := []rune(s)
    rev := make([]rune, 0, len(chars))
    for i := len(chars) - 1; i >= 0; i-- {
        rev = append(rev, chars[i])
    }
    return string(rev)
}

যাইহোক, উপরে ইয়াজুর সমাধানটি আরও মার্জিত কারণ যেহেতু তিনি এই []runeজায়গায় ফালিটি বিপরীত করেছেন ।


-1

তবুও আরেকটি সমাধান (টিএম):

package main 
import "fmt"

type Runes []rune

func (s Runes) Reverse() (cp Runes) {
    l := len(s); cp = make(Runes, l)
    // i <= 1/2 otherwise it will mess up with odd length strings
    for i := 0; i <= l/2; i++ { 
        cp[i], cp[l-1-i] = s[l-1-i], s[i] 
    }
    return cp
}

func (s Runes) String() string {
    return string(s)
}

func main() { 
    input := "The quick brown 狐 jumped over the lazy 犬 +odd" 
    r := Runes(input)
    output := r.Reverse()
    valid := string(output.Reverse()) == input
    fmt.Println(len(r), len(output), r, output.Reverse(), valid)
}

-1
package reverseString

import "strings"

// ReverseString - output the reverse string of a given string s
func ReverseString(s string) string {

    strLen := len(s)

    // The reverse of a empty string is a empty string
    if strLen == 0 {
        return s
    }

    // Same above
    if strLen == 1 {
        return s
    }

    // Convert s into unicode points
    r := []rune(s)

    // Last index
    rLen := len(r) - 1

    // String new home
    rev := []string{}

    for i := rLen; i >= 0; i-- {
        rev = append(rev, string(r[i]))
    }

    return strings.Join(rev, "")
}

পরীক্ষা

package reverseString

import (
    "fmt"
    "strings"
    "testing"
)

func TestReverseString(t *testing.T) {

    s := "GO je úžasné!"
    r := ReverseString(s)

    fmt.Printf("Input: %s\nOutput: %s", s, r)

    revR := ReverseString(r)

    if strings.Compare(s, revR) != 0 {
        t.Errorf("Expecting: %s\n. Got: %s\n", s, revR)
    }
}

আউটপুট

Input: GO je úžasné!
Output: !énsažú ej OG
PASS
ok      github.com/alesr/reverse-string 0.098s

ইনপুটটি এনএফসি-তে থাকলে এটি কাজ করে। তবে এখানে অন্যান্য বেশিরভাগ ভুল সমাধান হিসাবে এটি অক্ষরের সংমিশ্রণে কাজ করে না।
ডলম্যান

-1
    func reverseString(someString string) string {
        runeString := []rune(someString)
        var reverseString string
        for i := len(runeString)-1; i >= 0; i -- {
            reverseString += string(runeString[i])
        }
        return reverseString
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.