Bir dizedeki karakterleri karıştırma


10

stdin/ Komut satırı bağımsız değişkenleri / işlev bağımsız değişkenleri aracılığıyla girdi alan , bir karakter dizisindeki karakterleri karıştıran ve son karakter dizisini stdout.

Giriş önce bir dize (boş veya değil null), bir boşluk ve daha sonra boşluklarla ayrılmış çift sayı olmayan negatif sayılar içerir. Girdi işlev bağımsız değişkenleri aracılığıyla alınırsa, dize bağımsız değişkenlerden biri olurken boşlukla ayrılmış tamsayılar diğeri olur. Dizenin karakterlerini ardışık sayı çiftlerine karşılık gelen dizinlerde değiştirmelisiniz.

Örneğin:

Hello_world! 0 6

sonuç vermeli

wello_Horld!

Varsayımlar

  • 0 tabanlı ve 1 tabanlı dizinleme arasında seçim yapabilir ve verilen dizinlerin her zaman aralıkta olacağını varsayabilirsiniz.
  • Dize 100 karakterden uzun olmayacak ve sadece aralığında ASCII karakterlerini içerecektir !için ~(karakter kodları 0x7E için 0x21 dahil). Referans için ASCII tablosuna bakınız .
  • Bir çiftteki iki indeks aynı olabilir (bu durumda, bu adımda hiçbir şey değiştirilmez).

puanlama

Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.

Test Durumları

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
Gelecekteki zorluklar için, geri bildirim alabileceğiniz ve ana mesajınızı göndermeden önce meydan okumanızı sağlayabileceğiniz korumalı alanı öneriyorum (bu, birisi zorluğunuzda düzeltilmesi gereken ciddi bir kusur bulursa mevcut cevapları geçersiz kılma riskini en aza indirir).
Martin Ender

Neden stdin'de girdi gerekiyor, örneğin komut satırı argümanları olarak değil?
lrn

@lrn, Doğru. 2 seçenek daha eklendi.
Spikatrix

Aşağıda, uyguladıkları işleve aktarılan bir dizi olarak dizinlerin listesini alabileceğini varsayan bir dizi çözüm görüyorum. Tanımınızı okuduğumda, girdi, indeksleri ve üzerinde çalıştıkları dizeyi içeren tek bir dizedir ve giriş dizesinden indeksleri çıkarmak, kodlanması gereken kodun bir parçasıdır. Hangi yorumun doğru olduğunu açıklayabilir misiniz?
Reto Koradi

@RetoKoradi, Hayır. Giriş tam bir dize değil. Bir dize ve sonra sayılar vardır. Sayılar dizeye dahil değildir.
Spikatrix

Yanıtlar:


6

CJam, 11 bayt

rr{irie\r}h

Nasıl çalışır

Bu, girişte kalan sayı çiftleri olana kadar sadece bir do-while döngüsü çalıştırdığım biraz farklı bir yaklaşımdır.

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

Buradan çevrimiçi deneyin


6

Python 3, 89 86 bayt

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

Her şeyi paketinden çıkarın. (@Potato sayesinde 3 bayt kaydedildi)


Birkaç bayt kaydedin ve bunu yapın: [*s],*L=input().split()daha sonra satırı uzaklaştırabilirsiniz. Çözümü btw gerçekten seviyorum, çok golf olmasına rağmen neredeyse zarif.
patates

@potato Oh vay be, böyle birlikte açabileceğiniz iki şey olduğunu bilmiyordum (bunu sadece 3.5'te yapabileceğinizi düşündüm). Teşekkürler!
Sp3000

4

CJam, 13 bayt

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

Burada test edin.

açıklama

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.

Vay. Bu kadar hızlı bir cevap beklemiyorduk!
Spikatrix

2

C (137 b)

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]);}}

Açıklama geliyor ...

Argümanlar

T = char * türünde bir sözcük .

V = çift sayıda tam sayı elemanından oluşan bir dizi.

L = V uzunluğu

Çıktı

karışık dize

O nasıl çalışır ? :

V dizisinin sayılarını tersine çevirir ve tüm noktasını gerçek noktaya kadar izledikten sonra dizenin n. öğesini koyar. Misal

girdi = T = "İlk", V = {1,2,1,0,0,4}

Tersine çevrilmiş V = {4,0,0,1,2,1}

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 ..

Burada deneyin


1
@ Agawa001, Bunu çok daha fazla golf yapabilirsiniz. Dönüş türü intgerekli değildir (beklenmedik davranışlarla sonuçlanabilir) ve intparametreler olan intdeğişkenler, döngüde bildirmek yerine, değişkenler döngü dışında bir yerde bildirilebilir putchar, printfvb yerine kullanılabilir
Spikatrix

2

Python 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))

Bazı değişkenleri değiştirerek ve ;Tim'in yorumundaki gibi kullanarak daha fazla golf oynadım .

Ben sadece bu kadar değil, golf görünümlü çıkması bekleniyor.


1
Bunu çok golf edebilirsiniz. Değişim whileTo while c<len(t):line1;line2;line3.... c=c+2giderc+=2
Tim

@Tim Yardımınız için teşekkürler!
ASCIIThenANSI

C 0'dan başlamamalı mı?
Tim

@Tim Nope. caslında ttakas etmemiz gereken pozisyonları almak için indeksleme (girdi). Ama t[0]dize olduğu için takas etmemiz t[1]ve t[2]ilk takas çiftini tutmamız gerekiyor .
ASCIIThenANSI

Ahh anlıyorum, evet. Üzgünüm, benim çözüm girdi ayrıldı, bu yüzden aynı yapmış
Tim

2

Cı, 109 107 102 bayt

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);}

Not: sve aküresel diziler olarak bildirilmesi gerekir. stakas etmek istediğiniz dizedir ve tüm sayı değerlerini içeren abir dizidir int.

Yukarıdaki kod çalışmazsa, void f(){...}yerine şunu kullanmayı deneyin :f(){...}

Kod çözülmemiş kod:

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
}

Burada test edin


hmm ur kodu daha küçük :)
Abr001am

lol değişken bildirimi nerede? ur kodunu sıkmanın ucuz bir yolu: p
Abr001am

@ Agawa001, baytların her test senaryosuna göre değişeceği için değişken bildirimi dahil etmedim.
Spikatrix

Bu, sorunda tanımlandığı şekilde girişle eşleşmiyor. Giriş tek bir dizedir. Sorunu tamamen yanlış anlamadığım sürece, dizin değerlerini giriş dizesinden ayıklamanız gerekir.
Reto Koradi

1

Python 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))

Açıklama:

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

C, 70 bayt

Giriş dizesinin en fazla 100 olduğu göz önüne alındığında, tamsayı dizisinin sonunun açık olduğunu belirten 'NULL' baytını yapmaya karar verdim 0xFF. Muhtemelen bu ekstra girdi olarak sayılmaz, ancak (en fazla) 7 3 baytlık bir maliyet için 1 tabanlı dizine ekleme yapılabilir ve '\0'dizinin sonu olarak kullanılabilir .

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

Hemen hemen bir tmp değişkeni ile düzenli olarak takas yapar ve virgül operatörünün tanımlanmış davranışa sahip olmak için sıra noktaları getirdiğini kullanır (daha düşük karakter sayısına sahip ancak tanımlanmamış davranışa yol açacak xor takaslarının bazı belirtilerinden farklı olarak).

Düzenleme: İstendiği gibi test edebilirsiniz: http://rextester.com/OVOQ23313 .


Ben takas endeksleri ile bir dizi olduğunu varsayabiliriz sanmıyorum. Dizinler giriş dizesinin bir parçasıdır ve bunları yayınlanan (ve sayılan) kodun bir parçası olarak dizeden ayrıştırmanız gerekir. Açıklamasından: "Girdi önce bir dize, bir boşluk ve daha sonra boşluklarla ayrılmış negatif olmayan sayılardan oluşur."
Reto Koradi

1

Dart - 123

Komut satırındaki girdinin otomatik olarak boşluklara bölüneceğini varsayar. Aksi takdirde x=x[0].split(' ');, dizeyi metne ve dizinlere bölmek için bir baş harfi gerekir.

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());}

Daha fazla boşluk ile:

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());
}

Bunu dartpad.dartlang.org üzerinde çalıştırın / test edin .


Bunu test edebileceğim herhangi bir çevrimiçi derleyici biliyor musunuz?
Spikatrix

DartPad'e bağlantı ekle.
lrn

1

Asi - 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

Bunu nasıl test ederim? Bunu test etmek için herhangi bir çevrimiçi derleyici var mı?
Spikatrix

@CoolGuy - Evet try.rebol.nl adresinden test edebilirsiniz . Fonksiyon STDIN'i oradan arayamazinput . Çözüm basitçe inputsınamak istediğiniz değer olacak şekilde ayarlamaktır . İşte ilk testin tam örneği - 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 ve Rebol 3 NB'de Do'ya tıklayın . Rebol 1 tabanlı indeksleme kullanır.
draegtun

@CoolGuy - Alternatif olarak rebolsource.net adresinden Rebol 3 ikili dosyalarını indirebilirsiniz
draegtun

0

C, 143 bayt

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);}

Yukarıdaki program, komut satırı bağımsız değişkenlerinden girdi alır, dizeyi bir diziye kopyalar, karşılık gelen karakterleri değiştirir ve sonra değiştirilen dizeyi çıkarır.

Kod çözülmemiş kod:

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
}

Sayıların yalnızca bir rakamı olduğunu mu düşünüyorsunuz? Girişin 100 karaktere kadar olabileceği düşünüldüğünde, bunun geçerli olacağını düşünmüyorum. Ayrıca 10endekslerden biri olan 3. örneğe bakın .
Reto Koradi

@RetoKoradi, Bunu tespit ettiğiniz için teşekkürler. Kodu düzelttim.
Spikatrix

0

JavaScript (ES6), 95

Tek bir dize girişi olan 95 bayt (aşağıdaki f işlevi)

2 parametre, dize ve sayı dizisi ile 75 bayt (aşağıdaki g işlevi)

(EcmaScript 6, yalnızca Firefox)

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.