Quine Challenge I

12

Wyzwanie

W tym zadaniu musisz napisać program, który przyjmie wprowadzanie liczby całkowitej N (-1e9 <= N <0 i& 0 <N <= + 1e9) , a następnie oblicz T = (abs (N)% M + 1) , jeśli N jest dodatnie, a następnie wypisuje T-ty znak od początku, w przeciwnym razie wypisuje T-ty znak od końca źródła.

M to rozmiar twojego źródła w bajtach.

Przykład: jeśli źródłem jest:abcd efg/hi

Wejście:

 2

Wynik:

 c

Wejście :

-3

Wynik:

g 

Wejście :

-9249678

Wynik:

b 

Wejście :

-11

Wynik:

i 

Ograniczenia

  • Nie używaj żadnej operacji PLIKU
  • Możesz użyć dowolnego wybranego języka
  • Staraj się unikać, a raczej nie używaj przesyłania 1-bajtowego, ponieważ psuje to całą zabawę.
  • Najkrótsze rozwiązanie wygrywa!

EDYCJA: Opis problemu został zmodyfikowany, aby można było oceniać rozwiązania na podstawie losowych danych testowych (i tych samych danych dla wszystkich rozwiązań), dlatego należy odpowiednio zaktualizować swoje rozwiązanie, przepraszamy za niedogodności (jeśli występują).

Donkiszotowski
źródło
W podanym przykładzie testowym, jeśli dane wejściowe to 5 lub -7, dane wyjściowe powinny być pojedynczą spacją: „” (bez cudzysłowu).
Quixotic
Co jeśli N wynosi 0?
aaaaaaaaaaaa
@eBusiness: Dziękujemy za zwrócenie uwagi na to, że zmieniłem opis problemu, nie sądzę, aby 0 $ mogło się teraz pojawić :-)
Quixotic
3
To jakoś utrzymuje się na bycie dziwną mapping, teraz postać jest pomijany przy skoku od 0 do 1: -2 -> / -1 -> h 0 -> i 1 -> b 2 -> c. Ale przynajmniej mapowanie jest teraz jednomyślne.
aaaaaaaaaaaa
1
Myślę, że &&w pierwszym zdaniu ma być ||?
Paŭlo Ebermann

Odpowiedzi:

12

Zestaw x86 (32-bitowy system Linux, składnia AT&T): 548

Brak nowego wiersza na końcu pliku:

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 "

Kompilowałem to gcc -nostartfiles -m32 qc1.S -o qc1

Weryfikacja, liczby dodatnie:

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

Weryfikacja, liczby ujemne:

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

Edycja ma rację co do dziwnego schematu numeracji. Myślę. Nie zmieniło długości.

JB
źródło
+ 1, To świetna robota, aby to zrobić w asemblerze, ale jedną małą rzecz zmodyfikowałem problem, aby testowanie było jednomyślne, więc proszę zmodyfikuj swoje rozwiązanie w podobny sposób, dzięki.
Quixotic
Hej, całkiem spoko. I zabawne, mimo że jest tak różnych języków, wydaje się, że przypomina moje 44-znakowe rozwiązanie GolfScript.
aaaaaaaaaaaa
1
@Debanjan: Wydaje mi się, że naprawdę nie jestem w stanie owinąć głowy wokół schematu numeracji. Czy możesz podać odpowiednie linie weryfikacyjne? (opis problemu byłby dobrym miejscem)
JB
+1, to twój drugi „nieprawidłowy” odpowiedź tutaj (jeśli chodzi o golfa), który zasługuje na głosowanie :)
Eelvex 11.03.11
@Eelvex: dla rekordu drugi był ważny w momencie jego opublikowania.
JB
10

Co wiesz, HQ9 + powraca!

Q

Nie ma potrzeby zawracać sobie głowy indeksowaniem, gdy jest tylko jedna postać do wyboru!

JB
źródło
Czy to wymaga wkładu?
Kichot z
@Debanjan: pewny:echo '-1' | hq9+ qc1
JB
Przepraszam, to nie ma dla mnie większego sensu, mam jedno podobne rozwiązanie w PHP, ale czy tego rodzaju rozwiązanie nie psuje całej zabawy? Dzięki,
Quixotic
Nie musisz tego akceptować, jeśli uważasz, że nie pasuje, wiesz! Nie musisz nawet go głosować. Można nawet downvote go, choć Jestem nie „d osobiście docenić ;-)
JB
Nie, nie chodzi o akceptację lub odrzucenie, chciałem tylko powiedzieć, że chciałbym zagłosować, ponieważ uczę się czegoś nowego :-)
Quixotic
5

Ruby 1.9, 66 znaków

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

Właściwie nie ma dużej różnicy w stosunku do normalnego quine.

  • Edycja: postępuje teraz zgodnie z nowymi specyfikacjami.
Ventero
źródło
5

GolfScript 26 znaków

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

Quines były bardziej zabawne przed wynalezieniem dynamicznych języków.

Edycja: Dla whinerów, tutaj jest „prawdziwa” Quine GolfScript, no` i ~ używane tylko do analizowania danych wejściowych.

Handicapped GolfScript 44 znaki

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

Zauważ, jak ładnie jest to ten sam ciąg powtórzony dwa razy, więc dosłowny ciąg potrzebuje tylko 'zhakowanego przed nim i jest gotowy do użycia.

aaaaaaaaaaaa
źródło
1
Nie znam GolfScript, ale twój komentarz popycha mnie do myślenia, że ​​twój kod skłania się w kierunku kategorii „operacji na PLIKU”. Chcesz rozszerzyć swoje wnętrze?
JB
Magia dzieje się przy użyciu operatora `, w zasadzie definiuję funkcję, przechowuję ją w zmiennej, przekształcam funkcję na własną reprezentację łańcucha (` robi to), a następnie uruchamiam funkcję, która może w prosty sposób zakończyć zadanie ponieważ ma swoje własne wnętrzności w ciągu.
aaaaaaaaaaaa
+1: do Quines were more fun before the invention of dynamic languages.:-)
Quixotic
3
Cóż, jestem pewien, że jak cholera nie spróbowałbym tego w asemblerze ...
JB
6
Zdrap to. I nie spróbować tego w asemblerze.
JB
2

Lenguage, 4 bajty

Kod źródłowy składa się z 4 bajtów zerowych. Niezależnie od danych wejściowych, wynik powinien być bajtem zerowym, co jest osiągane za pomocą jednej .instrukcji.

pppery
źródło
0

Smalltalk, 94 90 59 52

na przykład w klasie Object skompiluj:

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

następnie wyślij q: <n> do dowolnego obiektu; tutaj liczba całkowita:

weryfikacja:

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

lub lepiej:
(0 do: 100) zbierz: [: n | 1 q: n] jako: 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 w dół do: -500) zbierz: [: n | 1 q: n] jako: 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('

wyjaśnienie dla innych niż Smalltalkers:
thisContext jest bieżącą ramką stosu, którą można zapytać o jej metodę , którą można zapytać o jej źródło .

blabla999
źródło
0

Runiczne Zaklęcia , 17 bajtów

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

Wypróbuj online!

Po prostu używa standardowej quine do wygenerowania ciągu programu, a następnie używa opartego na łańcuchach operatora modulo 1, aby uzyskać znak o danym indeksie (który natywnie obsługuje negatywne i pozytywne wskazania, zachowanie zależne od Pythona).

  1. Komenda ,„divide” dzieli łańcuch na części (wystarczająco logiczne odwrotność *duplikowania czasów łańcucha x), +łączy i -usuwa xznaki z końca (logiczne odwrotność +). Tak więc %polecenie przyjmuje rolę charAt(x): jedynej podstawowej operacji łańcuchowej, która pozostała (po operacjach podobnych do stosu obsługiwanych przez te same komendy, które dotyczą stosu; np. lRozmiar stosu jest równy długości łańcucha).
Draco18s nie ufa już SE
źródło
0

JavaScript (ES6), 28 bajtów

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

Zmodyfikowany quine.

Obsługiwana jest wartość większa niż 28, obsługiwana %28jest wartość mniejsza niż 0 .substr().

Naruyoko
źródło