Pembalik reversibel

19

Tugas Anda sederhana. Program membaca dalam satu baris teks dari input standar, dan mencetak teks yang sama dalam bentuk karakter-terbalik. Tidak diperbolehkan mencetak apa pun.

Sebagai contoh:

input: "Hello!", output: "! olleH"

Tangkapannya adalah , program Anda harus dapat melakukan hal yang sama persis jika kode sumber itu sendiri karakter-terbalik!

Penilaian: penilaian standar kode-golf berlaku, dengan modifikasi berikut untuk membatasi membosankan

//margorp
program//

jawaban gaya: solusi apa pun yang merupakan palindrom akan dikenakan penalti + 25% untuk skor, dibulatkan ke atas. Hukuman ini masih berlaku, jika Anda, misalnya, memasukkan karakter ke dalam program yang tidak memiliki efek yang berguna, hanya untuk memecahkan palindrom.

vsz
sumber
2
"Efek yang berguna" mungkin tidak dapat ditentukan secara objektif. Misalnya di GolfScript, bagaimana dengan -1%#%1-/1atau -1%#%(0?
Peter Taylor

Jawaban:

14

APL, 5

⌽⍞⍝⍞⊖

Ini membalikkan ( , sepanjang sumbu terakhir) input ( ), dan diikuti oleh komentar ( menandai komentar garis). Terbalik, program membalikkan ( , sepanjang sumbu pertama) input, dan diikuti oleh komentar. Karena input selalu akan menjadi satu dimensi, dalam hal ini dan secara fungsional setara. Ini mungkin bahkan lebih licik daripada solusi GolfScript, jadi inilah solusi yang lebih bersih (tidak ada komentar), yang mendapat skor 9 .

⍬,⌽,⍞,⊖,⍬

Ini pertama-tama mengambil vektor kosong ( ), meratakannya (monadik ,), dan membaliknya ( , di sepanjang sumbu pertama). Ini masih menyisakan vektor kosong. Kemudian ia menyambungkan (diad ,) ke input ( ), membiarkan input tersebut tidak tersentuh. Ini kemudian meratakan (monadik ,) input yang sudah rata dan membalikkannya ( , di sepanjang sumbu terakhir). Kemudian ia menggabungkan (diad ,) vektor kosong lainnya ( ) ke input yang dibalik. Ini tidak melakukan apa-apa, dan meninggalkan input terbalik. Terbalik, program ini melakukan hal yang sama, berdasarkan pada fakta bahwa dan secara fungsional setara dengan argumen satu-dimesional.

Anda benar-benar tidak bisa mengatakan saya menambahkan karakter yang tidak berguna untuk memecahkan palindrom (dua fungsi terbalik berbeda dengan input dua atau lebih dimensi; Saya hanya mengambil keuntungan dari fakta mereka bertindak sama dengan satu- input dimensi)

Keriangan
sumber
14

Unix shell - 8 + 25% = 10

rev||ver

Jawaban sebelumnya dari cat|tactidak benar-benar berfungsi, tacmembalik urutan garis, bukan urutan karakter dalam satu garis.

Geoff Reedy
sumber
10

Haskell, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Secara teknis bukan palindrome, tetapi, karena perintah deklarasi fungsi tidak masalah, setelah dibalik Anda memiliki program yang persis sama.

lortabac
sumber
Bagus (+1). Saya tidak percaya ini benar-benar melakukan apa pun, sebelum saya mencobanya ( Tautan ).
Martin Thoma
pindahkan main=niamdeklarasi ke tengah, dan Anda mendapatkan palindrome.
Johannes Kuhn
@JohannesKuhn Ya, saya akui itu masih merupakan solusi palindrom "membosankan", dengan penampilan yang berbeda.
lortabac
10

Ruby, 37

eval <<1.reverse#
esrever.steg stup
1

Terbalik:

1
puts gets.reverse
#esrever.1<< lave
histokrat
sumber
Herestrings, licik! +1
Gagang Pintu
6

Tcl, 78

puts [string rev [gets stdin]];#\
]]nidts steg[ ver gnirts[ stup;# tixe emaner

Bukan palindrome.

Johannes Kuhn
sumber
Idone original - terbalik
Johannes Kuhn
Apa efek bermanfaat yang dimiliki "rename exit" dalam program ini? (Saya tidak tahu Tcl)
vsz
mengganti nama perintah exitmenjadi #(# adalah parameter, bukan awal dari sebuah komentar). \#di baris berikutnya akan mengeksekusi #(bukan memulai dari komentar karena lolos) yang baru exit.
Johannes Kuhn
6

gs2, 2

(Ya, bahasa ini dibuat sebelum tantangan. Tidak, ini bukan lelucon atau celah. Ruang ASCII ( 0x20) terbalik .)

EDIT: aw, kawan, pertanyaan ini sudah sangat tua? Andai saja saya berkomitmen lebih cepat. : <Saya akan membiarkan jawaban ini hanya karena terlalu bagus untuk dilewatkan begitu saja.

Lynn
sumber
3

Golfscript, 9 (7 * 1.25 = 8.75)

-1%#%1-

kotor, kotor, kotor, tetapi sangat pendek. -1%berarti "pilih setiap elemen (karakter), mundur" dan #berarti "komentar garis". Sisanya hanya sedikit dari sihir I / O GolfScript.

Ini adalah solusi "bersih" terpendek (tanpa komentar) yang saya temukan ( 14 * 1.25 = 17.5 ):

'';-1%..%1-;''

artinya: mendorong string kosong, menjatuhkannya, membalikkan input, mengkloningnya dua kali, membaginya dengan sendirinya (mengkonsumsi dua salinan dan menghasilkan array kosong), menghapus semua yang dari array kosong, menjatuhkan array emtpy, mendorong string kosong dan (secara implisit) mencetak tumpukan.

John Dvorak
sumber
Saya seharusnya mengharapkan ini. Bahkan penalti 500% akan memiliki peluang tinggi untuk menjadikannya pemenang.
vsz
@vsz Saya mencari solusi no-comment (bersih) di golfscript, namun.
John Dvorak
Jika input tidak mengandung 1's ..
Johannes Kuhn
@JohannesKuhn kamu benar. Saya telah menjatuhkan "solusi" itu.
John Dvorak
@vsz tantangan yang lebih menarik adalah melarang karakter komentar (dan masih menghukum palindrom?) Kontestan saya untuk ini memiliki 14 karakter, saya kira cukup banyak.
John Dvorak
3

Ruby, 44

puts gets.reverse#esrever.steg stup

Hanya komentar di akhir program normal: P

35 karakter, + 25% = 44

resueman
sumber
2

Tcl, 75.25

Kali ini sebuah palindrome.

puts [string rev [gets stdin]]]]nidts steg[ ver gnirts[ stup
Johannes Kuhn
sumber
(antara ]]dan ]]adalah karakter \ x1A.)
Johannes Kuhn
2

Python 3, 42

print(input()[::-1]);#)]1-::[)(tupni(tnirp

Kredit

  • Versi awal dengan skor 49 + 25% = 61.25 dibuat oleh saya
  • Terima kasih kepada arshajii untuk meningkatkan skor dari 61.25 menjadi 51.25
  • Versi baru dengan skor 42 ( :-)) dibuat oleh saya
Martin Thoma
sumber
Anda bisa menggunakan print(input()[::-1])#)]1-::[)(tupni(tnirpPython 3 sebagai gantinya untuk memotong skor menjadi 51,25.
arshajii
1
Itu tidak memotong ...
Oliver Ni
"solusi apa pun yang merupakan palindrome akan dikenakan penalti + 25% untuk skor, dibulatkan. Penalti ini masih berlaku, jika Anda, misalnya, memasukkan karakter ke dalam program yang tidak memiliki efek yang berguna, hanya untuk memecahkan palindrom . " Saya berpendapat bahwa ;ini adalah penyisipan yang tidak memiliki efek yang berguna.
Oliver Ni
2

Rebmu : 9 ( dg hukuman) atau 13 (tanpa)

Solusi Rebmu yang membosankan adalah 9 dan dikenakan penalti palindrom. Saya akan tetap menunjukkannya "hanya karena":

rnRVaVRnr

Dengan menggunakan trik yang tak terbendung dari memperhatikan huruf kapital adalah kata-kata yang terpisah, dan tidak adanya huruf besar berarti kita tidak membuat kata-kata, kita menghasilkan lima kata biasa:

rn rv a vr nr

Yang merupakan singkatan untuk kode yang setara (juga hukum Rebmu):

return reverse a vr nr

Fakta bahwa vr dan nr tidak ada artinya tidak masalah, karena meskipun tidak ditugaskan untuk apa pun mereka adalah kata-kata yang valid. Jadi evaluator hanya menjalankan return reverse a... ia bekerja dua arah. Tapi ini analog dengan cheat yang membosankan: kode tidak dikomentari, tapi sudah mati dan tidak dieksekusi di satu jalur.

Untuk sesuatu yang lebih menarik yang tidak dikenakan penalti, bagaimana dengan solusi 13 karakter ini:

a VR :rv AvrA

Mari kita lihat bagaimana ini diproses pada jalur maju dan mundurnya, ketika diperluas. Meneruskan:

a               ; evaluate a, as it is a string it has no side effects
vr: :reverse    ; "set" vr to mean what a "get" of reverse means now
a: vr a         ; assign a to calling "vr" on a, effectively reversing
                ;   ^-- result of assign is last expression, the answer!

Mundur sebagai ArvA vr: RV a:

a: reverse a    ; assign A to its reversal
vr: rv: a       ; make the abbreviation vr equal to assignment of a to rv
                ;   ^-- result of assign is last expression, the answer!

Pada sisi negatifnya, varian mundur menimpa singkatan untuk terbalik. Tapi hei, itu bukan palindrome, dan itu hanya 13 karakter. :-)

(Catatan: Ini mengasumsikan Anda menjalankan Rebmu dalam mode / args, di mana a adalah argumen default untuk program yang diteruskan ke penerjemah pada baris perintah dan Anda menerima hasilnya. Jika membaca dari input standar sebenarnya merupakan persyaratan, hal-hal tumbuh misalnya dari 9 hingga 11 karakter untuk solusi sederhana:. rnRVrArVRnrDan jika Anda harus mencetak ke output standar dari dalam program alih-alih menerima output ekspresi dari interpreter yang akan menambahkan beberapa karakter juga.)

Rebmu
sumber
2

JavaScript, 62 * 1.25 = 78

i.split('').reverse().join('')//)''(nioj.)(esrever.)''(tilps.i

Tidak terlalu kreatif, tetapi yang terbaik yang bisa saya dapatkan. (mengasumsikan bahwa input disimpan dalam variabel i)

Saya mendapatkan ini:

63 karakter, tanpa palindrome

i.split('').reverse().join('')//)a(nioj.)(esrever.)''=a(tilps.i

tapi rasanya seperti selingkuh. : PI dapat melakukan lebih banyak perubahan sepele (seperti menggunakan i['split']alih-alih i.split), tetapi semua itu masih terasa curang: P

Gagang pintu
sumber
mengasumsikan bahwa input disimpan dalam variabel i (p=a=>a&&p()==`(p=${p})(i)`?i:i.split``.reverse().join``)(i)(60 byte) melakukan hal itu
Esc Điệp
2

Pyke, 2 (+ 25%), tidak bersaing

_

Pyke mengambil input secara implisit dan output secara implisit.

_ adalah fungsi sebaliknya.

Biru
sumber
1

Tcl, 99

proc unknown args {puts "Hello World!"}
}"!dlroW olleH" stup{ sgra nwonknu corp

Jika perintah yang tidak ada dipanggil, unknownperintah khusus dipanggil yang dapat memuat perintah. Atau melakukan hal-hal lucu lainnya.

Johannes Kuhn
sumber
1

T-SQL, 86 * 1.25 = 108

Berikut ini adalah entri palindromic yang membosankan untuk SQL Server 2008 (dan yang lebih baru) hanya untuk menunjukkan bahwa itu mungkin.

DECLARE @ VARCHAR(MAX)='Hi'PRINT REVERSE(@)--)@(ESREVER TNIRP''=)XAM(RAHCRAV @ ERALCED

@ memegang teks input, contoh string adalah "Hai". Hitungan char entri ini adalah untuk string input dua char.

Muqo
sumber
1

Tong , ceil (1 + 0,25) = 2 byte

?

Ini mengambil input dan membalikkan, dan output implisit mengeluarkannya secara harfiah. TIO

SEBUAH
sumber
0

QBIC , 14 + 25% = 18 byte

;?_fA|#|Af_?;

Mempekerjakan kode sumber palindromic. Menggunakan dua cara berbeda untuk melakukan ini membutuhkan waktu agak lama (34 byte):

;[_lA|,1,-1|Z=Z+mid$(A,a,1)#|Af_?;

Penjelasan:

Read the input string from the command line as A$
;

FOR len(A$); a >= 1; a--
[        Starts a FOR loop
_l...|   returns the length the argument(here, A$); sets the starting point of the loop
,1       set the end point of the loop
,-1      FOR loop incrementer (or decrementer in this case)
|        Ends the argument list for the FOR loop

On each FOR iteration, add the right-most character of the input to Z$
Z=Z+mid$(A,a,1)

The cheat:
# starts a string literal, hiding the flipped source.
    The literal is closed implicitly at the end-of-file.
    The FOR loop is closed implicitly at the end-of-file.
    Z$ gets printed implicitly at the end of the program if it's non-empty

The flipped source is the same as my palindrome-code:
;       reads in A$ from the cmd line   
 ?      PRINT
  _fA|  The reversed version of A$
      # And hide the rest of our source in a literal  
steenbergh
sumber
0

Pushy , 7 byte (5 + 25%)

@"i"@

Cobalah online!

Ini dikenakan penalti 25% karena itu palindrom, tapi itu yang terbaik yang bisa saya lakukan. Tidak peduli ke arah mana program dijalankan, ia melakukan 3 perintah ini:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

Mengganti iuntuk c(tumpukan jelas) atau \(komentar) memiliki efek yang sama.

FlipTack
sumber
0

05AB1E , 1 + 25% = 2 byte

R

Cobalah online!

Bismarck71
sumber
Anda perlu mengumpulkan, jadi ini adalah (1 + 0,25) = 1,25 dibulatkan = 2 byte.
A
Terima kasih! Saya memperbaiki judulnya.
Bismarck71
0

R , 65 byte

EDIT: Mengesampingkan penalti 25% berkat sepele, namun tidak terlihat oleh saya, diubah oleh Grimy.

stringi::stri_reverse(scan(,""))#))'',(nacs(esrever_irts::ignirts

Cobalah online!

Katakan halo kepada kemampuan luar biasa R untuk menangani string, bahkan ketika Anda menggunakan paket yang dirancang untuk string seperti stringi... barf

Sumner18
sumber