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!

fase
fuente
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 .

Alex A.
fuente
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
Jakube
fuente
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.

TNT
fuente
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.

Sp3000
fuente
7

CJam (15 caracteres, 19 bytes)

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

Demostración en línea

Peter Taylor
fuente
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

 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
 \|/  /|\  \|/  /|\  \|/  /|\  \|/  /|\ 
 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
Sok
fuente
5

Pyth, 16 bytes (12 caracteres)

J"↑↓"V3*~_JQ

Ejemplo:

Input: 4
Output:
↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
isaacg
fuente
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 ...)

Sp3000
fuente
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/
Trauma digital
fuente
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.
@AlexA. ¿Este chico? ;-)
Digital Trauma
¿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 )

Kametrixom
fuente
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

↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
Level River St
fuente
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.

Fatalizar
fuente
¿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.

George Reith
fuente
2

J, 30 bytes

|:((2*".1!:1<1),3)$ucp'↑↓'
gar
fuente
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í

Levi
fuente
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 =

⇅⇅⇅⇅⇅
⇵⇵⇵⇵⇵
⇅⇅⇅⇅⇅
xebtl
fuente
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
rink.attendant.6
fuente
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
daniero
fuente
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
Fongoid
fuente
1

BBC BASIC, 70 bytes

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

This can probably be golfed more

Beta Decay
fuente
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");}
Andrea Biondo
fuente
1

Python 2, 47 bytes

Port of my BBC BASIC answer, taking advantage of how Python can easily reverse strings.

n=r"/|\\|/"*input();print n+"\n"+n[::-1]+"\n"+n
Beta Decay
fuente
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");
}
Cole Cameron
fuente
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>

rink.attendant.6
fuente
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):

↑↓↑↓
↓↑↓↑
↑↓↑↓
DeadChex
fuente
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
heo
fuente
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
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
MickyT
fuente
0

Tcl 49 bytes

No winner but at least it's competitive:

foreach x {⇅ ⇵ ⇅} {puts [string repeat $x $argv]}
slebetman
fuente
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]})}
GoatInTheMachine
fuente
3
This would need to be put in a function, having to change the code for input isn't allowed
Downgoat