Quine Challenge I

12

Tantangan

Dalam tugas ini Anda harus menulis sebuah program yang akan mengambil input bilangan bulat N (-1e9 <= N <0 && 0 <N <= + 1e9) , lalu menghitung T = (abs (N)% M +1) , jika N bernilai positif, lalu mengeluarkan karakter T-th dari awal yang lain, mengeluarkan karakter T-th dari akhir sumber Anda.

M adalah ukuran sumber Anda dalam byte.

Contoh: Jika sumber Anda adalah:abcd efg/hi

Memasukkan:

 2

Keluaran:

 c

Masukan :

-3

Keluaran:

g 

Masukan :

-9249678

Keluaran:

b 

Masukan :

-11

Keluaran:

i 

Kendala

  • Jangan gunakan operasi FILE
  • Anda dapat menggunakan bahasa pilihan Anda
  • Cobalah untuk menghindari atau lebih tepatnya tidak menggunakan pengiriman 1 byte, karena itu merusak semua kesenangan.
  • Solusi terpendek menang!

EDIT: Pernyataan masalah telah dimodifikasi sehingga solusi dapat dinilai menggunakan data uji acak (dan data yang sama untuk semua solusi) maka silakan perbarui solusi Anda, mohon maaf atas ketidaknyamanan (jika ada).

Pemurah
sumber
Dalam contoh uji berikan jika inputnya 5 atau -7 output harus berupa spasi tunggal: "" (tanpa kutip).
Quixotic
Bagaimana jika N adalah 0?
aaaaaaaaaaaa
@eBusiness: Terima kasih telah menunjukkan itu, saya telah mengubah pernyataan masalah, saya tidak berpikir $ 0 $ dapat terjadi sekarang :-)
Quixotic
3
Ini agak terus menjadi pemetaan aneh, sekarang karakter dilewati di melompat dari 0 ke 1: -2 -> / -1 -> h 0 -> i 1 -> b 2 -> c. Tetapi setidaknya pemetaan sekarang dengan suara bulat.
aaaaaaaaaaaa
1
Saya kira &&dalam kalimat pertama dimaksudkan menjadi ||?
Paŭlo Ebermann

Jawaban:

12

rakitan x86 (Linux 32-bit, sintaks AT&T): 548

Tidak ada baris baru di akhir file:

pushl 8(%esp)
call atoi
mov $274,%ebx
cmp $0,%eax
jg a
dec %eax
a:cdq
idiv %ebx
cmp $0,%edx
jge p
add %ebx,%edx
p:add $s,%edx
cmp $s+273,%edx
jl l
push $34
mov %esp,%edx
l:mov $4,%eax
mov $1,%ebx
mov %edx,%ecx
mov $1,%edx
int $128
mov $0,%ebx
mov $1,%eax
int $128
s:.ascii "pushl 8(%esp)
call atoi
mov $274,%ebx
cmp $0,%eax
jg a
dec %eax
a:cdq
idiv %ebx
cmp $0,%edx
jge p
add %ebx,%edx
p:add $s,%edx
cmp $s+273,%edx
jl l
push $34
mov %esp,%edx
l:mov $4,%eax
mov $1,%ebx
mov %edx,%ecx
mov $1,%edx
int $128
mov $0,%ebx
mov $1,%eax
int $128
s:.ascii "

Saya kompilasi dengan gcc -nostartfiles -m32 qc1.S -o qc1

Verifikasi, angka positif:

$ for i in $(seq 548 1095); do ./qc1 $i; done | cmp - qc1.S && echo Good
Good

Verifikasi, angka negatif:

$ for i in $(seq -1095 -548); do ./qc1 $i; done | cmp - qc1.S && echo Good
Good

Edit sudah benar tentang skema penomoran yang aneh. Kupikir. Itu tidak mengubah panjangnya.

JB
sumber
+1, Itu pekerjaan yang brilian untuk melakukan ini dalam perakitan, tapi satu hal kecil saya telah memodifikasi masalah untuk membuat pengujian dengan suara bulat jadi tolong modifikasi solusi Anda seperti-bijaksana, Terima kasih.
Quixotic
Heh, keren sekali. Dan hal yang lucu, meskipun bahasa yang sangat berbeda ini tampaknya menyerupai solusi GolfScript 44 karakter saya.
aaaaaaaaaaaa
1
@ Debanjan: Sepertinya saya benar-benar tidak bisa membungkus kepala saya dengan skema penomoran. Bisakah Anda memberikan jalur verifikasi yang tepat? (pernyataan masalah akan menjadi tempat yang baik)
JB
+1, itu yang kedua Anda "tidak valid" di sini (bijaksana kode-golf) yang bernilai upvoting :)
Eelvex
@Eelvex: sebagai catatan, yang lain valid pada saat diposting.
JB
10

Whaddaya tahu, HQ9 + menghasilkan keuntungan besar!

Q

Tidak perlu repot-repot mengindeks ketika hanya ada satu karakter untuk dipilih!

JB
sumber
Apakah dibutuhkan input?
Quixotic
@ Debanjan: yakin:echo '-1' | hq9+ qc1
JB
Maaf, ini tidak masuk akal bagi saya, saya punya satu solusi serupa di PHP tetapi bukankah jenis solusi ini merusak semua kesenangan? Terima kasih,
Quixotic
Anda tidak harus menerimanya jika Anda merasa itu tidak cocok, Anda tahu! Anda bahkan tidak perlu membatalkannya. Anda bahkan mungkin downvote itu, meskipun saya 'd pribadi tidak menghargai ;-)
JB
Tidak, ini bukan tentang penerimaan atau penolakan, saya hanya menyatakan suatu hal juga saya ingin memilih karena saya belajar sesuatu yang baru :-)
Quixotic
5

Ruby 1.9, 66 karakter

z=gets.to_i;s="z=gets.to_i;s=%p;$><<(s%%s)[z%%66]";$><<(s%s)[z%66]

Sebenarnya tidak banyak perbedaan dengan quine normal.

  • Sunting: Mengikuti spesifikasi baru sekarang.
Ventero
sumber
5

GolfScript 26 karakter

{':f`f'+1/\~.1<- 26%=}:f`f

Quines lebih menyenangkan sebelum ditemukannya bahasa yang dinamis.

Sunting: Untuk pengeluh, ini adalah quine GolfScript "asli", tidak `dan ~ hanya digunakan untuk mem-parsing input.

Cacat GolfScript 44 karakter

'"\x27"\+1/\~.1<- 22%='"\x27"\+1/\~.1<- 22%=

Perhatikan betapa baiknya itu adalah string yang sama diulang dua kali, jadi string literal hanya perlu 'diretas di depannya dan siap digunakan.

aaaaaaaaaaaa
sumber
1
Saya tidak tahu GolfScript, tetapi komentar Anda mendorong saya untuk berpikir bahwa kode Anda condong ke kategori "FILE operasi" kendala. Peduli untuk memperluas jeroan?
JB
Keajaiban terjadi dengan menggunakan operator `, pada dasarnya saya mendefinisikan suatu fungsi, menyimpannya dalam variabel, mengubah fungsi ke representasi string itu sendiri (` melakukan itu), dan kemudian saya menjalankan fungsi, yang dengan sepele dapat menyelesaikan tugas karena memiliki jeroan itu sendiri dalam string.
aaaaaaaaaaaa
+1: ke Quines were more fun before the invention of dynamic languages.:-)
Quixotic
3
Ya saya yakin tidak akan mencoba yang satu ini dalam bahasa majelis ...
JB
6
Gores itu. Saya memang mencoba yang satu ini dalam bahasa assembly.
JB
2

Bahasa, 4 byte

Kode sumber terdiri dari 4 byte nol. Terlepas dari input, output harus menjadi byte nol, yang dilakukan oleh satu .instruksi.

pppery
sumber
0

Smalltalk, 94 90 59 52

misalnya, di kelas Object, kompilasi:

q:n|s|s:=thisContext method source.^s at:n\\s size+1

lalu kirim q: <n> ke objek apa pun; di sini bilangan bulat:

verifikasi:

1 q: 0 -> q
1 q: 1 ->:
1 q: 2 -> n
...
1 q: -1 ->)
1 q: -2 ->)
1 q: -3 -> 1

atau lebih baik:
(0 hingga: 100) kumpulkan: [: n | 1 q: n] sebagai: String
->')q:n|s m|s:=thisContext method source.m:=s size.^s at:(n>=0ifTrue:n-1\\m+1ifFalse:m-(0-n\\m))q:n|s m|'

(-1 downTo: -500) kumpulkan: [: n | 1 q: n] sebagai: String
->')m\\n-0(-m:eslaFfi1+m\\1-n:eurTfi0=>n(:ta s^.ezis s=:m.ecruos dohtem txetnoCsiht=:s|m s|n:q))m\\n-0('

penjelasan untuk non-Smalltalkers:
konteks ini adalah kerangka tumpukan saat ini, yang dapat diminta untuk metode ini , yang dapat ditanyakan sumbernya .

blabla999
sumber
0

Pesona Rise , 17 byte

"3X4+kSq:l͍iS%%@

Cobalah online!

Hanya menggunakan standar quine untuk menghasilkan string program, kemudian menggunakan operator modulo berbasis string 1 untuk mendapatkan karakter pada indeks yang diberikan (yang secara alami mendukung indeks negatif dan positif, perilaku yang dipengaruhi oleh Python).

  1. Perintah ,"bagi" memotong string menjadi potongan-potongan (kebalikan yang cukup logis dari *menduplikasi waktu string x), +menggabungkan, dan -menghapus xkarakter dari akhir (kebalikan yang cukup logis dari +). Jadi %perintah mengambil peran charAt(x): satu-satunya operasi string dasar yang tersisa (setelah operasi stack-like ditangani oleh perintah yang sama yang berhubungan dengan stack; mis. lAdalah ukuran stack sehingga panjang string).
Draco tidak lagi percaya pada SE
sumber
0

JavaScript (ES6), 28 byte

f=n=>("f="+f).substr(n%28,1)

Sebuah quine yang dimodifikasi.

Nilai yang lebih besar dari 28 ditangani oleh %28, nilai yang kurang dari 0 ditangani oleh .substr().

Naruyoko
sumber