Ordenamiento antiferromagnético


16

Ordenamiento antiferromagnético

El antiferromagnetismo es lo que los investigadores de IBM utilizaron para saltar de un disco de 1 terabyte a un disco de 100 terabytes en la misma cantidad de átomos.

En los materiales que exhiben antiferromagnetismo, los momentos magnéticos de los átomos o moléculas, generalmente relacionados con los espines de los electrones, se alinean en un patrón regular con los espines vecinos (en diferentes subredes) que apuntan en direcciones opuestas.

Su trabajo es escribir un programa que dibuje el orden de los átomos antiferromagnéticos como la imagen que se muestra arriba. Debe poder tener al menos cuatro conjuntos de pares, aunque puede tener más.

Cada par debe mostrarse de la siguiente manera, aunque deben ser flechas reales :

 arriba abajo
abajo arriba
 arriba abajo

Su salida puede ser en arte ascii o salida gráfica.

Puede hacer solo una función o un programa completo, pero debe tomar una entrada y dibujar tantos pares. Ejemplos con solo palabras :

Entrada: 1

 arriba abajo
abajo arriba
 arriba abajo

Entrada: 2

 arriba abajo arriba abajo 
abajo arriba abajo arriba  
 arriba abajo arriba abajo

Flechas aceptables

  • y
  • y
  • /|\ y \|/

Ponga sus respuestas en Idioma, formato X bytes , ya que es fácil de leer. ¡La menor cantidad de bytes gana!


55
"Cualquier flecha" me suena bastante ambiguo, ¿qué pasa ^v?
Sp3000

1
@ Sp3000 No, porque no tienen las colas pequeñas.
fase

2
¿Se permiten estas flechas: y ? ( puntos de código Unicode U + 21C5 y U + 21F5 )
Trauma digital

1
@DigitalTrauma ¡Son perfectos!
fase

11
@Fase Revertí tu edición. Cambiar la puntuación de bytes a caracteres cambiará significativamente las puntuaciones de muchas de estas respuestas. Cambiar las reglas después de obtener 15 respuestas generalmente está mal visto.
Trauma digital

Respuestas:


16

APL, 18 12 bytes

⍉(2×⎕)3⍴'↑↓'

Esto construye una matriz de 2n x 3, donde n es la entrada ( ), llena con los caracteres y . Luego se imprime la transposición ( ) de esta matriz.

Puedes probarlo en línea .


Agradable abuso del juego de caracteres APL. Sin embargo, supongo que otras respuestas también pueden usar este conjunto de caracteres.
jimmy23013

1
@ jimmy23013: la página de códigos APL está basada en EBCDIC. No estoy seguro de cuántos idiomas pueden manejar eso.
Dennis

@Dennis ¿No puede el programa en sí estar en ASCII (o algún galimatías en EBCDIC) mientras imprime cadenas EBCDIC? Sin embargo, el atajo para las nuevas líneas se habría ido. Alternativamente, la consola de Windows parecía imprimirse \x18\x19como ↑↓.
jimmy23013


@ jimmy23013: Sí, acabo de hablar sobre consolas antiguas en el chat . El galimatías podría funcionar, pero probablemente valga la pena una meta discusión.
Dennis

12

Pyth, 15 bytes (11 caracteres)

V3.>*Q"↑↓"N

Pruébelo en línea: demostración

Explicación:

              implicit: Q = input number
V3            for N in [0, 1, 2]:
      "↑↓"       string "↑↓"
    *Q           repeat Q times
  .>      N      rotate the string by N

12

Java, 313 296 bytes

Aquí hay un ejemplo que muestra flechas gráficamente:

import java.awt.*;void f(int n){new Frame(){public void paint(Graphics g){for(int k=0,l,m,o;k<n*6;o=k%6,l=o/2*10+32,m=k/6*20+(k++%2==0?19:29),g.fillPolygon(new int[]{m+4,m,m+4,m+4,m+6,m+6,m+10},o==1|o==2|o==5?new int[]{l+9,l+5,l+5,l,l,l+5,l+5}:new int[]{l,l+5,l+5,l+9,l+9,l+5,l+5},7));}}.show();}

En un formato más legible:

import java.awt.*;
void f(int n) {
    new Frame() {
        public void paint(Graphics g) {
            for (int k = 0, l, m, o; k < n*6;){
                o = k % 6;
                l = o / 2 * 10 + 32;
                m = k / 6 * 20 + (k++ % 2 == 0 ? 19 : 29);
                g.fillPolygon(new int[] {m+4,m,m+4,m+4,m+6,m+6,m+10},
                              o == 1 || o == 2 || o == 5 ?
                                  new int[] {l+9,l+5,l+5,l,l,l+5,l+5} :
                                  new int[] {l,l+5,l+5,l+9,l+9,l+5,l+5},
                              7);
            }
        }
    }.show();
}

La pantalla para 5 como entrada:

Display for 5 as input

Tendrá que cambiar el tamaño de la ventana que aparece para ver las flechas. Traté de hacerlo para que ninguno de ellos apareciera "cortado" por el borde interior de la ventana, pero puede parecer así en ciertas plataformas.


9

CJam, 18 bytes (14 caracteres)

ri3*"↑↓"*3/zN*

Genere las columnas (que forman un patrón repetitivo) y luego transponga.

Pruébalo en línea .


Alternativa 18 bytes:

3,ri"↑↓"*fm>N*

Gire la cadena "↑↓"*n0, 1 o 2 veces.


7

CJam (15 caracteres, 19 bytes)

ri"↑↓"*_(+1$]N*

Demostración en línea


1
La condición de victoria es bytes, no caracteres.
isaacg

@PeterTaylor: El desafío especificó Idioma, formato X bytes . Lo tiene en formato char, pero los caracteres unicode valen 2 bytes, por lo que su puntaje real es de 17 bytes
Levi

@Levi Según esto , son 3 bytes cada uno.
isaacg

@isaacg ah my bad
Levi

7

Befunge, 71 bytes

Mi primera respuesta, así que por favor sé amable conmigo: o)

Problemas de alineación molestos resultaron en algunos bytes desperdiciados, si tiene alguna mejora para mí, ¡me encantaría escucharlos!

&::3>:2% #v_0#v" \|/ "<
  >\^,*52<> 0#v" /|\ "<
:#^_$1-:#^_@  >:#,_$\1-

Entrada: 4

 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
 \|/  /|\  \|/  /|\  \|/  /|\  \|/  /|\ 
 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 


5

Pyth, 16 bytes (12 caracteres)

J"↑↓"V3*~_JQ

Ejemplo:

Input: 4
Output:
↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓

5

Python 2, 131122 bytes

from turtle import*
for k in range(input()*6):z=k/3+k%3&1;pu();goto(k/3*32,z*32^k%3*64);pd();seth(z*180+90);fd(32);stamp()

Bueno ... supongo que vencí a C Java.

enter image description here


Elegí la altura 32de las flechas, que es bastante grande, así que después de un tiempo la tortuga comienza a dibujar fuera de la pantalla. Si desea que todo se ajuste a entradas grandes, puede hacer que las flechas sean más pequeñas reemplazando el 32s, o usar screensize()(no estoy seguro de si hay una meta publicación en la salida fuera de pantalla ...)


1
Entonces ... ¿cuándo vamos a agregar gráficos de tortuga a Pyth?
Trauma digital

Seguramente para fines de golf, debe elegir un número de un solo dígito para el tamaño ...
Beta Decay

@BetaDecay Para el tamaño de un solo dígito, la cola apenas es visible, ya que está oculta por la tortuga
Sp3000

4

GNU sed, 25 bytes

Encontré los símbolos de flecha y unicode, que permiten más acortamiento y este comentario los ha permitido :

h
s/1/⇅/g
H
G
s/1/⇵/g

La entrada está en unario , por lo que, por ejemplo, 4 es 1111:

$ echo 1 | sed -f antiferro.sed
⇅
⇵
⇅
$ echo 1111 | sed -f antiferro.sed
⇅⇅⇅⇅
⇵⇵⇵⇵
⇅⇅⇅⇅
$ 

Respuesta previa en caso y no están permitidos:

GNU sed, 39 bytes

s/1/↑↓/g
s/.*/&a&↑\n&/
s/a↑/\n/

3
Cada vez que veo "GNU sed" en la parte superior de una publicación, ni siquiera necesito desplazarme hacia abajo para saber quién lo publicó.
Alex A.


¿La entrada está en unario? ¿Es eso un general para el idioma o algo que programó?
Decaimiento Beta

1
Qué respuesta nefasta :-)
xebtl

1
@BetaDecay esa es la propiedad única de las cadenas unarias: su valor numérico es igual a su longitud. La meta pregunta / respuesta permite esto estrictamente para los idiomas que no tienen aritmética nativa (por ejemplo sed). Esto es particularmente útil para esta pregunta, porque la salida de la longitud requerida se puede generar fácilmente a partir de la entrada unaria. Cheaty? tal vez, pero el consenso de la meta respuesta parece estar de acuerdo.
Trauma digital

3

Swift 2, 66 bytes

let f={n in(0..<n*3).map{print("↑↓",appendNewline:$0%n==n-1)}}

Si Swift fuera solo un poco menos detallado, ni siquiera sería tan malo para el golf (te estoy mirando, parámetro con nombre appendNewline )


3

Ruby 39 (o 44) caracteres, 43 (o 48) bytes

De acuerdo con https://mothereff.in/byte-counter, los caracteres de flecha son de 3 bytes cada uno.

->(n){a=['↑↓'*n]*3;a[1]=a[1].reverse;a}

Una función anónima que devuelve una matriz. Si la función tiene que imprimir la matriz, debería terminar con puts a5 bytes más.

Ejemplo de uso

f=->(n){a=['↑↓'*n]*3;a[1]=a[1].reverse;a}

puts f.call(6)

Da

↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓

3

J, 41 35 32 bytes (28 caracteres)

3$(,:|.)(2*".1!:1[1)$ucp'↑↓'

Nunca he programado nada en J, así que esto me llevó un tiempo, y definitivamente no es la mejor manera de hacerlo.

Esto espera a que ingrese un número cuando se ejecuta antes de mostrar las flechas.


¿Qué quieres decir con que no has programado nada en J? Parece recordar una cierta respuesta J que te dio más de 1k rep. ;)
Alex A.

@AlexA. Hacer aritmética simple no es realmente lo que yo llamaría programación. Cuando publiqué esa respuesta, realmente no sabía nada sobre J además de la prioridad de derecha a izquierda
Fatalize

2

Javascript (ES6), 66 63 53 47 bytes ( 62 55 49 41 caracteres)

f=n=>`⇅
⇵
⇅`.replace(/./g,'$&'.repeat(n))

Props to Digital Trauma para encontrar los caracteres ⇅ y ⇵ y permitirme eliminar más bytes.


2

J, 30 bytes

|:((2*".1!:1<1),3)$ucp'↑↓'

2

C, 169 170 162 125 123 105 119 107 bytes

Entonces, creo que podría intentarlo, aunque obviamente este no es el ganador :)

Golfizado:

n,i,j;main(){n=getchar();n=atoi(&n);for(;j++<3;){for(i=0;i++<n;)printf("%.3s ","⇅⇵"+(j%2)*3);puts("");}}

Sin golf:

#include <stdio.h>
#include <stdlib.h>

/* n -> Number of columns, i & j -> Loop counters */
n,i,j;

main()
{
    /* Get the number of iterations from stdin */
    n = getchar();
    n = atoi(&n); /* Thanks @AndreaBiondo */

    for (; j++ < 3;)
    {
        /* Print rows of arrows */
        for (i = 0; i++ < n;)
            printf("%.3s ","⇅⇵" + (j % 2) * 3);

        /* Print a newline */
        puts("");
    }
}

Ejemplo:

Input: 4
⇵ ⇵ ⇵ ⇵ 
⇅ ⇅ ⇅ ⇅ 
⇵ ⇵ ⇵ ⇵ 

Actualizar:

Véalo correr aquí


Que puede hacer for(j=0;j++<3;)y lo mismo coni
lirtosiast

@ThomasKwa aha ... bien visto. gracias
Levi

iy json globales, por lo que se inicializan a cero. Puedes soltar i=0y j=0.
Andrea Biondo

Además, puede explotar la poca inicialidad y la inicialización cero para usar ncomo un búfer:n=getchar();n=atoi(&n);
Andrea Biondo

@AndreaBiondo cuando elimino i = 0 y j = 0, toda la salida está en una línea. puedes reproducir esto? estoy usando gcc 4.9.2
Levi

2

Octava, 37 bytes

EDITAR: corregido de la versión anterior antiperomagnética de rayas. Gracias @ beta-decay por descubrir mi error.

f=@(n)repmat(["⇅";"⇵";"⇅"],1,n)

Define una función f(n). Salida de muestra:

octave:4> f(1)
ans =

⇅
⇵
⇅

octave:5> f(5)
ans =

⇅⇅⇅⇅⇅
⇵⇵⇵⇵⇵
⇅⇅⇅⇅⇅

1

CoffeeScript, 60 bytes (58 chars)

Comprehensions make it easy without recursion:

f=(n,x='')->x+='\n⇵⇅'[i%(n+1)&&1+i%2]for i in[1..n*3+2];x

1

Ruby, 33 bytes

As a function:

f=->n{[s="↑↓"*n,s.reverse,s]}

Example:

> puts f[3]
↑↓↑↓↑↓
↓↑↓↑↓↑
↑↓↑↓↑↓

Ruby, 37 bytes

Full program which takes input from stdin:

puts s="↑↓"*gets.to_i,s.reverse,s

You can make only a function or a whole program, but it must take an input and draw that many pairs.
Dennis

@Dennis ok, I'm on it
daniero

We seem to have a misunderstanding. I posted the quote to show that a function is in fact valid, since you implied in your original revision that a full program was required by the question.
Dennis

@Dennis No problem. I was just thinking that returning 3 strings wasn't really "drawing", but I guess it doesn't matter. Anyways, got both versions golfed down a bit :)
daniero

1

><>, 55 Bytes

"⇅⇵⇅"{:&3*1-:0(?;\
|.!09v!?%&:&:{o:}/
oa{~}/|.!09

Try it online here, inputting the desired length as initial stack value.

Non ⇅⇵ solution, 59 Bytes:

"↓↑"{:&3*>1-:0(?;{:{\
 |.!09v!?%&:&:oo}}@:/
9oa{$}/|.!0

1

BBC BASIC, 70 bytes

INPUTx:n$=STRING$(x,"/|\\|/"):PRINTn$:PRINTSTRING$(x,"\|//|\"):PRINTn$

This can probably be golfed more


1

C, 97 bytes

Takes the input from the first command-line parameter, e.g. main 4. Supports up to 357913940 pairs. In C you can't use multibyte characters as chars but they work fine as strings.

i,n;main(c,v)char**v;{n=atoi(v[1]);for(i=6*n+3;i--;)printf("%s",i%(2*n+1)?i%2?"↓":"↑":"\n");}

It is smaller as a function, but the other C answers were complete programs so I did that too. It would be 69 bytes:

i;f(n){for(i=6*n+3;i--;)printf("%s",i%(2*n+1)?i%2?"↓":"↑":"\n");}


1

C, 117 89 85 bytes

i;main(j,v)char**v;{j=2*atol(v[1])+1;for(;i++<3*j;)printf(i%j?i%2?"↑":"↓":"\n");}

Ungolfed:

i;
main(j,v)
char**v; // Credit to @AndreaBiondo for brilliant idea that I will use a lot in future golfed programs :)
{
    j = 2*atol(v[1])+1;
    for(;i++<3*j;)
        printf(i%j?i%2?"↑":"↓":"\n");
}

1

JavaScript (ES6), 66 bytes (62 chars)

That includes the Unicode character counted as three bytes each as well as the mandatory newline counted as one byte.

Uses recursion as inspired by this answer. I tried it non-recursively but generating a defined array took too many characters, although someone else might know how to do it better than me.

f=n=>(g=(a,i)=>i?g(`
↓↑`[i%(n*2+1)&&1+i%2]+a,i-1):a)('',n*6+2)

Demo

As with all ES6 answers, they are demonstrable in Firefox, Edge, and Safari 9 only at time of writing:

f = n => (g = (a, i) => i ? g(`
↓↑` [i % (n * 2 + 1) && 1 + i % 2] + a, i - 1) : a)('', n * 6 + 2)

console.log = x => document.getElementById('O').innerHTML += x + '\n';

console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(32));
<pre><output id=O></output></pre>


1

Java, 150 bytes

static void g(int n){n*=2;f(n,0);f(n,1);f(n,0);}static void f(int n,int d){String l="";for(n+=d;n-->d;)l+=(n%2==0)?"↓":"↑";System.out.println(l);}

Output of g(2):

↑↓↑↓
↓↑↓↑
↑↓↑↓

1
I think that you're required to output arrows, so I'd suggest that you change your example output and code to make it absolutely clear that you aren't breaking the rules :)
Beta Decay

@BetaDecay I see some approved arrows have been listed and I haven't made the cut! So following your advice I've changed it
DeadChex

0

Python 2, 45 55 bytes

edit: modified arrows

Pretty straightforward approach. Doesn't work with unicode arrows, though.

def f(n):x=" /|\\ \\|/"*n;print x+"\n "+x[::-1]+"\n"+x

if you look at the comments in the original post, you will see that you are specifically not allowed to use ^v arrows as they do not have a tail
Levi

1
Thanks, I haven't noticed that. Changed it into "/|\", hope it's ok now.
heo

0

R, 60 62 bytes

Takes input from STDIN and outputs to STDOUT. Creates a 3 x (2 * input) array, adds a column of carriage returns and then outputs the transposed array.

cat(t(cbind(array(c('↑','↓'),c(3,2*scan())),'\n')),sep='')

Test run

cat(t(cbind(array(c('↑','↓'),c(3,2*scan())),'\n')),sep='')
1: 25
2: 
Read 1 item
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓

0

Tcl 49 bytes

No winner but at least it's competitive:

foreach x {⇅ ⇵ ⇅} {puts [string repeat $x $argv]}

You can save bytes using lmap instead of foreach
sergiol

And string repeatcan be abbreviated to string re
sergiol

And I am not sure, but implementing it as a proc retrieving a side effect of lmap returning values and replacing $argv by someone one-letter variable may save bytes.
sergiol

-1

Swift 2.0, 79 bytes

Nothing clever...

let p=3;for x in 0...2{print((0..<p*2).reduce(""){$0+["↑","↓"][($1+x)%2]})}

3
This would need to be put in a function, having to change the code for input isn't allowed
Downgoat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.