Dizedeki karakterleri kaydırma


12

Bu meydan okumada, girilen bir dizedeki karakterleri n kez kaydırmanız ve kaydırılan dizeyi çıkarmanız gerekir

Giriş

Giriş önce bir dize içerecektir. Bir sonraki satırda, bir tamsayı nbulunacaktır.

Çıktı

  • Eğer npozitif, sağa dizede karakterleri vardiya nsüreleri.
  • Eğer nnegatiftir, sola dizede karakterleri vardiya nsüreleri.
  • Eğer nsıfırdır, dizede karakterleri kaymaması.

Vites değiştirdikten sonra ( nsıfır hariç ), değiştirilen dizgiyi yazdırın.

notlar

  • Dize boş olmayacak veya null.
  • Dize 100 karakterden uzun olmayacak ve yalnızca (boşluk) ila ~(yaklaşık işareti) aralığında ASCII karakterleri içerecektir (0x20 ila 0x7E karakter kodları dahil). Referans için ASCII tablosuna bakınız .
  • Vardiya döngüseldir.
  • Sayı npozitif, negatif veya sıfır olabilir.
  • n her zaman -1000'den büyük veya ona eşit ve 1000'den küçük veya ona eşit
  • stdinKomut satırı bağımsız değişkenleri aracılığıyla veya komut satırı girdileriyle girdi alabilirsiniz
  • Değiştirilen dize stdout(veya en yakın eşdeğeri) içinde çıktılanmalıdır
  • Tam bir program veya girdi alan ve dizeyi stdouten yakın eşdeğeri çıkaran bir işlev yazabilirsiniz

Test Durumları

1)

Hello world!
5             -->orld!Hello w

2)

Testing...
-3            -->ting...Tes

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

puanlama

Bu , bu yüzden en kısa gönderme (bayt cinsinden) kazanır.

Yanıtlar:


5

Pyth, 4 bayt

.>zQ

Bu, otomatik değerlendirme giriş operatörü olarak Pyth hariç, CJam 5 bayt sürümüme neredeyse benziyor Q.

.>              # Cyclic right shift of 
  z             # Input first line as string
   Q            # Rest of the input as evaluated integer

Buradan çevrimiçi deneyin


Tam olarak aynı çözümü bu :-)
— Spikatrix

@CoolGuy Oldukça basit. Gerçi, bunu kum havuzunda görmedim ..
— Optimizer

Artık bir sebepten dolayı işe yaramıyor gibi görünüyor. İşte çalışan bir alternatif, ayrıca 4 bayt.
— hakr14

3

Javascript ( ES5 ), 55 52 bayt

p=prompt;with(p())p(slice(b=-p()%length)+slice(0,b))

Yorumlananlar:

p = prompt; // store a copy of prompt function for reuse
with(p()) // extend scope chain with first input
    p( // print result
        slice(b = -p() % length) // take second input negated and modulo length
        +                        // and slice string by result
        slice(0, b) // concatenate with opposite slice
    )

2

CJam, 5 bayt

llim>

Bu oldukça basit.

l               e# Read the first line
 li             e# Read the second line and convert to integer
   m>           e# Shift rotate the first string by second integer places

Buradan çevrimiçi deneyin


1
Bu, yerleşik işlevlerin altına girer mi?
— LegionMammal978

LegionMammal978 @ O olduğu bir fonksiyonu inşa. Ancak OP, yerleşik kullanıcıların kullanımını kısıtlamaz
— Optimizer

1
Yerleşik işlevler standart boşluklardır .
— LegionMammal978

4
@ LegionMammal978 yaklaşık 50-50 yukarı / aşağı oyu olan bir cevabı işaret ediyorsunuz. Bu bir topluluk kararı değil.
— Doktor

2

C, 93 bayt

main(a,v,n)char**v;{a=v[2]-v[1]-1;n=atoi(v[2]);a=a*(n>0)-n%a;printf("%s%.*s",v[1]+a,a,v[1]);}

Daha açık olan, komut satırı bağımsız değişkeni sürümünü yapmak için değiştirilen işlev bağımsız değişkeni sürümü

f(s,n,c)char*s;{c=strlen(s);c=c*(n>0)-n%c;printf("%s%.*s",s+c,c,s);}

Bu sadece 68 bayttır, bu sadece komut satırı argümanlarıyla uğraşırken C'nin dezavantajlı olduğunu gösterir.

Eğer shift,, npozitifse strlen(s)-n%strlen(s)ofset ve nnegatif ise ofset olur -n%strlen(s). printfOfset gelen baskılar, cdizenin sonuna, ardından finale cbaştan karakterleri.

Örnekler:

$ ./rotstr "Merhaba dünya!" 5
Merhaba! Merhaba w
$ ./rotstr "Test ediliyor ..." -3
ting ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Merhaba dünya!" -16
Ey dünya!

Benim için beklendiği gibi çalışmıyor. Olduğu zaman v[2], "1"kod herhangi bir değişiklik yapmadan dizeyi çıkarır. Ve sadece "~~~"ve "12345"çalışır. Geri kalanı yanlış çıktılar veriyor. Eğer hepsi bir kez daha dönseydi, düzeltilmiş olurdu.
— Spikatrix

Linux üzerinde hem gcc hem de (hafif bir değişiklikle main(a,v,n)-> n;main(a,v)) clang ile test ettim ve beklendiği gibi çalışıyor. Gcc için 5.1.0 sürümünü kullanıyorum ve derliyorum gcc -o rotstr rotstr.c. Hangi derleyiciyi kullanıyorsunuz?
— CL-

nKüresel olmayı da denedim . Aynı sorun. Kullanarak derledim gcc file.c -o file. Windows'ta GCC 4.8.1 kullanıyorum. Kodunuzda tanımlanmamış bir davranış var mı?
— Spikatrix

Yerine v[2]-v[1]-1ile strlen(v[1])döndüğünü ince bir şey düşünebilirsiniz tek yerdir fark, yapabilir. Ne yazık ki test etmek için bir windows makinesine erişimim yok.
— CL-

Evet. Bunu değiştirdiğimde kod çalıştı.
— Spikatrix

2

Python 3, 45 bayt

s=input();n=int(input());print(s[-n:]+s[:-n])

Programın özü

s[-n:]+s[:-n]

Geri kalan her şey sadece I / O ile beceriksiz çalışmaktır.


2
Bu son ABA 17test durumu için başarısız olur ve genel olarak|n| > length of string
— Sp3000

kullanırsanız n=int(input())%len(s);, dize uzunluğundan daha büyük tamsayılar için çalışır, ancak 7 karakter daha gerektirir
— JPMC

2

K, 8 7 bayt

{|x!|y}

!Listeler için bu işlemin genelleştirilmesini gerçekleştiren ilkel bir "döndür" ( ) zaten var . K dizeleri karakter listeleridir, dolayısıyla geçerlidir. Spec, CJam ve Pyth'i biraz destekliyor, çünkü K'nin dönüşü arzulananın ters yönüne gidiyor. !Bir fonksiyona sarmak ve örtük argümanı reddetmek xistediğimizi yapacak:

  f:{(-x)!y}
{(-x)!y}
  f[5;"Hello world!"]
"orld!Hello w"
  f[-3;"Testing..."]
"ting...Tes"
  f[17;"ABA"]
"BAA"

Kirbyfan64sos tarafından önerilen biraz daha kısa bir yaklaşım, |döndürmeden önce ve sonra dizeyi ( ) tersine çevirmek için parantezleri ve olumsuzlamaları ortadan kaldırmaktır .

Bu empedans uyumsuzluğu olmasaydı, çözüm basit olurdu

!

Aynı denir:

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"

1
Dizgiyi ters çevirmek |, döndürmek ve ters çevirmek aynı sonucu verir mi? Öyleyse, bir karakteri kesebilirsiniz.
— kirbyfan64sos

İyi bir nokta! Bu işe yarar.
— JohnE

1

Pip, 10 bayt

Bu muhtemelen daha da geliştirilebilir. Yine de, vardiya operatörü olmayan bir dil için, 10 bayt kötü değil.

a@_M-b+,#a

Açıklama:

            a, b are command-line args (implicit)
       ,#a  range(len(a))
    -b+     range(-b, len(a)-b)
a@_M        map(lambda x: a[x], range(-b, len(a)-b))
            Concatenate the list and print (implicit)

Pip dize ve liste indeksleme döngüsel olduğu için çalışır: "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 karakter

^(-\d+) (.*)/\1 \2\t
+^(-\d+) (.)(.*?)\t(.*)$/\1 \3\t\2\4
^(-\d+) \t/\1 
^(-?)(\d+)/\1 (_)^^(\2)
+_(_*) (.*)(.)$/\1 \3\2
^- /- \t
+^- (.*?)\t(.*?)(.)$/- \1\3\t\2
^-? +/
\t/

Canlı demo .

Giriş numarası negatifse, bunların çoğu dizeyi tersine çevirir. Sadece bazı ASCII karakterlerinin geçerli girdi olmasından yararlandım ve sekmeyi avantajım için kullandım.

Biraz hile yapmak gerektiğini unutmayın: rs tek satırlık bir metin değiştirici olduğundan, <number> <text>giriş biçimi olarak kullanmak zorundayım .


1

Java, 167

enum S{;public static void main(String[]r){int n=-Integer.parseInt(r[1]),l=r[0].length();while(n<0)n+=l;n%=l;System.out.print(r[0].substring(n)+r[0].substring(0,n));}}

Girişi komut satırından alır.

yeterince komik, aslında ben yanlışlıkla dize kaydırılması gerekiyordu yanlışlıkla tersine olmuştu. Ancak bu hatayı düzeltmek, n'yi -1 ile çarpmak ve daha sonra mantığı düzgün yazmak için daha kısaydı.

genişletilmiş:

enum Shift{
    ;
    public static void main(String[]args){
        int n=-Integer.parseInt(args[1]),length=args[0].length();
        while(n<0)n+=length;
        n%=length;
        System.out.print(args[0].substring(n)+args[0].substring(0,n));
    }
}

Neden var enum S{; ... }?
— Spikatrix

1
Tam program yazmayı seçtim çünkü 9 bayt gerçekten büyük bir fark yaratmayacaktı. Ayrıca, enum S {; ...} S {...} sınıfına tercih ettiğimde bir hatırlatmadır çünkü (bu örnekte aynı sayıda bayt alsalar bile) bir örneğe ihtiyacım olursa sınıfın enum sürümü ile bir bayt daha alır: enum S {X; ...}. Statik anahtar sözcüğü kullanmak zorunda kalmadan veya sınıfın yeni bir nesnesini açıkça somutlaştırmadan sınıfta bir yöntem veya değişken bildirmek istersem bu yardımcı olur.
— Jack Ammo

Vaov! Güzel. enumBunun böyle kullanılabileceğini hiç bilmiyordum !
— Spikatrix

Bunu yayınladığınızdan bu yana iki yıla yakın olduğunu biliyorum, ancak birkaç şey golf oynayabilirsiniz. Integer.parseIntolabilir new Integer(-5 bayt); ve n%=l;değiştirmek durumunda kaldırılabilir r[0].substring(n)+için r[0].substring(n%=l)+(-2 bayt). Ayrıca, bunun Java 6 olduğunu belirtmek isteyebilirsiniz, çünkü Java 7 veya daha üstü sürümlerde main-method içeren bir enum artık mümkün değildir.
— Kevin Cruijssen

düzenleme rahatsız etmek için çok tembel, ancak tasarruf için kesinlikle kaydetti.
— Jack Ammo



1

Casio Basic, 27 bayt

StrRotate s,s,-n:Print s

Görünüşe göre, bunun için Casio ClassPad'de yerleşik bir var! Ama tersine çalışır, dolayısıyla -n.

Kod için 24 bayt, s,nbağımsız değişken olarak belirtilecek 3 bayt .


1

05AB1E , 6 bayt

DgI+FÁ

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

D         # Duplicate the text input
 g        # Take it's length
          #  i.e. "Testing..." → 10
  I       # Take the integer input
   +      # Add them together
          #  i.e. 10 and -3 → 7
    F     # Loop that many times
     Á    #  And rotate once towards the right during every iteration

05AB1E, Döndürme için yalnızca bir kez sağa / sola doğru oluşturduğundan ve miktarı sağa / sola doğru döndürmediğinden, Nmiktarları döngülerim length + inputve bunu birçok kez sağa doğru döndürürüm.

Örneğin:

  • "Test ediliyor ..." ve -3, 10 + -3 = 7süreleri sağa doğru döndürerek sonuçlanır ting...Tes.
  • "Merhaba dünya" ve 5 11 + 5 = 16kez sağa doğru dönerek sonuçlanır worldHello.



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.