একটি স্ট্রিং বাইরে ক্রঞ্চ স্বরবর্ণ


22

কার্য বিবরণী

কখনও কখনও, আপনি একটি ছোট জায়গায় লিখছেন এমন কোনও জিনিসটির সত্যই আপনার প্রয়োজন হয়। স্বরগুলি ছেড়ে দেওয়া এবং লোকেদের ছেড়ে দেওয়ার জন্য এটি লোভনীয় হতে পারে - এবং এটি ব্যর্থ হচ্ছে, সত্যিকারের স্থানগুলির প্রয়োজন কার? Thssprfctlrdbl!

একটি ফাংশন বা প্রোগ্রাম লিখুন যা লোয়ারकेস স্বরগুলি সরায় aeiouএবং তারপরে ফাঁকা স্থান এবং তারপরে ইনপুট স্ট্রিং থেকে কোনও অক্ষর । তদুপরি, প্রতিবার আপনি কোনও চরিত্র অপসারণ করবেন, এটি অবশ্যই মুছে ফেলার যোগ্য যোগ্যতম চরিত্র হতে হবে । স্ট্রিং কিছু প্রদত্ত ইনপুট দৈর্ঘ্যের চেয়ে বেশি না হওয়া পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করতে হবে ।

† "এটি নিখুঁতভাবে পঠনযোগ্য!" তবে আপনি যদি এই পাদটীকাটি পড়ছেন তবে সম্ভবত এটি সত্যই নয় ... :)

উদাহরণ

এখানে, আপনি ক্রমান্বয়ে আরও ছোট ইনপুট আকারের জন্য এই প্রক্রিয়াটি প্রয়োগ দেখতে পাচ্ছেন:

23: Hello, Code Golf World!
22: Hello, Code Golf Wrld!
21: Hello, Code Glf Wrld!
20: Hello, Cod Glf Wrld!
19: Hello, Cd Glf Wrld!
18: Hell, Cd Glf Wrld!
17: Hll, Cd Glf Wrld!
16: Hll, Cd GlfWrld!
15: Hll, CdGlfWrld!
14: Hll,CdGlfWrld!
13: Hll,CdGlfWrld
12: Hll,CdGlfWrl
11: Hll,CdGlfWr
(etc.)

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

এখানে কয়েকটি সিউডোকোড পাইথন কোড যা এই চ্যালেঞ্জটি সমাধান করে:

def crunch_string(string, to_length):
    while len(string) > to_length:
        # Store the best candidate index for deletion here.
        best = None

        # First, find the rightmost vowel's index.
        for i in range(len(string)):
            if string[i] in 'aeiou':
                best = i

        # If there were no vowels, find the rightmost space's index.
        if best is None:
            for i in range(len(string)):
                if string[i] == ' ':
                    best = i

        # If there were no spaces either, use the final index.
        if best is None:
            best = len(string) - 1

        # Remove the selected character from the string.
        string = string[:best] + string[best + 1:]

    # Return the string once `len(string) <= to_length`.
    return string

বিধি

  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

  • ইনপুট স্ট্রিংটিতে প্রিন্টযোগ্য ASCII অক্ষরগুলি স্থান থেকে ( , দশমিক 32) পর্যন্ত টিলড (এবং ~দশমিক 126) সহ থাকবে । AEIOUস্ট্রিংয়ে কোনও বড় হাতের অক্ষর থাকবে না । বিশেষত, কোনও ইউনিকোড, ট্যাব বা নতুনলাইন জড়িত থাকবে না।

  • ইনপুট স্ট্রিং গুলি এবং ইনপুট লক্ষ্য দৈর্ঘ্যের টি কল করুন । তারপরে 0 <t ≤ দৈর্ঘ্য ( গুলি ) 00 10000 গ্যারান্টিযুক্ত। (বিশেষ করে, ইনপুট স্ট্রিং ফাঁকা থাকবে না। তাহলে টি দৈর্ঘ্য (= গুলি ), আপনি শুধু স্ট্রিং অপরিবর্তিত আসতে উচিত।)

পরীক্ষার মামলা

Input:  50, Duis commodo scelerisque ex, ac consectetur metus rhoncus.
Output: Duis commodo scelerisque ex, ac cnscttr mts rhncs.

Input:  20, Maecenas tincidunt dictum nunc id facilisis.
Output: Mcnstncdntdctmnncdfc

Input:  150, golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf
Output: glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glfglfglfglfglfglfglfglfglfglf

5
yস্বর কি ?
edc65

1
বিশ্বাস করতে পারছি না আমি তা ব্যাখ্যা করতে ভুলে গেছি! না, aeiouস্বরবর্ণ, এবং AEIOUসরলতার জন্য ঘটবে না। (পুরো বড় হাতের অক্ষর / ছোট হাতের জিনিসটি আমি ফোকাস করতে চাই না)) আমি স্পষ্টতা যোগ করেছি।
লিন

1
খুব সুন্দর চ্যালেঞ্জ!
লুইস মেন্ডো

@ edc65 ভুলবেন না w(উদাহরণস্বরূপ, শব্দ কো মধ্যে W , wঅবশ্যই, এই এক জন্য বসতি স্থাপন হচ্ছে একটি স্বরবর্ণ!), কিন্তু যেখানে জন্য এটি বিবৃত না যে স্বরবর্ণ সেট aeiou, আপনি কখনও কখনও অন্তর্ভুক্ত করা উচিত yএবং w। :
-ও

গল্ফিংয়ের সাথে সম্পর্কিত নয়, তবে নির্মাণের for index, char in enumerate(string)পরিবর্তে বিবেচনা করুনrange(len(str))
জেরেমি ওয়েরিচ

উত্তর:


6

এমএটিএল , 20 বাইট

t11Y2mEG32=+K#Si:)S)

এটি অনলাইন চেষ্টা করুন!

t       % implicitly input string. Duplicate
11Y2    % predefined literal 'aeiou'
m       % ismember. Gives true for input characters that are vowels
E       % multiply by 2
G       % push input string again
32      % ASCII for space
=       % gives true for input characters that are spaces
+       % add: gives 2 for vowels, 1 for space, 0 for non-vowels-and-non space
K#S     % sort and push only the indices of the sorting. Sorting is stable, so first 
        % will be non-vowels-and-non space characters in their original order, then
        % spaces in their original order, then vowels in their original order
i       % input number n of characters that should be kept
:       % range [1,2,...,n]
)       % index with that: keep first n indices of the sorting
S       % sort those indices to restore their original order
)       % index into input string to keep only those characters. Implicitly display

11

পার্ল, 48 45 43 বাইট

এর জন্য +4 অন্তর্ভুক্ত -Xlpi(-এক্স ছেড়ে যেতে পারে তবে এসটিডিআরআরতে কুৎসিত সতর্কতা ছেড়ে দেয়)

-iবিকল্পের পরে নম্বর এবং এসটিডিআইএন-এ ইনপুট দিয়ে চালান (একাধিক লাইনের সমর্থনও করে)। যেমনperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."

crunch.pl:

s/.*\K[aeiou]|.*\K |.$// while pos=-$^I

আপনি মধ্যে স্থান প্রয়োজন হবে না /$+/এবংwhile
hmatt1

আমার মনে হয় আপনি "^ I" এর পরিবর্তে ^ I (ট্যাব অক্ষর) ব্যবহার করে একটি বাইট শেভ করেন। (স্বীকৃত।)
এমএস 210

@ চিলিমাজিক: / $ + / এর মধ্যে ফাঁকা জায়গা ছেড়ে দেওয়া এবং যখন কেবল পুরানো পার্লসের সাথে কাজ করে। সাম্প্রতিক পার্লস নতুন রেজেক্স সংশোধক (
ওএইডি

@ এমএস 210: কিছু যাদু ভেরিয়েবলের জন্য কাজ করে তবে হোয়াইটস্পেসের উপর ভিত্তি করে নয়
টন হসপেল

6

জাভাস্ক্রিপ্ট (ES6), 66 61 বাইট

সংরক্ষিত 5 বাইট @ নীলকে ধন্যবাদ

f=(s,n)=>s[n]?f(s.replace(/(.*)[aeiou]|(.*) |.$/,"$1$2"),n):s

আমি মনে করি না রেজেক্স আরও গল্ফযোগ্য। আশ্চর্যের বিষয় হল, সামনের থেকে সামনের দিকে আপনি সামনের থেকে টু ব্যাক সরিয়ে ফেলতে পারা একটি দীর্ঘতর বাইট:

f=(s,n)=>s[n]?f(s.replace(/(.*?)[aeiou]|(.*?) |./,"$1$2"),n):s

আরও আকর্ষণীয় প্রচেষ্টা (ES7), 134 বাইট

(s,n,i=0)=>[for(c of s)[/[aeiou]/.test(c)*2+(c<'!'),i++,c]].sort(([x],[y])=>x-y).slice(0,n).sort(([,x],[,y])=>x-y).map(x=>x[2]).join``

এটি এমএটিএল উত্তরের অনুরূপ একটি পদ্ধতির ব্যবহার করে।


1
গল্ফযোগ্য না হলে আমি যত্নশীল না, এটি একটি সুন্দর রেইজেক্স।
নীল

যদিও আমি সবেমাত্র লক্ষ্য করেছি যে আপনি |.$/,"$1$2"5 বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন ।
নীল

@ নীল টিপটির জন্য ধন্যবাদ!
ইটিএইচ প্রডাকশনগুলি

2

sh + gnu সেড, 78 61

STDINপ্রথম আর্গুমেন্ট হিসাবে স্ট্রিংটি দৈর্ঘ্য সরবরাহ করুন ।

rev|sed -r ":                       # reverse + invoke sed + jump label ":"
/..{$1}/!q                          # if the length is not greater $1, quit
p                                   # print
s/[aeiou]//                         # delete the first vowel
t                                   # if successful, start over at ":"
s/ //                               # delete the first space
t                                   # if successful, start over at ":"
s/.//                               # delete the first character
t"|rev                              # if successful, start over at ":" + reverse

2

লুয়া, 120 বাইট

s=arg[2]:reverse()a=s:len()-arg[1]s,n=s:gsub('[aeiou]','',a)s,m=s:gsub(' ','',a-n)print(s:gsub('.','',a-n-m):reverse())

lua crunch.lua 10 "This is a string"আউটপুট সহ বিন্যাসে কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয় Ths sstrng

ব্যাখ্যা:

-- Set 's' to the reverse of the string
s=arg[2]:reverse()
-- Set 'a' to the number of characters to be removed
a=s:len()-arg[1]
-- Remove 'a' vowels, set 'b' to the number of substitutions
s,b=s:gsub('[aeiou]','',a)
-- Remove 'a-b' spaces, set 'c' to the number of substitutions
s,c=s:gsub(' ','',a-b)
-- Remove 'a-b-c' characters, and print the now un-reversed string
print(s:gsub('.','',a-b-c):reverse())

1

পার্ল, 68

ডান থেকে সরানো একটি টন অক্ষর যুক্ত করে, সম্ভবত এটি করার আরও ভাল উপায় আছে।

$_=reverse;while(length>$^I){s/[aeiou]//||s/ //||s/.//}$_=reverse

-iনম্বরটি ইনপুট করতে ব্যবহার করুন। এটা তোলে 65 অক্ষর প্লাস জন্য 3 i, pএবং lকমান্ড লাইন।

সাথে চালান:

echo 'Hello, Code Golf World!' | perl -i13 -ple'$_=reverse;while(length>$^I){s/[aeiou]//||s/ //||s/.//}$_=reverse'

আপনি তার y///cপরিবর্তে ব্যবহার করতে পারেন lengthএবং আপনি শেষ লুপটি শেষের দিকে সরিয়ে নিতে পারেন:s///||s///||s///while$^I<y///c
andlrc

1

জাভা 8, 303 বাইট

(s,j)->{String t="";for(int i=s.length()-1;i>=0;t+=s.charAt(i--));while(t.length()>j&&t.matches(".*[aeiou].*"))t=t.replaceFirst("[aeiou]","");while(t.length()>j&&t.contains(" "))t=t.replaceFirst("\\s","");s="";for(int i=t.length()-1;i>=0;s+=t.charAt(i--));return s.substring(0,Math.min(t.length(),j));};

এটি বেশ দীর্ঘ। আমি শীঘ্রই এটি ছোট করার চেষ্টা করব। জাভা যদি স্ট্রিং এবং পশ্চাৎ প্রতিস্থাপনগুলির বিপরীতকরণের জন্য কোনও পদ্ধতি থাকে তবে এটি আরও সংক্ষিপ্ত হবে।

নিম্নলিখিত দিয়ে পরীক্ষা:

public class StringCruncher {
    public static void main(String[] args) {
        Tester test = (s,j)->{String t="";for(int i=s.length()-1;i>=0;t+=s.charAt(i--));while(t.length()>j&&t.matches(".*[aeiou].*"))t=t.replaceFirst("[aeiou]","");while(t.length()>j&&t.contains(" "))t=t.replaceFirst("\\s","");s="";for(int i=t.length()-1;i>=0;s+=t.charAt(i--));return s.substring(0,Math.min(t.length(),j));};
        System.out.println(test.crunch("golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf", 150));
    }
}
interface Tester {
    String crunch(String s, int j);
}


@ কিউস দেখে মনে হচ্ছে এই ক্ষেত্রে ( s->j->{...}) কারিটিংয়ের কাজ করে না । আমি মনে করি জাভা এটি খুব ভাল সমর্থন করে না বা আমি এটি ভুল সেট আপ করছি।
GamrCorps

প্রথম শ্রেণীর ফাংশনগুলির কারণে সঙ্কলিত ভাষাগুলি সম্ভবত কারিঙের সাথে কঠিন সময় কাটাচ্ছে
ক্যালকুলেটরফ্লাইন

@ গ্যামার কর্পস আমি পরীক্ষা করে দেখব যে আমি বাড়ি এলে এটি কাজ করতে পারি
কিনা

1

সি #, 180 বাইট

string c(int l,string s){while(s.Length>l){int i=0;Func<string,bool>f=t=>(i=s.LastIndexOfAny(t.ToCharArray()))!=-1;if(!(f("aeiou")||f(" ")))i=s.Length-1;s=s.Remove(i,1);}return s;}

পরীক্ষক:

using System;
class Crunch
{
    static int Main()
    {
        var x = new Crunch();
        Console.WriteLine(x.c(50, "Duis commodo scelerisque ex, ac consectetur metus rhoncus."));
        Console.WriteLine(x.c(20, "Maecenas tincidunt dictum nunc id facilisis."));
        Console.WriteLine(x.c(150, "golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf"));
        Console.Read();
        return 0;
    }
    string c(int l,string s){while(s.Length>l){int i=0;Func<string,bool>f=t=>(i=s.LastIndexOfAny(t.ToCharArray()))!=-1;if(!(f("aeiou")||f(" ")))i=s.Length-1;s=s.Remove(i,1);}return s;}

    static string crunch(int len, string str)
    {
        Console.WriteLine($"{str.Length}: {str}");
        while (str.Length > len) {
            int idx=0;
            Func<string,bool> f = s => (idx = str.LastIndexOfAny(s.ToCharArray()))!= -1;
            if (!(f("aeiou") || f(" "))) idx = str.Length-1;
            str = str.Remove(idx,1);
            Console.WriteLine($"{str.Length}: {str}");
        }
        return str;
    }
}

1

স্কালা, 160 বাইট

type S=String;def f(s:S,l:Int)={def r(s:S,p:S):S=if(s.size>l){val j=s.replaceFirst("(?s)(.*)"+p,"$1");if(j==s)s else r(j,p)}else s;r(r(r(s,"[aeiou]")," "),".")}

পরীক্ষক:

val t="Hello, Code Golf World!"
println((t.size to 11 by -1).map(f(t,_)).mkString("\n"))

1

ডায়ালগ এপিএল, 77 45 42 বাইট

t[⌽i~⌽⎕↓⌽∪∊(t∊'aeiou')(' '=t)1/¨⊂i←⍳⍴t←⌽⍞]

t[...] লেটার অব টি সূচকের সঙ্গে ...
t←⌽⍞ T বিপরীত পাঠ্য ইনপুট পায়
i←⍳⍴t আমি দৈর্ঘ্য সূচকের পায় টন
/¨⊂i একাধিক (3) উপাদানের বুলিয়ান মান নির্বাচন আমি :
1. (t∊'aeiou')বুলিয়ান যেখানে স্বরবর্ণ
2. (' '=t)বুলিয়ান যেখানে স্থান
3. 1সব ∪∊তালিকাভুক্ত অনন্য ( সমতল) 3 টি নির্বাচনগুলি
⌽⎕↓⌽সর্বশেষ মূল্যায়িত-ইনপুটযুক্ত অক্ষরগুলি বাদ দেয় (একই (-⎕)↓)
⌽i~কিছু অপসারণের পরে অবশিষ্ট সূচকগুলি উল্টো করে দেয়


আসল উত্তর:

⎕{⍺≥≢⍵:⌽⍵⋄∨/⍵∊⍨v←'aeiou':⍺∇⍵/⍨~<\(⍳⍴⍵)∊⍵⍳v⋄' '∊⍵:⍺∇⍵/⍨~<\(⍳⍴⍵)=⍵⍳' '⋄⍺∇1↓⍵}⌽⍞

Ehm, হাঁ, যে হয় একটু কঠিন পড়তে। মূলত এপিএলে ওপির সরাসরি অনুবাদ:

  1. বিপরীত ইনপুট।
  2. যদি প্রয়োজনীয় দৈর্ঘ্য দীর্ঘ হয় বা (বিপরীত) ইনপুট স্ট্রিংয়ের গণনার সমান হয়, তবে বিপরীত (বিপরীত) আর্গুমেন্টটি ফেরত দিন।
  3. অন্যথায়, যদি তর্কের কোনও স্বর থাকে তবে প্রথমটি (অর্থাত্ শেষ) একটি সরিয়ে ফেলুন এবং যা অবশিষ্ট আছে তা পুনরাবৃত্তভাবে কল করুন।
  4. অন্যথায়, যদি তর্কের কোনও স্থান থাকে তবে প্রথমটি (যেমন শেষ) সরিয়ে ফেলুন এবং যা অবশিষ্ট রয়েছে তার জন্য পুনরাবৃত্তভাবে কল করুন।
  5. অন্যথায়, প্রথম (অর্থাত্ শেষ) অক্ষরটি সরিয়ে ফেলুন এবং যা অবশিষ্ট আছে তা পুনরাবৃত্তভাবে কল করুন।

0

গণিত, 201 বাইট

f@x_:=StringReplaceList[x,"a"|"e"|"i"|"o"|"u"->""];g@x_:=StringReplaceList[x," "->""];x_~l~y_:=NestWhile[If[f@#!={},Last@f@#,If[g@#!={},Last@g@#,Last@StringReplaceList[#,_->""]]]&,x,StringLength@#!=y&]

এর চেয়ে আরও ভাল উপায় অবশ্যই থাকতে হবে ..


0

আর, 169 143 বাইট

function(x,y){d=utf8ToInt(x);o=c(rev(which(d%in%utf8ToInt('aeiou'))),rev(which(d==32)));intToUtf8(d[sort(tail(c(o,setdiff(nchar(x):1,o)),y))])}

* সম্পাদনাটি পুনরায় লেখার মাধ্যমে 36 বাইট সংরক্ষণ করেছে utf8ToInt -> intToUtf8রূপান্তরগুলি নয় strstplitএবংpaste0(...,collapse)

ব্যাখ্যার সাথে ungolfed

function(x,y){d=utf8ToInt(x);         # convert string (x) to integer
o=c(
 rev(which(d%in%utf8ToInt('aeiou'))), # index of vowels (reversed)
 rev(which(d==32)));                  # index of spaces
 intToUtf8(d[                         # convert subset back to character
   sort(tail(                         # return the first y index of 
                                      # "left over" characters
   c(o,setdiff(nchar(x):1,o))         # combine vowels, spaces and 
                                      # other indices in appropriate order
  ,y))])}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.