Boustrophedonise


35

İlgili ama çok farklı.

Bir boustrophedon yazılı diğer her satırı ters harflerle, çevrilmiş veya tersine bir metindir.

Bu mücadelede, diğer bütün satırları tersine çeviririz, ancak gerçek karakterleri bozulmadan bırakırız. Her biri olduğu sürece hangi çizgilerin tersine çevrileceğini seçebilirsiniz.

Metni, her biri sıfır veya daha fazla karakter içeren, yazdırılabilir ASCII sıfıra veya daha fazla satırını desteklediğiniz sürece herhangi bir uygun biçimde alabilirsiniz.

Örnekler:

["Here are some lines","of text for you","to make a","boustrophedon"]:

["Here are some lines","uoy rof txet fo","to make a","nodehportsuob"] or ["senil emos era ereH","of text for you","a ekam ot","boustrophedon"]


["My boustrophedon"]:

["My boustrophedon"] or ["nodehportsuob yM"]

[]:  
[]

["Some text","","More text","","","Last bit of text"]:

["Some text","","More text","","","txet fo tib tsaL"] or ["txet emoS","","txet eroM","","","Last bit of text"]

Dönüş ve girişin metinle ayrılmış satırlar olması gerekip gerekmediğini anlayamıyorum veya bir dosya veya satır listesi olabilir.
sergiol,


Kodum tutarsız davranabilir mi, yani bazen ilk satırdan ve bazen ikinci satırdan geri dönmeye başlayabilir mi?
Outgolfer Erik,

2
@EriktheOutgolfer Evet, bunu daha önce sormuştum ve "Diğerleri olduğu sürece hangi satırları tersine çevirmeyi seçebileceğinizi belirleyebilirsiniz." Aslında bu davranış için yeterince genel kılmak için şimdi olduğu gibi değiştirildi.
Martin Ender

1
@totallyhuman Evet, OP'ye göre.
20’de

Yanıtlar:


20

APL (Dyalog Klasik) , 4 bayt

⊢∘⌽\

Giriş, karakter vektörlerinin bir vektörüdür.

bir vektörü ters çeviren bir işlevdir ( monadik olarak uygulandığında).

" dex " - doğru argümanını döndüren bir işlev. (Oluşan zaman bir fonksiyonu olan) fo kadar monadik olarak ikinci zorlar A ⊢∘f Beşdeğerdir A ⊢ (f B)ve bu nedenle f B.

\olan tarama operatörü. g\A B C ...vektörüdür dyadically uygulanır (infix gösterim gibi). İkame için kendisine kolaylaştırır:A (A g B) (A g (B g C)) ...g⊢∘⌽g

A (A ⊢∘⌽ B) (A ⊢∘⌽ (B ⊢∘⌽ C)) ...
A (⌽B) (⌽⌽C) ....
A (⌽B) C ....

Eşit pozisyonlardaki ters çevirmeler (veya sayma şekline bağlı olarak tek) iptal eder.

Çevrimiçi deneyin!


4
Bu tam anlamıyla ]&|.&.>/\J okuyabilenler için.
FrownyFrog

2
Bu gerçekten zekice.
Outgolfer Erik

13

Haskell , 26 bayt

zipWith($)l
l=id:reverse:l

Çevrimiçi deneyin! Kullanım örneği: zipWith($)l ["abc","def","ghi"]verim ["abc","fed","ghi"].

Açıklama:

lidvarlık işlevi ve işlev arasında değişen sonsuz bir işlev listesidir reverse.

Ana fonksiyon fermuarlar lve fonksiyon listesini içeren giriş listesi $, yani ["abc", "def", "ghi"]aldığımız bir giriş için [id$"abc", reverse$"def", id$"ghi"].


11

Kabuğu , 4 bayt

z*İ_

Dizelerin bir listesini alır ve döndürür (tercüman dolaylı olarak sonucu yazdırmadan önce yeni satırlara ekler). İlk dize tersine çevrilir. Çevrimiçi deneyin!

açıklama

z*İ_  Implicit input.
  İ_  The infinite list [-1,1,-1,1,-1,1..
z     Zip with input
 *    using multiplication.

Husk'ta, bir dize ile sayıyı çarpmak onu tekrar eder, sayı negatifse de tersine çevirir.


6

JavaScript (ES6), Firefox, 43 bayt

Bu sürüm, Firefox'un sıralama algoritmasını kötüye kullanır . Chrome'da çöp oluşturur ve Kenarlarda dizeleri hiç değiştirmez.

a=>a.map((s,i)=>[...s].sort(_=>i&1).join``)

Test durumları

Veya çevrimiçi deneyin! (Örümcek maymunu)


JavaScript (ES6), 45 bayt

a=>a.map(s=>(a^=1)?s:[...s].reverse().join``)

Test durumları


6

APL (Dyalog Unicode) , 10 bayt

⌽¨@{2|⍳≢⍵}

Her iki şekilde de çalışır:

Çevrimiçi deneyin! ile⎕IO←1

Çevrimiçi deneyin! ile⎕IO←0

Nasıl çalışır:

⌽¨@{2|⍳≢⍵}  tacit prefix fn
   {   ≢⍵}  Length of the input
           generate indexes from 1 (or 0 with IO0)
    2|      mod 2; this generates a boolean vector of 0s (falsy) and 1s (truthy)
  @         apply to the truthy indexes...
⌽¨          reverse each element

6

Perl 5, 17 + 2 (-pl) = 19 bayt

tek çizgiler ters

$_=reverse if$.%2

hatta satır ters

$_=reverse if$|--

@ Martin 'in yorumundan sonra: girişin takip eden bir satır akışına ihtiyacı var.

çevrimiçi dene




3

K (oK) , 17 14 bayt

Çözüm:

@[;&2!!#x;|]x:

Çevrimiçi deneyin!

Örnek:

@[;&2!!#x;|]x:("this is";"my example";"of the";"solution")
("this is"
"elpmaxe ym"
"of the"
"noitulos")

Açıklama:

reverseGiriş listesinin tek indekslerinde uygulayın :

@[;&2!!#x;|]x: / the solution
            x: / store input as variable x
@[;      ; ]   / apply @[variable;indices;function] (projection)
          |    / reverse
       #x      / count (length) of x, e.g. 4
      !        / til, !4 => 0 1 2 3
    2!         / mod 2, 0 1 2 3 => 0 1 0 1       
   &           / where true, 0 1 0 1 => 1 3

Notlar:

  • değiştirdiler &(#x)#0 1için &2!!#x3 bayt kaydetmek için



3

Alümin , 66 bayt

hdqqkiddzhceyhhhhhdaeuzepkrlhcwdqkkrhzpkzerlhcwqopshhhhhdaosyhapzw

Çevrimiçi deneyin!

FLAG: h
hq
  CONSUME A LINE
  qk
  iddzhceyhhhhhdaeuze
  pk
  rlhcw
  REVERSE STACK CONDITIONALLY
  dqkkrhzpkzerlhcwqops

  OUTPUT A NEWLINE
  hhhhhdao
syhapzw

2
@totallyhuman Bu aslında benim dilim.
Conor O'Brien,


2

R , 85 bayt

for(i in seq(l<-strsplit(readLines(),"")))cat("if"(i%%2,`(`,rev)(l[[i]]),"\n",sep="")

Çevrimiçi deneyin!

Stdin'den giriş ve stdout'a çıkış.

Her satır bir satır beslemesi / satır başı / CRLF ile sonlandırılmalıdır ve buna karşılık gelen yeni satır ile yazdırılır. Bu nedenle, girdilerin sonunda satır besleme olması gerekir.


2

Jöle , 5 4 bayt

U¹ƭ€

Çevrimiçi deneyin!

-1 bayt için teşekkürler HyperNeutrino ! (aslında ƭdokümantasyon eksikliğinden dolayı nasıl çalıştığını asla bilmediğim için bu sefer şanslıydım)


(7 bayt) ¦ile denendi m. s2U2¦€;/ayrıca 7 bayttır.
user202729

2

T-SQL, 65 bayt

Standart giriş kurallarımız SQL'in önceden var olan bir tablodan değerleri girmesine izin verir ve SQL doğal olarak sıralanmamış olduğundan, orijinal metin sırasını korumak için tabloda satır numaralarına sahip olmalıdır.

Tabloyu bir kimlik sütunu ile tanımladım, böylece sadece metin satırlarını sırayla ekleyebiliriz (bayt toplamı için sayılmaz):

CREATE TABLE t 
    (i int identity(1,1)
    ,a varchar(999))

Bu nedenle, sıralı satırları seçmek ve geri almak için:

SELECT CASE WHEN i%2=0THEN a
ELSE reverse(a)END
FROM t
ORDER BY i

Ben hariç tutarak 11 bayt kurtarabilir Not ORDER BY ive olmasıdır olasılıkla (kesinlikle 4 satırlı örneğin yapar) makul uzunluğu için orijinal sırayla listesini döndürmek için. Ancak SQL yalnızca eklerseniz garanti eder ORDER BY, yani 10.000 satır olsaydı, kesinlikle buna ihtiyacımız olurdu.




1

Aslında , 7 bayt

;r'R*♀ƒ

Açıklama:

;r'R*♀ƒ
;r       range(len(input))
  'R*    repeat "R" n times for n in range
     ♀ƒ  call each string as Actually code with the corresponding input element as input (reverse each input string a number of times equal to its index)

Çevrimiçi deneyin!


1

Alice , 13 bayt

M%/RM\
d&\tO/

Çevrimiçi deneyin!

Ayrı komut satırı argümanları ile giriş. İlk satırı ters çevirir (ve ondan sonraki tüm satırları).

açıklama

       At the beginning of each loop iteration there will always be zero
       on top of the stack (potentially as a string, but it will be
       converted to an integer implicitly once we need it).
M      Push the number of remaining command-line arguments, M.
%      Take the zero on top of the stack modulo M. This just gives zero as
       long as there are arguments left, otherwise this terminates the
       program due to the division by zero.
/      Switch to Ordinal mode.
t      Tail. Implicitly converts the zero to a string and splits off the
       last character. The purpose of this is to put an empty string below
       the zero, which increases the stack depth by one.
M      Retrieve the next command-line argument and push it as a string.
/      Switch back to Cardinal mode.
d      Push the stack depth, D.
&\R    Switch back to Ordinal mode and reverse the current line D times.
O      Print the (possibly reversed) line with a trailing linefeed.
\      Switch back to Cardinal mode.
       The instruction pointer loops around and the program starts over
       from the beginning.

1

Standart ML (MLton) , 51 bayt

fun$(a::b::r)=a::implode(rev(explode b)):: $r| $e=e

Çevrimiçi deneyin! Kullanım örneği: $ ["abc","def","ghi"]verim ["abc","fed","ghi"].

Açıklama:

$bir dize listesi üzerinde yinelenen bir işlevdir. İki dizgiyi alır ave blisteden birinciyi değiştirmez ve dizgiyi bir karakter explodelistesine ( rev) dönüştürerek ikinciyi tersine çevirir, listeyi ( ) tersine çevirir ve dizgeye ( implode) geri döndürür .


+1, yeteri kadar ML çözümü yok
jfh

1

Retina , 18 bayt

{O$^`\G.

*2G`
2A`

Çevrimiçi deneyin! Açıklama: İlk aşama ilk satırı tersine çevirir, ardından ikinci aşama ilk iki satırı yazdırır, ardından üçüncü aşama bunları siler. Ardından, tüm program kalan hiçbir şey kalmayana kadar tekrar eder. Sondaki bir satırsonu, liderlik ücreti karşılığında kaldırılabilir ;.


1

Wolfram Dili (Mathematica) , 33 bayt

Fold[StringReverse@*Append,{},#]&

Çevrimiçi deneyin!

Nasıl çalışır

StringReverse@*Append, bir dize listesi ve girdi olarak başka bir dize verildiğinde, dize listenin sonuna ekler ve ardından tüm dizeleri tersine çevirir.

FoldYukarıdakilere göre girdiyi vermek şu anlama gelir:

  • İlk satırı ters çevirin.
  • İkinci satırı sonuna kadar ekleyin ve her ikisini de tersten izleyin.
  • Üçüncü satırı sonuna kadar ekleyin ve üçünü de ters çevirin.
  • Dördüncü satırı sonuna kadar ekleyin ve dördünü de tersine çevirin.
  • Ve böylece, çizgiler bitene kadar.

Her satır önceki satırdan bir kez daha az ters çevrilir, böylece satırlar yön değiştirir.


1

CJam , 11 bayt

{2/Waf.%:~}

Çevrimiçi deneyin! (CJam dizi değişmezleri, öğeleri ayırmak için boşluk kullanır)

Açıklama:

{              Begin block, stack: ["Here are some lines" "of text for you" "to make a" "boustrophedon"]
 2/            Group by 2:         [["Here are some lines" "of text for you"] ["to make a" "boustrophedon"]]
   W           Push -1:            [["Here are some lines" "of text for you"] ["to make a" "boustrophedon"]] -1
    a          Wrap in array:      [["Here are some lines" "of text for you"] ["to make a" "boustrophedon"]] [-1]
     f.%       Vectorized zipped array reverse (black magic):
                                   [["senil emos era ereH" "of text for you"] ["a ekam ot" "boustrophedon"]]
        :~     Flatten:            ["senil emos era ereH" "of text for you" "a ekam ot" "boustrophedon"]
          }

İçin açıklama Waf.%"kara büyü" parçası:

  • Wönceden başlatılmış bir değişkendir -1. abu nedenle, bir dizideki bir öğe sarar Waolup [-1].
  • %bir sayı nve bir dizi çıkar ve dizinin aher bir nelemanını alır . Zaman nnegatiftir, aynı zamanda, yani tersine çevirir W%bir dizi tersine çevirir.
  • .Bir ikili işlem ardından, yani, bir dizi karşılıklı elemanlarını o işlemi uygulanır [1 2 3] [4 5 6] .+olan [5 7 9]. Bir dizi diğerinden daha uzunsa, elemanlar herhangi bir değişiklik yapmadan tutulur, yani Wa.%bir dizinin ilk elemanını tersine çevirir.
  • fardından ikili bir işlem yığından bir eleman alacak ve daha sonra {<that element> <that operation>}%dizideki her elemandan geçecek, elemanını itecek, önce yığından gelen elemanı itecek, işlemi çalıştıracak ve sonuçları toplayacak gibi davranacak bir diziye geri dönün. Bu Wa.f%, dizideki her öğenin ilk öğesini tersine çeviren anlamına gelir .


1

Swift , 90 85 82 72 bayt

@ Mr.Xcoder sayesinde -10 bayt

func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+‌​[$1]})}

printDönüş tipi bildirimini kullanabilir ve bırakabilirsiniz:func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+[$1]})}
Bay Xcoder

1

Ruby , 19 + 2 = 21 bayt

-nlBayraklar için +2 bayt .

$.%2<1&&$_.reverse!

Çevrimiçi deneyin!

açıklama

Pratik olarak Perl 5 cevabıyla aynı , ancak bunu yazarken bunu görmemiştim.

Boşluk ile kod şöyle görünür:

$. % 2 < 1 && $_.reverse!

Bu -pseçenek, Ruby'nin komut dosyanızı aşağıdaki gibi bir döngüde etkin şekilde sarmasını sağlar:

while gets
  # ...
  puts $_
end

Özel değişken $_tarafından okunan son satırı içeriyor getsve $.hat numarası içerir.

-lOtomatik olarak çağırır işlem sona otomatik hat, sağlar chop!kaldırır her giriş hattı üzerinde, \nbunu tersine önce.


1

GNU sed , 31 + 1 = 32 bayt

-rBayrak için +1 bayt .

G
:
s/(.)(.*\n)/\2\1/
t
s/.//
N

Çevrimiçi deneyin!

açıklama

G                   # Append a newline and contents of the (empty) hold space
:
  s/(.)(.*\n)/\2\1/   # Move the first character to after the newline
  t                   # If we made the above substitution, branch to :
s/.//               # Delete the first character (now the newline)
N                   # Append a newline and the next line of input

1

Kömür , 9 bayt

EN⎇﹪ι²⮌SS

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Not: Kömür listenin uzunluğunu bilmiyor, bu yüzden fazladan bir öğe olarak ekledim. Açıklama:

 N          First value as a number
E           Map over implicit range
    ι       Current index
     ²      Literal 2
   ﹪        Modulo
  ⎇         Ternary
       S    Next string value
      ⮌     Reverse
        S   Next string value
            Implicitly print array, one element per line.

1

Befunge-93, 48 bayt

 <~,#_|#*-+92:+1:
#^_@  >:#,_"#"40g!*40p91+,~:1+

Çevrimiçi Deneyin

İlk satırı tersten yazdırır. Sonunda yeni bir hattı var.

Temel olarak, girdi alırken yazdırma arasında geçiş yaparak ve girişi yığında depolayarak çalışır. Yeni bir satıra veya girişin sonuna geldiğinde, yığını yazdırır, yeni bir satır yazdırır ve modu değiştirmek için 0,4'deki karakteri ya # # ya da no-op olacak şekilde değiştirir. Girişin sonu ise, programı sonlandır

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.