StringgnirtSStringgnirtSStringgnirtS


42

İşte size basit bir meydan okuma.

Uzunluk dize Verilen N dize ileriye, daha sonra geriye, sonra ileriye, daha sonra geriye, çıkış ... vb N zamanlarda. Örneğin, girişiniz

Hello!

Çıkmanız gerekir:

Hello!!olleHHello!!olleHHello!!olleH

İsteğe bağlı olarak sondaki bir satır sonunu da çıkarabilirsiniz.

Gönderiniz tam bir program veya bir işlev olabilir ve herhangi bir makul formatta girdi ve çıktı alabilirsiniz . Örneğin, IO'yu STDIN / STDOUT'dan, işlev argümanlarından ve geri dönüş değerinden, bir dosyadan vb. Alabilir. Sen gerekir tek bir satırda çıkış yeni dize. Yani, örneğin, son örneğin çıktısı

Hello!
!olleH
Hello!
!olleH
Hello!
!olleH

Bu olurdu değil geçerli bir çözüm olabilir!

İşte birkaç test durumu daha:

Input:
a
Output:
a

Input:
abcd
Output:
abcddcbaabcddcba

Input:
OK!
Output:
OK!!KOOK!

Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

Input:
PPCG
Output:
PPCGGCPPPPCGGCPP

Input:
42
Output:
4224

Liderler

Bu bir mücadelesi olduğu için standart boşluklar yasaklandı ve bayt cinsinden en kısa cevap kazanıldı! Ancak , bu aynı zamanda herhangi bir dilde en kısa cevaba sahip olmak için bir yarışmadır. Bir Java cevabının perl veya bir golf dilinde bir cevabı geçmesi pek mümkün olmasa da, en kısa Java cevabını almak hala çok etkileyici. Yani, her ikisini de görmek için bu afişi kullanabilirsiniz

  1. Tüm dillerden en kısa cevap, ve

  2. Her dilde en kısa cevap.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

code-golf  string  code-golf  math  geometry  data-structures  repeated-transformation  code-golf  number  random  code-golf  math  rational-numbers  code-golf  ascii-art  animation  code-golf  ascii-art  number  code-golf  math  number  code-golf  data-structures  code-golf  string  parsing  code-golf  array-manipulation  random  permutations  code-golf  string  code-golf  parsing  code-golf  string  quine  code-golf  string  parsing  comment  code-golf  string  counting  natural-language  code-golf  string  decision-problem  code-golf  math  code-challenge  metagolf  test-battery  code-golf  string  code-golf  math  number  arithmetic  source-layout  code-golf  number  primes  decision-problem  code-golf  math  arithmetic  code-golf  date  code-golf  string  cryptography  code-golf  code-golf  chess  board-game  code-golf  geometry  grid  puzzle-solver  set-partitions  code-golf  number  natural-language  code-golf  ascii-art  code-golf  math  code-golf  string  ascii-art  kolmogorov-complexity  code-golf  string  natural-language  code-golf  game  board-game  tic-tac-toe  code-golf  ascii-art  hexagonal-grid  code-golf  string  comment  code-golf  internet  code-golf  sorting  code-golf  kolmogorov-complexity  unicode  code-golf  tips  code-golf  string  natural-language  code-golf  string  kolmogorov-complexity  source-layout  hello-world  code-golf  string  kolmogorov-complexity  counting  natural-language  code-golf  random  quine  code-golf  string  math  bitwise  code-golf  permutations  code-golf  string  code-golf  arithmetic 

Örnekte, olmaması gerektiğini olleHdeğil elloH?
Arnaud

2
@Downgoat Hayır, girdi ve çıktıyı belirtildiği şekilde aynı biçimde almalısınız.
DJMcMayhem

4
Başlık StringgnirtSStringgnirtSStringgnirtS olmamalı mı?
Luis Mendo

2
@ carusocomputing Olmaz: "Giriş dizesinin boş olmayacağını ve yalnızca yazdırılabilir ASCII içereceğini güvenli bir şekilde kabul edebilirsiniz."
Martin Ender

1
en.wikipedia.org/wiki/ASCII#Printable_characters Ah, bunun ASCII'nin iyi tanımlanmış bir alt kümesi olduğunu bilmiyordu. \ T, \ n, vb. Dahil yazdırılabilir hayal ettim ...
Magic Octopus Urn

Yanıtlar:


22

Vim, 39 , 34 tuş vuruşlarını

:se ri
Y:s/./<C-r>"/g
<C-o>qqgJC<C-r>"<esc>gJ@qq@q

@Lynn sayesinde 5 bayt kaydedildi!

İşte canlı olarak gerçekleşen bir gif: (Bu gif'in daha önce kaydettiğimden beri daha eski bir sürüm olduğuna dikkat edin).

görüntü tanımını buraya girin

Ve işte nasıl çalıştığının bir açıklaması:

:se ri                  "Turn 'reverse indent' on.
Y                       "Yank this line
:s/./<C-r>"/g           "Replace every character on this line with the register
                        "We just yanked followed by a newline
<C-o>                   "Jump to our previous location
     qq                 "Start recording in register 'q'
       gJ               "Join these two lines
         C              "Delete this line, and enter insert mode
          <C-r>"<esc>   "Paste the line we just deleted backwards 
gJ                      "Join these two lines
  @q                    "Call macro 'q'. This will run until we hit the bottom of the buffer.
    q                   "Stop recording.
     @q                 "Start our recursive macro

Bir yandan notta, Ygenellikle iğrenç bir özellik olan ekstra bir yeni satır alır. Bu muhtemelen ilk defa birkaç byte kaydettiği ilk zamandır!


2
Bunun yerine, üç bayt kaydetmek için :%s/\n<cr>yapabilirsiniz v{gJ.
Lynn,

2
Bir VIM cevabı ?! Bu sizin açınızdan şık bir hareket.
Magic Octopus Urn

@Lynn Tahmininiz için teşekkürler! Ben biraz farklı bir şey yaparak sona erdi ve bunun yerine 5 çıkardı.
DJMcMayhem

Bu @qbaşlangıçta boş olduğunu varsayıyor , değil mi? veya @qkaydı durdurmadan önce keyfi bir şeyler yapar. (Bu, benim karşılaştığım en sevdiğim vim trivium'uma götürüyor: herkes :q<CR>qqqqqZZ@qq@q
vim'i

@wchargin Evet, @qboş olması gerekiyor. Neden :wqabunun yerine sadece değil? Ayrıca vimde nasıl fraktal üretileceğini bilmek ister misiniz? qqqqq<C-w>v<C-w>n@qq@q: D
DJMcMayhem

18

Python, 40 bayt

f=lambda s,i=0:s[i:]and s+f(s[::-1],i+1)

Özyinelemeli bir işlev. sSayaç iuzunluğunu geçinceye kadar giriş dizesini ters fonksiyonuna bağımlı tutar s.


Vay. 56 baytlık bir python cevabı göndermek
üzereydim

@DJMcMayhem da lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]bir byte atar .
Jonathan Allan,

Bunu öğrendim f = lambda s : ''.join([s[((-1)**(i//len(s)) <= 0)*(len(s)-1)+(-1)**(i//len(s))*(i%len(s))] for i in range(len(s)*len(s))])ama buna göre 136 bayt sys.sizeof, ilginç bir şekilde aynı boyuttaf = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Carel 19

12

Brain-Flak , 418 378 228 bayt

Bu benim Brain-Flak şaheserim. İyi golf oynamamayabilir, ancak meydan okuma şimdiye kadar karşılaştığım en zor şeydi.

Çevrimiçi deneyin!

(([])[()]){({}[()]<(({}(<()>))<{({}[()]<(({}()<(({}<>))>)<({()<({}[()]<({}<({}<>)<>>)>)>}{}<>){({}[()]<({}<>)<>>)}{}>)>)}{}{}<>([]){{}({}<>)<>([])}{}<>>)>)}{}([(({}))]{({})({}[()])}{}){(({}[({}<>)<>])<<>({}<><{(({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}<>([]){{}({}<>)<>([])}{}<>>)}{}>)>)}

açıklama

Bu açıklama şimdi biraz modası geçmiş, ancak hala programı açıklamak için oldukça iyi bir iş yapıyor.

Bu açıklama benim düzenli açıklama sürecimden biraz farklı olacak. Sonucu sırayla açıklamak yerine bu sonuç hakkında nasıl geldiğimi açıklayacağım. İşte gidiyor:

Rulman

Sorun biraz çalıştıktan sonra bu kod ile geldi:

(n[()])({()<({}[()]<({}<({}<>)<>>)>)>}{}<>){({}[()]<({}<>)<>>)}{}<>

Bu kod (n'nin bazı sayıların değişmez olduğu örn. ()()), Öğeyi yığının en üstüne götürür ve n adımına indirir. İstif yüksekliği olarak n ile bu, "istifleme" istifini gerçekleştirir. yani, üst öğeyi yığının altına taşıyın. İşte nasıl çalışıyor:

Maddeyi yığındaki eksi bir noktaya taşımak istediğimiz yeri koyduk. Neden eksi bir? Bilmiyorum, sadece bu şekilde çalışıyor.

(n[()])

Daha sonra bu sayı ile a'nın sıfırı takip ederek sıfıra ulaşana kadar döngü yaparız ().

{()<({}[()]<...>)>)>}{}

Her döngü yaptığımızda üstteki öğeyi alırız ve altındaki öğeyi diğer yığına taşırız. Bu sayıyı yerine koyar.

({}<({}<>)<>>)

Şimdi tek yapmamız gereken, taşındığımız sayıları koymak. Kapalı yığına geçiyoruz ve yapılan döngüdeki çalışma sayısını zorluyoruz.

(...<>)

Yeni basılan sayıyı sıfıra gelinceye kadar azaltma döngüsüne gireriz. Her defasında bir numara geriye gideriz.

{({}[()]<({}<>)<>>)}{}<>

Ters

Sonra tam bir yığını tersine çevirmek için ruloyu değiştirdim:

(n){(({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}<>([]){{}({}<>)<>([])}{}<>>)}{}

Bir kez daha n, tersinin derinliğini temsil eder. Yığındaki en üstteki öğeler ters çevrilecektir. Nasıl çalışır:

Tersi sadece süslü bir rulo. Yığının üst kısmına n kez sarılırız, yuvarlanma derinliğini her seferinde bir kat azaltır.

(n){(({}[()])<ROLLER>)}{}

Çift

Yerinde çoğaltma zordur. Gerçekten zor. Yığının nasıl tersine çevrildiğini bulduktan sonra, çoğaltma algoritmasını bulmak için hala büyük çaba harcadım.

İşte burada:

(((n)<{({}[()]<(({}<>))<>>)}{}<>>)<{({}[()]<({}<>)<>([][()])({()<({}[()]<({}<({}<>)<>>)>)>}{}<>){({}[()]<({}<>)<>>)}{}<>>)}{}<>([]){{}({}<>)<>([])}{}<>([]){(({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}<>([]){{}({}<>)<>([])}{}<>>)}{}>)

Biraz büyük bir şey ama işte nasıl çalıştığı:

N tuşuna basarak başlayın. n, kopyanın derinliğidir. Ayrıca iki parantez açtık. Bunlar, n'nin değerini tekrar ihtiyaç duyulana kadar kapsamda saklamamızı sağlar.

(((n)<

Daha sonra, yığının en üst değerini kapalı yığına iki kez iterek her seferinde n kez döngü yaparız. Bu, yığındaki her sayı için ilk kopyaları yapar.

{({}[()]<(({}<>))<>>)}{}

Şimdi, her kağıtta iki adet kopya var. Bunları iki gruba ayırmamız gerekiyor.

Böylece offstack'a geçiyoruz ve başlangıçta kaydettiğimiz ns'lerden birini hatırlıyoruz.

<>>)

N kere dönüyoruz.

{({}[()]<...>)}{}

Her defasında bir kopyasını ana kareye taşırız.

({}<>)<>

Ve bir kopyasını yığının dibine rulo. (Bu, kopyanın temizlememesini sağlamakla üst tabakanın boş olduğunu varsayar)

([][()])ROLLER

Bu yapıldıktan sonra, orijinali "orijinal" i ve alt tabakadaki bir kopyasını iki gruba ayırdık (kopya aslında tam tersidir). Bu yüzden sadece kopyasını ana yığına taşıyoruz ve bununla yapılabilir.

([]){{}({}<>)<>([])}{}<>

İskelet programı

Şimdi programın tüm parçalarını yaptım, sadece onları bir çerçeveye yerleştirmek zorundayım.

Çerçeve, metni, yığının yükseklik zamanlarından bir kat daha az ikiye katlar.

(([])[()])
{
 ({}[()]<
  DUPLICATE 
 >)
>)}{}

Ve sonra, ilk yığın yüksekliğinin artışını n ^ 2-n'den 0'a düşürerek yığını tersine çevirir.

(({}))
{
 (({}[()])<
  ({}<>)<>(({}))({<({}[()])><>({})<>}{})<>{}<>
  ({}<({}<>)<>>)<>({}<>)
  ({}<
   REVERSE
  >)
 >)
}{}{}

5
İnanılmaz. Her zaman aklımı bu dilin yapabileceği şekilde patlatıyorsun! : D
DJMcMayhem

10

Jöle , 4 3 bayt

,Ṛṁ

Çevrimiçi deneyin! veya Tüm test durumlarını doğrulayın.

@ Maltysen sayesinde bir bayt kaydedildi .

açıklama

,Ṛṁ  Input: string S
 Ṛ    Reverse S
,     Join S with reverse of S. Makes a list [S, rev(S)]
  ṁ   Mold [S, rev(S)] to len(S) by repeating elements cyclically
      Return and print implicitly as a string

1
Kalıp ihtiyacı yokturL
Maltysen

Teşekkürler vay @Maltysen, kaynak kodundan ya da deneyim elde biliyor muydunuz
mil

yaşadıklarımdan yola çıkarak, Jelly bilmiyorum, ama biraz tür J dan reshape hatırlattı neyi kalıp en Jelly gerçekten aşırı yüklenmeleri yapmaz çünkü aynı zamanda, olmayan bir dizi yapmak kalıp olacağını tahmin
Maltysen

küf aslında sadece yinelemeler alır, ancak ilk aralıktaki tamsayıları atar.
Dennis,

1
Evet, küfe yeniden şekillendirme gibi davrandım, bu yüzden alışkanlıkla bir numara verdim. Jelly'te çok sayıda küçük davranır var, tıpkı bir dizi dizinin birleştirilmiş bir dizi olarak otomatik olarak nasıl çıktığı gibi
mil

9

PHP, 54 52 bayt

(49 bayt, ancak string '0' içeriyorsa çalışmaz)

for(;($a=$argv[1])[$i++];)echo$i%2?$a:strrev($a);

(52 bayt)

<?=str_pad('',strlen($a=$argv[1])**2,$a.strrev($a));

(54 bayt)

for(;$i++<strlen($a=$argv[1]);)echo$i%2?$a:strrev($a);

Tamamen unuttum str_pad. güzel!
Titus

8

2sable , 3 bayt

Kod:

gGÂ

Açıklama:

g   # Get the length of the input
 G  # Do the following n - 1 times:
  Â # Bifurcate, which duplicates a and reverses the duplicate

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


6

Ruby, 39 bayt

->(s){s.reverse!.gsub(/./){s.reverse!}}

Ruby'de yatarım. Golf yardımı takdir edilmektedir.

Ruby bunun için gerçekten çok hoş bir dil. .reverse!

açıklama

Bunun gibi basit bir şey olacağını umuyordum:

s.gsub(/./){s.reverse!}

ancak kazan / meydan kısıtlaması nedeniyle daha uzun.

Ne s.reverse!çok yararlıdır. s.reverse!temelde s = s.reverse!, aynı zamanda mutasyona da uğrar s.


Programın her bir bölümünün yaptığı aşağıda açıklanmıştır:

->(s){             # Lambda with argument s
      s.reverse!   # Reverse `s` see above for details
      .gsub(/./)   # Replace every character with...
      {s.reverse!} # the input reversed!

Bununla ilgili önemli s.reverse!olan şey , her değerlendirildiği zaman dizginin çevrilmiş olduğu. Dize değiştirir gibi. sdeğiştirildi!


İle -pbayrak size 4 bayt kaydedebilirsiniz:$_.reverse!;gsub(/./){$_.reverse!}
Ürdün

Would't @Jordan Bir ihtiyaç .chompüzerine olsa $_? şu anda
newline'ı

Sondaki yeni satırı olmayan bir satırın ruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txtnerede file.txtolduğu gibi bir şey yapmazsanız : V Her neyse, bunu yapmamaya karar verirseniz, lambda üzerinde parenlere ihtiyacınız olmaz, böylece ->sçalışır
Value Ink

@ValueInk, eğer boru eklerseniz dosya olmadan yeni satırsız giriş sağlayabilirsiniz. Yoksa acaba değil Enter tuşuna basın, elle yazabilirsiniz: i.stack.imgur.com/6luxM.png
manatwork

1
Lamda'nın tartışmasının etrafında parantez kullanmanıza gerek yok. Ayrıca, ünlem işaretlerinden birini tıraş edebileceğinizi düşünüyorum:s.gsub(/./){s.reverse!.reverse}
m-chrzan

6

Perl, 24 bayt

İçin +2 içerir -lp

STDIN'e giriş verin:

rev.pl <<< Hello!

rev.pl:

#!/usr/bin/perl -lp
s%.%s/.?/chop/eg;$`%eg

Şaşırtıcı bir şekilde, bu yerleşik reverseoperatörü kullanmaz . Bu isim sadece soooo uzunluğunda, aklıma gelen tüm çözümler reverseen az 1 bayt daha uzun.


Yerleşik olandan daha az bayt alan bir çözüm bulmak için yükseltildi
MilkyWay90

6

J, 13 8 bayt

Mil sayesinde 5 bayt kurtarıldı!

#;@$];|.

Bu, aşağıdaki fiilleri içeren 5 trendir:

# ;@$ ] ; |.

İç çatal ](kimlik), ;(bağlantı) ve |.(geri) oluşur. Gözlemek:

   (| ; |.) 'Hello!'
+------+------+
|Hello!|!olleH|
+------+------+

Dış iki fiil trenin geri kalanını yapar. #bu durumda, argümanın boyutu, yani uzunluktur. Bu bağlama fiildir ;@$, ya ravelüzerinde reshape. Gözlemek:

   # 'Hello!'
6
   6 $ (] ; |.) 'Hello!'
+------+------+------+------+------+------+
|Hello!|!olleH|Hello!|!olleH|Hello!|!olleH|
+------+------+------+------+------+------+
   ; 6 $ (] ; |.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   6 ;@$ (] ; |.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   (# ;@$ (] ; |.)) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   (# ;@$ ] ; |.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   (#;@$];|.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH

Eski çözüm

[:,|.^:(i.@#)

Yeterince basit. |.tersidir ve ^:defalarca sol fiilini (sağ el) tekrarlayan güç birleşimidir. Doğru argüman bir fiil olduğunda, bu fiil argümana çağrılır. Bu durumda doğru fiil sıfır ( i.) ile uzunluk ( #) arasındadır. Bir diziye yükseltildiğinde, ara sonuçlar tutulur. Yapılması gereken tek şey diziyi düzleştirmek ,.

Orta sonuç

   (i.@#) 'Hello!'
0 1 2 3 4 5
   |.^:0 1 2 3 4 5 'Hello!'
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
   |.^:(i.@#) 'Hello!'
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
   ([:,|.^:(i.@#)) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH

Uzunluğu boks ederek bir bayttan tasarruf edebilirsiniz<@#
miller

Bir düzgün 8 bayt çözüm #;@$];|., bu kutular, ilk ve ters kutulu dizeleri yeniden şekillendirir ve onları bir arada Razes
mil

@miles whoa, çok güzel.
Conor O'Brien,

5

JavaScript (ES 6), 5950 bayt

Hedi ve Huntro sayesinde 9 bayt.

f=(s,n=1)=>s[n]?s+f([...s].reverse().join``,n+1):s

özyinelemeli işlev.

İpin ters çevrilmesi boyutun neredeyse yarısını alır ( 25 22 byte!) ...
Neden bunun doğal bir yolu yok?


1
s[n]?...Yerine kullanabilirsinizn<s.length?...
Hedi

1
Ayrıca [...s]yerine 3 bayt kaydedebilirsinizs.split``
Huntro

yea 36 byte idealf=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
caub

f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)aralık için daha iyi bir fonksiyon ile çok daha iyi olurdu özyinelemeli olan
cub

@caub: SyntaxError: Unexpected token )JS'nin yerel dize reversiyonu yok. SyntaxError: Invalid or unexpected tokenikinci öneri için. Hangi tarayıcıda çalışıyor?
Titus,

4

Minkolang , 17 bayt:

$oId$z$Dz[rz[O]].

Burada dene!

açıklama

$o                   Read in whole input as characters
  Id                 Push the length of stack and duplicate
    $z               Pop top of stack and store in register (z)
      $D             Pop top of stack (n) and duplicate whole stack n-1 times
        z[     ]     z times, do the following:
          r          Reverse the stack
           z[O]      z times, pop the top of stack and output as character
                .    Stop.

4

8088 Meclisi, IBM PC DOS, 29 28 bayt

Toplanmış, xxddökümü:

00000000: d1ee ac48 938a cbfc 518a cbf7 da78 01fd  ...H....Q....x..
00000010: acac b40e cd10 e2f9 59e2 ecc3            ........Y...

Demonte listeleme:

D1 EE       SHR  SI, 1          ; point SI to DOS PSP (080H) 
AC          LODSB               ; load input string length into AL 
48          DEC  AX             ; remove leading space from length counter 
93          XCHG BX, AX         ; save input length to BL 
8A FB       MOV  BH, BL         ; string output counter in BH 
        S_LOOP: 
FC          CLD                 ; set direction forward 
8A CB       MOV  CL, BL         ; reset char counter in CL 
F7 DA       NEG  DX             ; flip DX to toggle fwd/back output 
78 01       JS   C_START        ; if positive, go forward 
FD          STD                 ; otherwise go backwards 
        C_START: 
AC          LODSB               ; adjust SI to first/last char
        C_LOOP: 
AC          LODSB               ; load next char into AL
B4 0E       MOV  AH, 0EH        ; PC BIOS tty output function
CD 10       INT  10H            ; write char to console
E2 F9       LOOP C_LOOP         ; continue looping through chars
FE CF       DEC  BH             ; decrement string count loop
75 EC       JNZ  S_LOOP         ; if not zero, continue loop
C3          RET                 ; exit to DOS

Bağımsız PC DOS çalıştırılabilir program. Komut satırı üzerinden giriş dizesi, çıktı konsoldur.

görüntü tanımını buraya girin


3

Pip , 11 10 bayt

L#aORVRV:a

Çevrimiçi deneyin!

Açıklama:

            a is first cmdline argument (implicit)
L#a         Loop len(a) times:
      RV:a   Reverse a and assign back to a
   ORV       Output the reverse of a (since it needs to go forward first then backward)

3

Haskell, 40 36 32 Bayt

m s=take(length s^2)$cycle$s++reverse s

Örnek:

*Main> m "Hello!"
"Hello!!olleHHello!!olleHHello!!olleH"

Daha da kısa (Damien'a verilen kredi):

q s=zip(s>>[s,reverse s])s>>=fst

s >> [s, s] s] çevrimleri ["abc", "cba", ...] doğru büyüklükte sıkıştırılır ve fst ile eşleştirilir


2
q s=zip(s>>[s,reverse s])s>>=fst
Damien,

3
Veya aynı boyutta Pointfree olanı:(>>=fst).(iterate reverse>>=zip)
Damien

3

Perl 6 ,  31  30 bayt

{[~] (|($_,.flip)xx*)[^.chars]}

.ordsSıralıların listesini döndüren, yanlış kullanarak bir bayttan tasarruf edin, ardından bir aralık oluşturmak için bunu bir sayıya çevirin.

{[~] (|($_,.flip)xx*)[^.ords]}

Açıklama:

# bare block lambda with implicit parameter 「$_」
{
  # reduce using string concatenation operator 「~」
  [~]

  (
    # create a Slip
    |(
      # of the input, and its string reverse
      $_, .flip

    # list repeated infinitely
    ) xx *

  # get the values in the range from 0 up-to and excluding
  # the number of characters 「0 ..^ +$_.ords」
  )[ ^.ords ]
}

Kullanımı:

my &code = {[~] (|($_,.flip)xx*)[^.ords]}

say code 'a'; # a
say code 'abcd'; # abcddcbaabcddcba
say code 'OK!'; # OK!!KOOK!
say code 4815162342; # 4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

3

Vim + coreutils, 32 tuş vuruşunu

Asla çok fazla Vim cevabına sahip olamazsın.

qqYv:!rev
Pjq@=len(@")
@q2dkv{gJ

açıklama

qq               " Start recording macro
Y                " Yank (copy) line
v:!rev<CR>       " Reverse line with coreutils rev command
Pj               " Paste yanked line above this line
q                " Stop recording
@=len(@")<CR>@q  " Playback macro once for each character
2dk              " Delete last 3 lines
v{gJ             " Join lines

1
Coreutils ile mi? Bu hile yapmaktır! : P
Christian Rondeau

3

MATL, 13 12 8 bayt

Tüm elemanları iter, sonunda birleştirir.

td"tP]&h

td"  ]     %For loop over string length - 1 due to diff
   tP      %Push copy of string, reverse
      &h   %Concatenate entire stack horizontally

Çevrimiçi deneyin!


Eski versiyonlar:

Aşağıdakilere dayanarak tamamen farklı bir yaklaşım fprintf:

t"t1$0#YDP]x

t"        ]   % For loop over string
  t           % Duplicate string for printing:
   1$0#YD     % `fprintf` with 1 input, 0 output (i.e., to screen).
         P    % Reverse
           x  % Empty stack to prevent implicit output

Bir şablon dizesini tersine çevirmeyi temel alan sürüm

ttd"wPtbYc]Dx

t                 %Duplicate input, to create 'accumulator' string 
                  % (alongside the input string which will serve as 'template'
 td               %Duplicate input, diff to get an stringof size input-1
   "       ]      %For loop over size n-1 string (consumes diff'd string)
     wP           %Get 'template' string on top of stack, and reverse
       tb         %Duplicate template string, and switch with 'accumulator' string
         Yc       %Concatenate template string with accumulator. 
            Dx   %Display top element, delete template string to prevent implicit disp

Akıllıca kullanımını seviyorum td!
DJMcMayhem

@DJMcMayhem Teşekkürler! tnq:"İlk önce bariz tn:"olanı oldum , ama bir kod kokusu biraz ( bu Matlab golf ipucuna bakın ) bu yüzden tnq:daha da kompakt olabileceğini düşündüm .
Sanchises

3

Scala, 73 72 71 bayt

def f(s:String)=for(i<-1 to s.length){print(if(i%2>0)s else s.reverse)}

Bu benim ilk kod girme denemem, bu yüzden sayısız gelişme olduğuna eminim.

Güncelleme:

Parantezleri kaldırarak 1 byte uzakta golf oynadı.

Öneri için Yıkılabilir Karpuz sayesinde, bir bayt traş.


Ben scala bilmiyorum ama değiştirebilir i%2==1için i%2>0?
Yıkılabilir Limon

@ Yıkılabilir Karpuz Bunu düşünmemiştim, evet yapabilirim
Kendisi12794

3

Cubix , 52 bayt

Ap\:\;.#u/\:qqsoq(?;u.q..$u<../pB@u:\.....\(?q..s..p

Bir küpte:

      A p \
      : \ ;
      . # u
/ \ : q q s o q ( ? ; u
. q . . $ u < . . / p B
@ u : \ . . . . . \ ( ?
      q . .
      s . .
      p . .

Bu eğlenceliydi; Bundan kurtulacak baytlar var ama bu kesinlikle işe yarayacak.

Çevrimiçi deneyin!

açıklama:

Girişi ABC

  • /A: kuzeye git ve tüm girişleri karakter olarak oku; -1altta olacak
  • p\;.: -1yığından kaldır
  • u# : string uzunluğunu (yığındaki öğe sayısı) itin
  • \:\:qq : Dize uzunluğunu iki kez kopyalayın, iki kopyayı yığının altına itin
  • loop:

    • soq(?/<u : yığının üstünü değiştir, yığının üstünü ASCII olarak çıkar, üst kısmı (harf) aşağıya doğru it, üst üste yığ, önce yapılmadığında sağa dön, sonra IP'yi doğru yere taşı.
    • Döngünün sonunda, yığın gibi görünecek C B A 3 3 0
  • ;u : yığının pop C B A 3 3

  • B : ters yığın 3 3 A B C
  • p( : aşağıdan yukarıya doğru hareket ettirin ve azaltın 3 A B C 2
  • ?Eğer üst sıfırsa, dümdüz gidin @ve sonlandırın
  • Başka
    • psq:uq : aşağıdan yukarıya doğru hareket ettirin, yukarı doğru kaydırın ve yukarıdan aşağıya doğru hareket ettirin ve yukarıdan aşağıya hareket edin 3 2 A B C 3
    • $u : atla u
    • < bizi tekrar döngüye sokuyor.

yorumlayıcı


İşte 24 bayt olanı. Aynı genel mantık az da olsa sıkıştırılmış.
MickyT

@MickyT 28 byte golf için kredi almak konusunda kendimi kötü hissediyorum. Kendin gönder!
Giuseppe

3

C (gcc) , 88 87 85 83 68 66 83 82 78 bayt

-1 ceilingcat sayesinde

Eski versiyon

p,q;f(char*s){p=q=1;for(char*m=s--;*m;s[p+=q]*p?:(m++,p+=q=-q))putchar(s[p]);}

Çevrimiçi deneyin!

Daha kısa versiyon (biraz bozuk)

Sadece yorumlarda ASCII tarafından 76 bayt yaklaşımı ve benim çimdik tweak gelen -1 bayt riff .

Düzenleme: Bu sürüm, her dizenin bir NULL bayttan önce geldiğini ve bunun her zaman doğru olmadığını varsaymasından dolayı biraz bozulmuştur. (Bağlantıdaki son test durumuna bakın). Şimdilik 83 byte sürümüne geri dönülüyor.

f(char*s){for(char*n=s-1,k=1;*s++;k=-k)for(;*(n+=k);)putchar(*n);}

Çevrimiçi deneyin!



@ ASCII-sadece 68, bazı ince ayarlarla mümkündür.
gastropner

: P o 67 şimdi lol @gastropner var
ASCII sadece

@ ASCII-sadece 66 :-P
gastropner

Sadece ASCII @ Ne yazık ki, kısa versiyon bazı durumlarda işe yaramaz.
gastropner

2

Java, 127 111 88 bayt

(s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?new StringBuffer(s).reverse():s;return r;};

Ungolfed test programı

    public static void main(String[] args) {
    BiFunction<String, String, String> func = (s, r) -> {
        for (int i = 0; i++ < s.length();) {
            r += i % 2 < 1 ? new StringBuffer(s).reverse() : s;
        }
        return r;
    };
    System.out.println(func.apply("Hello!", ""));
}

Bu biraz daha golf oynayabilir: (s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};( 88 byte ). Ayrıca, ben bu Java 8 olduğunu belirtirim.
Kevin Cruijssen 15:16

Na, Java'nın en son sürümünü kullandığını varsaymak sorun değil.
Shaun Wild

@KevinCruijssen Java 7 artık desteklenmiyor (büyük $$$ hariç). Java sürümünü belirtmemeliyiz. Ayrıca, Java 7 olarak yazarsanız, cevapların çoğu Java 1.1 veya 1.2 ile yazılabilir. Peki çalıştığı en düşük versiyonu yazmamalı mıydın? Bu cevaptaki kod Java 7 uyumlu olsaydı, Java 1.2 uyumlu olurdu ve ... hala Java 8'de
çalışırdı

2

R, 53 bayt

Her karakter için girişin boşluk veya yeni satır ile ayrıldığını varsayalım.

cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")

Bazı test durumları:

> cat(rep(c(i<-scan(,""),rev(i)),len=length(i)^2),sep="")
1: h e l l o !
7: 
Read 6 items
hello!!ollehhello!!ollehhello!!olleh

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: a
2: 
Read 1 item
a

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: a b c d
5: 
Read 4 items
abcddcbaabcddcba

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: O K !
4: 
Read 3 items
OK!!KOOK!

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: 4 8 1 5 1 6 2 3 4 2
11: 
Read 10 items
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: P P C G
5:    
Read 4 items
PPCGGCPPPPCGGCPP

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: 4 2
3: 
Read 2 items
4224

2

PowerShell v2 +, 57 bayt

param($a)-join(1..($x=$a.length)|%{($a[$x..0],$a)[$_%2]})

Dize uzunluklarını almak veya tersine çevirmek için gerçek bir temiz yol yok, bu yüzden bu oldukça uzun.

Girdiyi alır $a, iladan döngüler ( daha sonra kullanılmak 1üzere $a.lengthsaklanır $x). Her yinelemede , giriş numaramızın tek / çift olmasına bağlı olarak ya $ada $a[$x..0]( veya tersine çevrilmiş) dizisine endekslemek için bir sahte-üçlü kullanırız [$_%2]. Bunların hepsi parenler içinde kapsüllenir ve -jointek bir dize oluşturmak üzere bir araya getirilir . Bu boru hattında bırakılmış ve çıktı kapalı.

PS C:\Tools\Scripts\golfing> .\stringgnirts.ps1 'TimmyD'
TimmyDDymmiTTimmyDDymmiTTimmyDDymmiT

2

Java, 151 bayt

public static void r(String s){String t = new StringBuffer(s).reverse().toString();for(int i=0;i<s.length();i++){System.out.print(((i%2==1)?t:s));}}

}

Ungolfed:

public static void r(String s) {
    String t = new StringBuffer(s).reverse().toString();
    for(int i = 0; i < s.length();i++) {
        System.out.print(((i % 2 == 1) ? t : s));
    }
}


1
Merhaba, PPCG'ye hoş geldiniz! Öncelikle, Java'da golf oynamaya ilişkin ipuçlarını okumanızı tavsiye ederim . Kodunuza gelince, hala golf oynayabilecek birkaç şey var: public staticYönteminizden önce çıkarabilirsiniz . Aradaki boşlukları kaldırabilirsiniz t=new StringBuffer. Gereksiz parantez ve parantezleri kaldırabilirsiniz. Ve gelen modül çek takas olabilir ==1için <1(eşdeğerdir hangi ==0negatif olmayan sayılar için). Ayrıca, i++for-döngüsünün son kullanımına taşıyabilirsiniz .
Kevin Cruijssen

6
Toplamda şöyle olur: void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}( 105 bayt )
Kevin Cruijssen

2

C #, 94 bayt

using System.Linq;string R(string n)=>string.Concat(n.SelectMany((c,i)=>1>i%2?n:n.Reverse()));

LINQ içe aktarma için yöntem + 76 bayt için 76 bayt.

Nasıl çalışır:

using System.Linq; // Required for LINQ extension methods.

string R(string n) => 
    string.Concat( // Concatenate the following chars into a single string
        n.SelectMany( // Enumerate each char in n, flattening the returned IEnumerable<char>'s into a single IEnumerable<char>
            /*IEnumerable<char> Lambda*/(/*char*/ c, /*int*/ i) => // i = index in n
                1 > i % 2 // Check if i is even or odd
                    ? n // if i is even, add n to the concat
                    : n.Reverse() // else reverse n and concat that
        )
    )
;

2

CJam , 10 bayt

l_,({_W%}*

Çevrimiçi deneyin!

açıklama

l            e# Read line
 _           e# Duplicate
  ,(         e# Length minus 1
    {   }*   e# Run code block that many times
     _       e# Duplicate
      W%     e# Reverse
             e# Implicitly display

2

Octave, 39 35 bayt

@(x)[x'+~x;flip(x'+~x),''](1:end/2)

f('Hello!')
ans = Hello!!olleHHello!!olleHHello!!olleH

Açıklama:

@(x)            % Take x as input, inside apostrophes 'Hello!'
x'+~x           % Create a mesh of the ASCII-code of the input letters
                % For input `bcd` this will be:
                %    98    98    98
                %    99    99    99
                %   100   100   100
;flip(x'+~x)   % Concatenate vertically to create:
                %    98    98    98
                %    99    99    99
                %   100   100   100
                %   100   100   100
                %    99    99    99
                %    98    98    98
___,'']         % Short cut to convert ASCII-code to characters
(1:end/2)       % Display the first half of this array of letters, as a
                % horizontal string

Luis sayesinde 4 byte kurtarıldı. ~xyerine 0*xkaydedilmiş bir byte x tüm unsurları olmayan sıfırdır. Çünkü (işleri flipyerine flipudbaşka bir iki bayt kaydedildi (ı bilmediğim flip) mevcuttu.


2

bash + util-linux, 68 58 53 bayt

y=$1;for((i;i<${#1};i++)){ echo -n $y;y=`rev<<<$y`;}

açıklama

forDöngü ile iki şey :

  • Yazma bir görünüşe belgesiz yolu yoktur forbiri değiştirir döngüler dove doneküme parantezleri ile anahtar kelimeleri {ve }. İlk bağlantı sonrası boşluk gerekli ve sonunda noktalı virgül de gereklidir.
  • Görünüşe göre, "C tarzı" fordöngülerde i;kullanmak yerine sadece başlayabilirsiniz i=0;.
  • Koşulun bir ${#1}kısmı i < ${#1}girdilerimizin uzunluğunu belirtir (ilk parametre $1). Genel olarak, ${#foo}dizenin boyutunu almak için kullanabilirsiniz $foo.

Bunlara ek olarak:

  • rev dizeyi tersine çeviren util-linux aracıdır.
  • Yeni hatlardan kurtulmak için -nbayrağı echogeçmeliyiz.
  • İfade rev<<<$y, değişkeni standart girişine geçiren here-string ( bu ilgili tldp.org sayfasına bakınız ) $yolarak adlandırılır rev.

Lütfen bazı bilgilerinizi açıklayınız. Ayrıca belki de yankıdan önceki alan çıkarılabilir olabilir, ben bash konusunda bilgili değilim
Rohan Jhunjhunwala

@RohanJhunjhunwala Bazı şeyleri açıklığa kavuşturmaya yardımcı olmak için cevaba küçük bir açıklama eklendi. Ayrıca: ihmal zaman dove donebir anahtar kelimeleri fordöngü, aslında yok uzayda olduğu gerekiyor!
çerçeveler

+1 şimdi iyi görünüyor. Sadece yorum yaptım çünkü kodunuz otomatik düşük kaliteli bir bayrak çizdi. Yalnızca kod yanıtları otomatik olarak işaretlenir
Rohan Jhunjhunwala

y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}... bir kaç bayt kurtardı
roblogic

2

Japt , 11 bayt

ê1 pUÊ ¯Uʲ
ê1          // Append the reverse of the input to the input,
   pUÊ      // then repeat it input length times
       ¯Uʲ // and finally trim to length input length squared.

Çevrimiçi deneyin!



@Shaggy Kullanmayı denedim, ama benim hayatım boyunca, onu bulamıyorum. : P Örnek için çok teşekkürler!
Nit

Üzgünüz, yanlış bağlantı gönderildi, aslında 6 bayt .
Shaggy


1
@Shaggy Umursamıyorum ve Nit'in cevabından yeterince farklı. Onun için git adamım.
Oliver,

2

05AB1E , 7 bayt

vDR}v}J

Çevrimiçi deneyin!

Üzerinde çalışmaya devam edecek. Bunun "v}" bölümünden pek hoşlanmıyorum, muhtemelen orada bir bayt kurtarabilir.

açıklama

vDR}v}J

v         ; Iterates through each character
 D        ; Duplicate top of stack
  R       ; Push top of stack reversed
   }      ; end for loop
   v}     ; same as other v, effectively pops top of stack off
     J    ; Join everything together

1
vÂ}\J 5 bayt , kodunuzla aynıdır, ancak aradığınız yerleşiklerle. :)ÂBifurcate (Çoğalt & Geriye doğru kısa, bu tam olarak ne yaptığınız). \ yığındaki en üstteki öğeyi siler.
Kevin Cruijssen
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.