Quine Mücadelesi I


12

Meydan okuma

Bu görev an N tamsayı girişi bir alacak bir programı yazmak zorunda (-1e9 <= K <0 && 0 <N <= + 1E9) , daha sonra hesaplamak , T = (abs (K)% M + 1) , eğer N pozitiftir, ardından T-th karakterini en başından çıkartın, T-th karakterini kaynağınızın sonundan çıkarın.

M, kaynağınızın bayt cinsinden boyutudur.

Örnek: Kaynağınız:abcd efg/hi

Giriş:

 2

Çıktı:

 c

Giriş :

-3

Çıktı:

g 

Giriş :

-9249678

Çıktı:

b 

Giriş :

-11

Çıktı:

i 

Kısıtlamalar

  • Herhangi bir DOSYA işlemi kullanmayın
  • İstediğiniz herhangi bir dili kullanabilirsiniz
  • Tüm bayramları bozduğu için 1 baytlık gönderimlerden kaçının ya da kullanmayın.
  • En kısa çözüm kazanır!

DÜZENLEME: Sorun bildirimi, çözümlerin rasgele bir test verileri (ve tüm çözümler için aynı veriler) kullanılarak değerlendirilebilmesi için değiştirildi, bu nedenle lütfen çözümünüzü uygun şekilde güncelleyin, rahatsızlıktan dolayı özür dileriz (varsa).


Örnek test durumunda giriş 5 veya -7 ise çıkış tek bir boşluk olmalıdır: "" (tırnak olmadan).
Quixotic

N 0 ise ne olur?
aaaaaaaaaaaa

@eBusiness: Belirttiğiniz için teşekkürler, sorun bildirimini değiştirdim, şimdi $ 0 $ olabileceğini sanmıyorum :-)
Quixotic

3
Bu sorta artık karakter 0 ile 1 arasında atlamada atlanır garip bir eşleme, olmak tutar: -2 -> / -1 -> h 0 -> i 1 -> b 2 -> c. Ama en azından haritalama artık oybirliğiyle.
aaaaaaaaaaaa

1
Sanırım &&ilk cümledeki bir ||?
Paŭlo Ebermann

Yanıtlar:


12

x86 derlemesi (32 bit Linux, AT&T sözdizimi): 548

Dosyanın sonunda yeni satır yok:

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 "

İle derledim gcc -nostartfiles -m32 qc1.S -o qc1

Doğrulama, pozitif sayılar:

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

Doğrulama, negatif sayılar:

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

Edit , garip numaralandırma şemasını doğru anladı. Bence. Uzunluğunu değiştirmedi.


+ 1, Bu montajda bunu yapmak için mükemmel bir iş, ama test oybirliğiyle yapmak için sorunu değiştirdim küçük bir şey bu yüzden çözüm gibi akıllıca değiştirin, teşekkürler.
Quixotic

Heh, oldukça havalı. Ve komik bir şey, çok farklı diller olmasına rağmen, bu benim 44 karakter GolfScript çözümüme benziyor gibi görünüyor.
aaaaaaaaaaaa

1
@Debanjan: Kafamı numaralandırma şemasının etrafına dolayamıyor gibiyim. Doğru doğrulama hatlarını verebilir misiniz? (sorun açıklaması iyi bir yer olurdu)
JB

+1, bu sizin ikinci "geçersiz" asnwer'ınız (kod-bilge), oylamaya değer :)
Eelvex

@Eelvex: Kayıt için, diğeri yayınlandığı tarihte geçerliydi.
JB

10

Whaddaya biliyor, HQ9 + büyük geri dönüş yapıyor!

Q

Aralarından seçim yapabileceğiniz tek bir karakter olduğunda endekslemeyi zahmete sokmanıza gerek yok!


Herhangi bir girdi alıyor mu?
Quixotic

@Debanjan: Emin:echo '-1' | hq9+ qc1
JB

Üzgünüm, bu benim için çok anlamlı değil, PHP'de benzer bir çözüm var ama bu tür bir çözüm tüm eğlenceyi bozuyor değil mi? Teşekkürler,
Quixotic

Sen yok olması bunu sığar sanmıyorum eğer bunu kabul etmek, biliyorsun! Hatta onu yükseltmene bile gerek yok. Ben şahsen takdir etmememe rağmen aşağı bile oy verebilir ;-)
JB

Hayır, bu kabul ya da reddetme ile ilgili değil, sadece yeni bir şey öğrendiğim için
puanlama yapmak istiyorum

5

Yakut 1.9, 66 karakter

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

Aslında normal bir kine için pek fark yok.

  • Düzenle: Yeni özellikleri şimdi izler.

5

GolfScript 26 karakter

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

Dinamik diller icat edilmeden önce ayinler daha eğlenceliydi.

Düzenleme: Sızıntılar için burada "gerçek" bir GolfScript quine, hayır `ve ~ sadece girdi ayrıştırmak için kullanılır.

Engelli GolfScript 44 karakterleri

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

Aynı dize iki kez tekrarlanan ne kadar güzel olduğuna dikkat edin, bu yüzden dize hazır bilgisi sadece 'önünde bir saldırıya ihtiyaç duyar ve kullanıma hazırdır.


1
GolfScript bilmiyorum, ancak yorumunuz beni kodunuzun "DOSYA işlemi" kısıtlama kategorisine doğru eğildiğini düşünmeye itiyor. Doğuşlarını genişletmek ister misiniz?
JB

Sihir `operatörün kullanımı ile olur, temelde bir işlevi tanımlarım, bir değişkende saklar, işlevi kendi dize temsiline dönüştürür (bunu yapar) ve sonra görevi önemsiz bir şekilde bitirebilen işlevi çalıştırırım dizede kendi iç kısımları olduğu için.
aaaaaaaaaaaa

+1: - Quines were more fun before the invention of dynamic languages.:-)
Quixotic

3
Eh Eminim çalışıyor olmaz bu ... birleştirici dili birini
JB

6
Çizik. Ben yaptım Assembly dilinde bu bir deneyin.
JB

2

Lenguage, 4 bayt

Kaynak kodu 4 boş bayttan oluşur. Girdi ne olursa olsun, çıktı bir byte ile tamamlanan bir boş bayt olmalıdır ..


0

Smalltalk, 94 90 59 52

örneğin, Object sınıfında derleyin:

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

sonra herhangi bir nesneye q: <n> gönderin; burada bir tamsayı:

doğrulama:

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

veya daha iyisi:
(0 ila: 100) toplayın: [: n | 1 q: n] as: 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) toplamak: [: n | 1 q: n] as: 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('

Smalltalkers olmayanlar için açıklama:
thisContext , yöntemi istenebilecek, kaynak istenebilecek geçerli yığın çerçevesidir .


0

Runik Efsunlar , 17 bayt

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

Çevrimiçi deneyin!

Program dizesini oluşturmak için sadece standart quine kullanır, ardından belirli bir dizindeki karakteri almak için dize tabanlı modulo operatörü 1'i kullanır (bu, doğal ve negatif göstergeleri, Python'un etkilediği davranışı destekler).

  1. ,"Bölmek" komutu keser parçalar halinde dize kadar (mantıksal yeterince ters *dize çoğaltarak xkez), +bitiştirir ve -kaldırır xucundan karakterleri (mantıksal yeterince ters +). Bu nedenle %komut şu rolü alır charAt(x): kalan tek temel dize işlemi (yığın benzeri işlemler, yığınla ilgili aynı komutlar tarafından işlendikten sonra; örneğin l, yığının boyutu, yani bir dizenin uzunluğudur).

0

JavaScript (ES6), 28 bayt

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

Değiştirilmiş bir kine.

28'den büyük %28bir değer işlenir , 0'dan küçük bir değer işlenir .substr().

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.