एक तार में वर्णों को मिलाना


10

आपको एक फ़ंक्शन / प्रोग्राम लिखना होगा जो stdin/ कमांड-लाइन तर्क / फ़ंक्शन तर्क के माध्यम से इनपुट लेता है, एक स्ट्रिंग में वर्णों को मिलाता है, और फिर के माध्यम से अंतिम स्ट्रिंग आउटपुट करता है stdout

इनपुट में पहले एक स्ट्रिंग (खाली या नहीं null), एक स्थान होगा, और फिर गैर-नकारात्मक संख्याओं की संख्या भी होगी जो सभी रिक्त स्थान से अलग होती है। यदि इनपुट को फ़ंक्शन तर्कों के माध्यम से लिया जाता है, तो स्ट्रिंग दलीलों में से एक होगी जबकि पूर्णांक, जो एक स्थान से अलग हो रहे हैं, अन्य होंगे। आपको संख्याओं के लगातार जोड़े के अनुरूप सूचकांकों पर स्ट्रिंग के पात्रों को स्वैप करना होगा।

उदाहरण के लिए:

Hello_world! 0 6

में परिणाम होना चाहिए

wello_Horld!

मान्यताओं

  • आप 0-आधारित और 1-आधारित अनुक्रमण के बीच चयन कर सकते हैं, और मान सकते हैं कि दिए गए अनुक्रमणिका हमेशा सीमा में रहेंगे।
  • स्ट्रिंग 100 वर्णों से अधिक नहीं होगा और केवल रेंज में ASCII वर्ण जाएगा !करने के लिए ~(चरित्र कोड 0x7E को 0x21, सम्मिलित)। संदर्भ के लिए ASCII तालिका देखें ।
  • एक जोड़ी में दो सूचकांक समान हो सकते हैं (जिस स्थिति में, उस चरण में कुछ भी नहीं बदला जाता है)।

स्कोरिंग

यह कोड गोल्फ है, इसलिए सबसे छोटा सबमिशन (बाइट्स में) जीतता है।

परीक्षण के मामलों

Hello_world! 0 6 => wello_Horld!
First 1 2 1 0 0 4 => tFisr
(Second!$$) 8 7 10 1 => ()econd$!$S
~Third~ 0 0 6 6 0 6 6 0 => ~Third~

2
भविष्य की चुनौतियों के लिए, मुझे सैंडबॉक्स की सिफारिश करने दें जहां आप प्रतिक्रिया प्राप्त कर सकते हैं और इसे मुख्य पर पोस्ट करने से पहले अपनी चुनौती को पॉलिश कर सकते हैं (यह मौजूदा उत्तरों को अमान्य करने के जोखिम को कम करता है यदि कोई आपकी चुनौती में एक गंभीर दोष का पता लगाता है जिसे ठीक करने की आवश्यकता है)।
मार्टिन एंडर

स्टैण्ड पर इनपुट की आवश्यकता क्यों है, और कमांड लाइन के तर्क के रूप में, उदाहरण के लिए नहीं?
lrn

@ एलआरएन, राइट। 2 और विकल्प जोड़े।
स्पिकट्रिक्स

मुझे नीचे दिए गए समाधानों का एक समूह दिखाई देता है, जो यह मानते हैं कि वे एक सरणी के रूप में सूचकांकों की सूची प्राप्त कर सकते हैं जो उनके द्वारा कार्यान्वित फ़ंक्शन में पास हो जाते हैं। जिस तरह से मैं आपकी परिभाषा पढ़ता हूं, इनपुट एक सिंगल स्ट्रिंग है, जिसमें इंडेक्स के साथ-साथ वे स्ट्रिंग भी होती हैं, जिस पर वे काम करते हैं, और इनपुट स्ट्रिंग से इंडेक्स निकालना उस कोड का हिस्सा होता है, जिसे गोल्फ की जरूरत होती है। क्या आप स्पष्ट कर सकते हैं कि कौन सी व्याख्या सही है?
रेटो कोराडी

@RetoKoradi, No. इनपुट पूर्ण स्ट्रिंग नहीं है। इसमें एक स्ट्रिंग है, और फिर संख्याएँ हैं। संख्या स्ट्रिंग में शामिल नहीं हैं।
स्पिकट्रिक्स

जवाबों:


6

सीजेएम, 11 बाइट्स

rr{irie\r}h

यह काम किस प्रकार करता है

यह थोड़ा अलग दृष्टिकोण है, जिसमें मैं बस एक-दो बार लूप चलाता हूं जब तक कि मेरे पास इनपुट में संख्याओं के जोड़े न बचे।

r                 e# Read the first string
 r                e# Read the first number of the first number pair in the input
  {      }h       e# Do a do-while loop
   i              e# Convert the first number from the pair to integer
    ri            e# Read the second number from the pair and convert to intger
      e\          e# String X Y e\ works by swapping the Xth index with the Yth index in the
                  e# String
        r         e# This is our exit condition of the do-while loop. If we still have
                  e# a number on the input left, that means there are more pairs to swap.
                  e# Otherwise, we exit the loop and the result is printed automatically

इसे यहाँ ऑनलाइन आज़माएँ


6

पायथन 3, 89 86 बाइट्स

[*s],*L=input().split()
while L:a,b,*L=map(int,L);s[a],s[b]=s[b],s[a]
print(*s,sep="")

सभी चीजों को अनपैक करें। (3 बाइट्स ने @ पोटाटो को धन्यवाद दिया)


कुछ बाइट्स सहेजें और ऐसा करें: [*s],*L=input().split()आप इसके बाद लाइन को दूर ले जा सकते हैं। मैं वास्तव में अपने समाधान btw पसंद है, यह बहुत सुंदर है, भले ही यह बहुत गोल्फ है।
आलू

@potato अरे वाह, मुझे नहीं पता था कि आप एक साथ दो अनपैक कर सकते थे (मुझे लगा कि आप केवल 3.5 में ऐसा कर सकते हैं)। धन्यवाद!
Sp3000

4

सीजेएम, 13 बाइट्स

r[q~]2/{~e\}/

इसका परीक्षण यहां करें।

व्याख्या

r             e# Read the first token, i.e. the string.
 [q~]         e# Read the rest of the input, eval it and wrap it in an array.
     2/       e# Split the array into pairs of consecutive elements.
       {   }/ e# For each pair.
        ~     e# Unwrap the array.
         e\   e# Swap the corresponding elements in the string.

वाह। एक जवाब की उम्मीद नहीं की थी कि तेजी से!
स्पिकैट्रिक्स

2

सी (137 बी)

f(char*T,int*V,int L){int C=0;for(int j=0;j<strlen(T);C=++j){for(int i=L-1;i+1;i--)if(C==V[i]){C=V[i-i%2*2+1];i-=i%2;}printf("%c",T[C]);}}

स्पष्टीकरण आ रहा है ...

तर्क

T = टाइप चार का एक शब्द *

V = पूर्णांक तत्वों की सम संख्या का एक सरणी।

L = V की लंबाई

उत्पादन

मिश्रित स्ट्रिंग

यह कैसे काम करता है ? :

सरणी V की संख्या को इसके विपरीत, और वास्तविक बिंदु तक इसकी सभी प्रगति को ट्रैक करने के बाद स्ट्रिंग का nth तत्व डालता है। उदाहरण

इनपुट = टी = "फर्स्ट", वी = {१,२,१,०,०,४}

V उलटा = {४,०,०,१,२,१}

V[0] = 4th element -> index 0
0 -> 1
1->2

4th element 't' receives the second = 'r'

V[1] = 0 -> index 4
4 isnt mentionned after so , no changes

0 element='F' receives the fourth= 't'

V[3] = 1st element -> index 0
no changes

V[4] = 2 -> index 1
no changes after ..

इसे यहाँ आज़माएँ


1
@ Agawa001, आप इसे बहुत अधिक गोल्फ कर सकते हैं। रिटर्न प्रकार intकी आवश्यकता नहीं है (अप्रत्याशित व्यवहार में परिणाम हो सकता है), और intचर जो पैरामीटर की आवश्यकता नहीं है int, चर की आवश्यकता होती है , लूप में घोषित करने के putcharबजाय लूप के बाहर एक स्थान पर घोषित किया जा सकता है, printfआदि के बजाय उपयोग करें
स्पिकटिक्स

2

पायथन 3 - 161 149

import sys
t=sys.stdin.read().split()
q=list(t[0])
c=1
i=int
while c<len(t):n=q;a=i(t[c]);b=i(t[c+1]);n[a]=q[b];n[b]=q[a];q=n;c+=2;
print(''.join(q))

कुछ चरों के आसपास गमागमन करके और ;टिम की टिप्पणी के रूप में उपयोग करके अधिक गोल्फिंग की गई ।

मुझे उम्मीद थी कि यह गोल्फ को देखकर आएगा, बस इतना नहीं।


1
आप इसे बहुत गोल्फ कर सकते हैं। बदले whileके लिए while c<len(t):line1;line2;line3...c=c+2को जाता हैc+=2
टिम

@ टिम आपकी मदद के लिए धन्यवाद!
ASCIIThenANSI

0 पर शुरू नहीं करना चाहिए?
टिम

@ टिम नोप। cवास्तव में tउन पदों को प्राप्त करने के लिए अनुक्रमणिका (इनपुट) है जिन्हें हमें स्वैप करने की आवश्यकता है। लेकिन चूंकि t[0]स्ट्रिंग है हमें चारों ओर स्वैप करने की आवश्यकता है, t[1]और स्वैप t[2]की पहली जोड़ी को पकड़ें।
ASCIIThenANSI

आह, मैं देख रहा हूँ, हाँ। क्षमा करें, मेरा समाधान इनपुट से अलग हो गया, इसलिए मैंने अनुमान लगाया कि आपने ऐसा ही किया है :)
टिम

2

सी, 109 107 102 बाइट्स

i;f(l){l=sizeof(a)/sizeof(*a);char t;for(;i<l;i+=2){t=s[a[i]];s[a[i]]=s[a[i+1]];s[a[i+1]]=t;}puts(s);}

नोट: sऔर aवैश्विक सरणियों के रूप में घोषित किए जाने की आवश्यकता है। sवह स्ट्रिंग है जिसे आप स्वैप करना चाहते हैं और सभी संख्या मानों aकी एक सरणी है int

यदि उपरोक्त कोड काम नहीं करता है, तो void f(){...}इसके बजाय उपयोग करने का प्रयास करेंf(){...}

अघोषित कोड:

int a[]={1, 2, 1, 0, 0, 4};//Integer elements
char s[]="First";          //String to be swapped

i; //Auto initialized to 0 and defaults to type int
void f(l){ //Variables defaults to type int
  l=sizeof(a)/sizeof(*a); //Gets number of elements in array a
  char t;

  for(;i<l;i+=2){ 

    t=s[a[i]];
    s[a[i]]=s[a[i+1]];
    s[a[i+1]]=t;  //Swap each character

  }

  puts(s); //Print the final char array
}

इसका परीक्षण यहां करें


हम्म उर कोड छोटा है :)
Abr001am

lol चर घोषणा कहां है? उर कोड को कड़ा करने के लिए एक धोखा देने वाला तरीका: पी
Abr001am

@ Agawa001, मैंने चर घोषणा को शामिल नहीं किया क्योंकि बाइट्स प्रत्येक परीक्षण मामले के साथ अलग-अलग होंगे।
स्पिकट्रिक्स

यह समस्या में परिभाषित इनपुट से मेल नहीं खाता है। इनपुट एक एकल स्ट्रिंग है। जब तक मैं समस्या को पूरी तरह से गलत नहीं मानता, तब तक आपको इनपुट स्ट्रिंग से इंडेक्स वैल्यू निकालने की जरूरत है।
रेटो कोराडी

1

पायथन 3, 135

x=input().split()
y=list(x[0])
z=[int(i)for i in x[1:]]
while z:p,c=y[z[0]],y[z[1]];y[z[0]],y[z[1]]=c,p;del z[0],z[0]
print(''.join(y))

स्पष्टीकरण:

x=input().split()         # Split the input into a list at each space
y=list(x[0])              # First item in list (the word) into a list of chars
z=[int(i)for i in x[1:]]  # Make the list of numbers, into integers
while z:                  # Loop untill the list z is empty
    p,c=y[z[0]],y[z[1]]   # Assign p to the first char and c to the second
    y[z[0]],y[z[1]]=c,p   # Swap around using p and c
    del z[0],z[0]         # Remove the first 2 items in the list of integers
print(''.join(y))         # Print out the altered list as a string

1

सी, 70 बाइट्स

यह देखते हुए कि इनपुट स्ट्रिंग 100 की लंबाई पर है, मैंने पूर्णांक सरणी के अंत को इंगित करते हुए 'NULL' बाइट बनाने का फैसला किया, जो अस्पष्ट है 0xFF। संभवतः यह अतिरिक्त इनपुट के रूप में नहीं गिना जाता है, हालांकि (अधिकतम) 7 3 बाइट्स की लागत के लिए इसे 1-आधारित इंडेक्सिंग में बनाया जा सकता है और '\0'सरणी के अंत के रूप में उपयोग किया जा सकता है ।

f(s,i,t)char*s,*i;{for(;~*i;)t=s[*i],s[*i]=s[*++i],s[*i++]=t;puts(s);}

बहुत ज्यादा बस एक tmp चर के साथ नियमित रूप से स्वैपिंग करता है और उपयोग करता है कि अल्पविराम ऑपरेटर परिभाषित व्यवहार करने के लिए अनुक्रम बिंदुओं का परिचय देता है (xor स्वैप के कुछ अभिव्यक्तियों के विपरीत जिसमें कम वर्ण गणना होगी लेकिन अपरिभाषित व्यवहार के लिए नेतृत्व)।

संपादित करें: के रूप में अनुरोध किया आप इसे बाहर का परीक्षण कर सकते हैं: http://rextester.com/OVOQ23313


मुझे नहीं लगता कि आप मान सकते हैं कि आपको सूचकांकों की अदला-बदली करनी है। सूचकांक इनपुट स्ट्रिंग का हिस्सा हैं, और आपको पोस्ट किए गए (और गिने गए) कोड के हिस्से के रूप में उन्हें स्ट्रिंग से बाहर पार्स करने की आवश्यकता है। विवरण से: "इनपुट में पहले एक स्ट्रिंग, एक स्थान होगा, और फिर गैर-नकारात्मक संख्याओं की संख्या भी होगी जो सभी रिक्त स्थान से अलग होती हैं।"
रेटो कोराडी

1

डार्ट - 123

कमांड-लाइन पर इनपुट मान लेता है स्वचालित रूप से रिक्त स्थान पर विभाजित है। अन्यथा इसे x=x[0].split(' ');पाठ और सूचकांकों में स्ट्रिंग को विभाजित करने के लिए एक प्रारंभिक की आवश्यकता है ।

main(x,{c,i:1,a,t}){c=x[0].split("");n()=>a=int.parse(x[i++]);for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);print(c.join());}

अधिक व्हाट्सएप के साथ:

main(x,{c,i:1,a,t}){
  c=x[0].split("");
  n()=>a=int.parse(x[i++]);
  for(;i<x.length;t=c[n()],c[a]=c[n()],c[a]=t);
  print(c.join());
}

इसे dartpad.dartlang.org पर चलाएं / परीक्षण करें ।


क्या आप किसी ऑनलाइन कंपाइलर के बारे में जानते हैं जहाँ मैं यह परीक्षण कर सकता हूँ?
स्पिकट्रिक्स

डार्टपैड में लिंक जोड़ें।
'12:32

1

प्रतिबल - 71

s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s

Ungolfed:

s: take i: split input " " 
foreach [a b] i [swap at s do a at s do b]
print s

मैं इसका परीक्षण कैसे करूं? क्या इसके परीक्षण के लिए कोई ऑनलाइन संकलक है?
स्पिकैट्रिक्स

@CoolGuy - हाँ आप इसे try.rebol.nl पर देख सकते हैं । inputफ़ंक्शन वहां से STDIN को कॉल करने में सक्षम नहीं होगा। वर्कअराउंड सरल सेट inputहै जिसका आप परीक्षण करना चाहते हैं। यहां पहले परीक्षण का पूरा उदाहरण दिया गया है - input: "hello_World 1 7" s: take i: split input" "foreach[a b]i[swap at s do a at s do b]print s और Do in Rebol 3 NB पर क्लिक करें । Rebol 1-आधारित अनुक्रमण का उपयोग करता है।
ड्रेगेटन

@CoolGuy - वैकल्पिक रूप से आप REBOL 3 बाइनरी से डाउनलोड कर सकते हैं rebolsource.net
draegtun

0

सी, 143 बाइट्स

main(a,v,i)char** v;{i=2;char s[101],t;strcpy(s,v[1]);for(;i<a;i+=2){t=s[atoi(v[i])];s[atoi(v[i])]=s[atoi(v[i+1])];s[atoi(v[i+1])]=t;}puts(s);}

उपरोक्त कार्यक्रम कमांड-लाइन तर्कों से इनपुट लेता है, स्ट्रिंग को एक सरणी में कॉपी करता है, संबंधित वर्णों को स्वैप करता है और फिर, संशोधित स्ट्रिंग को आउटपुट करता है।

अघोषित कोड:

main(int a,char** v,int i){ //Arguments of main 
  i = 2;
  char s[101],t;

  strcpy(s,v[1]); //Copy string literal into an array

  for(;i<a;i+=2){
    t=s[atoi(v[i])];
    s[atoi(v[i])]=s[atoi(v[i+1])];
    s[atoi(v[i+1])]=t;  //Swap each character
  }

  puts(s); // Output the final string
}

क्या आप मान रहे हैं कि संख्याओं का केवल एक अंक है? यह देखते हुए कि इनपुट 100 वर्णों तक का हो सकता है, मुझे नहीं लगता कि यह मान्य होगा। 3 उदाहरण भी देखें, जिसमें 10सूचकांकों में से एक है।
रेटो कोराडी

@RetoKoradi, इस बात के लिए धन्यवाद। मैंने कोड तय किया।
स्पिकट्रिक्स

0

जावास्क्रिप्ट (ईएस 6), 95

एकल स्ट्रिंग इनपुट के साथ 95 बाइट्स (नीचे फ़ंक्शन च)

2 मापदंडों, स्ट्रिंग और संख्या सरणी (फ़ंक्शन जी नीचे) के साथ 75 बाइट्स

(एक्मास्क्रिप्ट 6, फ़ायरफ़ॉक्स केवल)

f=i=>
(
  n=i.split(' '),
  s=[...n.shift()],
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v),
  s.join('')
)

g=(s,n)=>
  n.map((v,i)=>i&1?[s[v],s[w]]=[s[w],s[v]]:w=v,s=[...s])
  &&s.join('')

// TEST
out=x=>O.innerHTML+=x+'\n'

;[['Hello_world! 0 6', 'wello_Horld!']
,['First 1 2 1 0 0 4','tFisr']
,['(Second!$$) 8 7 10 1','()econd$!$S']
,['~Third~ 0 0 6 6 0 6 6 0','~Third~']]
.forEach(t=>{
  u=f(t[0]),
  ok=u==t[1],
  out('Test '+(ok?'OK: ':'FAIL: ')+t[0]+'\n Result:' +u + '\n Check: '+t[1]+'\n')
})
<pre id=O></pre>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.