Quine Challenge I

12

Desafío

En esta tarea, debe escribir un programa que ingrese un número entero N (-1e9 <= N <0 && 0 <N <= + 1e9) , luego calcule T = (abs (N)% M + 1) , si N es positivo, luego genera el carácter T-th desde el principio; de lo contrario, genera el carácter T-th desde el final de su fuente.

M es el tamaño de su fuente en bytes.

Ejemplo: si su fuente es:abcd efg/hi

Entrada:

 2

Salida:

 c

Entrada :

-3

Salida:

g 

Entrada :

-9249678

Salida:

b 

Entrada :

-11

Salida:

i 

Restricciones

  • No use ninguna operación de ARCHIVO
  • Puedes usar cualquier idioma de tu elección
  • Intente evitar o, mejor dicho, no use envíos de 1 byte, ya que arruina toda la diversión.
  • ¡La solución más corta gana!

EDITAR: La declaración del problema se ha modificado para que las soluciones puedan juzgarse utilizando datos de prueba aleatorios (y los mismos datos para todas las soluciones), por lo tanto, actualice su solución en consecuencia, disculpe las molestias (si las hubiera).

Quijotesco
fuente
En el caso de prueba de ejemplo, si la entrada es 5 o -7, la salida debería ser un espacio simple: "" (sin comillas).
Quixotic
¿Qué pasa si N es 0?
aaaaaaaaaaaa
@eBusiness: Gracias por señalarlo, he cambiado el enunciado del problema, no creo que $ 0 $ pueda ocurrir ahora :-)
Quixotic
3
Sorta sigue siendo un mapeo extraño, ahora un personaje se salta en el salto de 0 a 1: -2 -> / -1 -> h 0 -> i 1 -> b 2 -> c. Pero al menos el mapeo es ahora unánime.
aaaaaaaaaaaa
1
Supongo que &&en la primera oración está destinado a ser un ||?
Paŭlo Ebermann

Respuestas:

12

Ensamblaje x86 (Linux de 32 bits, sintaxis de AT&T): 548

No hay nueva línea al final del archivo:

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 "

Lo compilé con gcc -nostartfiles -m32 qc1.S -o qc1

Verificación, números positivos:

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

Verificación, números negativos:

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

Edit lo hizo bien sobre el extraño esquema de numeración. Yo creo que. No cambió la longitud.

JB
fuente
+ 1, es un trabajo brillante para hacer esto en el ensamblaje, pero una pequeña cosa he modificado el problema para que las pruebas sean unánimes, así que modifique su solución de la misma manera, gracias.
Quixotic
Je, muy bien. Y una cosa curiosa, a pesar de ser lenguajes tan diferentes, parece ser mi solución GolfScript de 44 caracteres.
aaaaaaaaaaaa
1
@Debanjan: Realmente parece que no puedo entender el esquema de numeración. ¿Podría proporcionar las líneas de verificación adecuadas? (la declaración del problema sería un buen lugar)
JB
+1, esa es su segunda respuesta "inválida" aquí (en cuanto al código de golf) que vale la pena votar :)
Eelvex
@Eelvex: para el registro, el otro era válido en el momento en que se publicó.
JB
10

¡Lo sé, HQ9 + hace su gran regreso!

Q

¡No hay necesidad de molestarse en indexar cuando solo hay un personaje para elegir!

JB
fuente
¿Toma alguna entrada?
Quixotic
@Debanjan: claro:echo '-1' | hq9+ qc1
JB
Lo siento, esto no tiene mucho sentido para mí, tengo una solución similar en PHP, pero ¿no es este tipo de solución arruina toda la diversión? Gracias,
quijotesca
No tienes que aceptarlo si no crees que encaja, ¿sabes? Ni siquiera tiene que votarlo. Usted puede incluso downvote, aunque me 'd personalmente no aprecia ;-)
JB
No, no se trata de aceptación o rechazo, solo estaba diciendo un punto y también me gustaría votarlo porque aprendo algo nuevo :-)
Quixotic
5

Ruby 1.9, 66 caracteres

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

No hay mucha diferencia con una quine normal, en realidad.

  • Editar: Sigue las nuevas especificaciones ahora.
Ventero
fuente
5

GolfScript 26 caracteres

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

Las quines eran más divertidas antes de la invención de los lenguajes dinámicos.

Editar: Para los quejumbrosos, aquí hay una quine de GolfScript "real", no 'y ~ solo se usa para analizar la entrada.

GolfScript para discapacitados 44 caracteres

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

Observe qué tan bien es la misma cadena repetida dos veces, por lo que el literal de cadena solo necesita un 'pirateo delante y está listo para usar.

aaaaaaaaaaaa
fuente
1
No conozco GolfScript, pero su comentario me empuja a pensar que su código se inclina hacia la categoría de restricciones "Operación FILE". ¿Te importa expandir sus entrañas?
JB
La magia ocurre mediante el uso del operador `, básicamente defino una función, la almaceno en una variable, convierto la función en su propia representación de cadena (` hace eso), y luego ejecuto la función, que puede terminar la tarea trivialmente ya que tiene sus propias entrañas en la cuerda.
aaaaaaaaaaaa
+1: a Quines were more fun before the invention of dynamic languages.:-)
Quixotic
3
Bueno, estoy seguro de que no probaría este en lenguaje ensamblador ...
JB
66
Rasca eso. Me hice probar esto en lenguaje ensamblador.
JB
2

Lenguage, 4 bytes

El código fuente consta de 4 bytes nulos. Independientemente de la entrada, la salida debería ser un byte nulo, que se realiza mediante una .instrucción.

pppery
fuente
0

Smalltalk, 94 90 59 52

por ejemplo, en la clase Object, compile:

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

luego envíe q: <n> a cualquier objeto; aquí un entero:

verificación:

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

o mejor:
(0 a: 100) recolectar: ​​[: n | 1 q: n] como: Cadena
->')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) recolectar: ​​[: n | 1 q: n] como: Cadena
->')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('

explicación para los que no son Smalltalkers:
thisContext es el marco de pila actual, al que se le puede pedir su método , al que se le puede preguntar su origen .

blabla999
fuente
0

Encantamientos rúnicos , 17 bytes

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

Pruébalo en línea!

Simplemente usa quine estándar para generar la cadena del programa, luego usa el operador de módulo 1 basado en cadenas para obtener el carácter en un índice dado (que admite de forma nativa las indicaciones negativas y positivas, el comportamiento influenciado por Python).

  1. El ,comando "dividir" corta la cadena en trozos (lo suficientemente lógico inverso de *duplicar los xtiempos de la cadena ), +concatena y -elimina los xcaracteres del final (un inverso lo suficientemente lógico de +). Por lo tanto, el %comando toma el rol de charAt(x): la única operación de cadena básica restante (después de que las operaciones similares a la pila sean manejadas por los mismos comandos que se ocupan de la pila; por ejemplo, les el tamaño de la pila, por lo que es la longitud de una cadena).
Draco18s ya no confía en SE
fuente
0

JavaScript (ES6), 28 bytes

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

Una quine modificada.

Un valor mayor que 28 es manejado por %28, un valor menor que 0 es manejado por .substr().

Naruyoko
fuente