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.