Porządkowanie antyferromagnetyczne

16

Antiferromagnetic ordering

Antyferromagnetyzm jest tym, co badacze IBM używali do przeskakiwania z dysku o pojemności 1 terabajta na dysk o pojemności 100 terabajtów z tą samą ilością atomów.

W materiałach wykazujących antyferromagnetyzm momenty magnetyczne atomów lub cząsteczek, zwykle związane ze spinami elektronów, wyrównują się w regularny sposób z sąsiednimi spinami (na różnych sublatach) skierowanymi w przeciwnych kierunkach.

Twoim zadaniem jest napisanie programu, który rysuje kolejność atomów antyferromagnetycznych, jak na powyższym obrazku. Musisz mieć co najmniej cztery pary par, chociaż możesz mieć ich więcej.

Każda para musi być pokazana w następujący sposób, chociaż muszą to być rzeczywiste strzałki :

 Góra dół
w dół w górę
 Góra dół

Twój wynik może być w grafice ascii lub graficznej.

Możesz utworzyć tylko funkcję lub cały program, ale musi on wejść i narysować tyle par. Przykłady zawierające tylko słowa :

Wejście: 1

 Góra dół
w dół w górę
 Góra dół

Wejście: 2

 góra dół góra dół 
w dół w górę w górę w górę  
 góra dół góra dół

Dopuszczalne strzałki:

  • i
  • i
  • /|\ i \|/

Proszę umieścić swoje odpowiedzi w języku, w formacie X bajtów , ponieważ jest łatwy do odczytania. Wygrywa najmniej bajtów!

faza
źródło
5
„Wszelkie strzały” brzmią dla mnie dość niejednoznacznie - a co z tym ^v?
Sp3000,
1
@ Sp3000 Nie, bo nie mają małych ogonów.
faza
2
Czy te strzałki są dozwolone: i ? ( punkty kodu Unicode U + 21C5 i U + 21F5 )
Cyfrowa trauma
1
@DigitalTrauma Są idealne!
faza
11
@Phase Cofnąłem twoją edycję. Zmiana punktacji z bajtów na znaki znacznie zmieni wyniki dla wielu z tych odpowiedzi. Zmianę zasad po uzyskaniu 15 odpowiedzi na ogół nie należy do poważnych.
Cyfrowa trauma

Odpowiedzi:

16

APL, 18 12 bajtów

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

To konstruuje macierz 2n x 3, gdzie n jest wejściem ( ), wypełnionym znakami i . Transpozycja ( ) tej matrycy jest następnie drukowana.

Możesz spróbować online .

Alex A.
źródło
Fajne nadużycie zestawu znaków APL. Sądzę jednak, że inne odpowiedzi również mogą korzystać z tego zestawu znaków.
jimmy23013
1
@ jimmy23013: Strona kodowa APL jest oparta na EBCDIC. Nie jestem pewien, ile języków może to obsłużyć.
Dennis,
@Dennis Czy program sam nie może być w ASCII (lub jakiś bełkot w EBCDIC) podczas drukowania ciągów EBCDIC? Skrót do nowych linii zniknąłby. Alternatywnie, konsola Windows wydawała się drukować \x18\x19jako ↑↓.
jimmy23013,
Lub te strony kodowe .
jimmy23013,
@ jimmy23013: Tak, właśnie rozmawiałem o starych konsolach na czacie . Bełkoty mogą zadziałać, ale prawdopodobnie warto je omówić.
Dennis,
12

Pyth, 15 bajtów (11 znaków)

V3.>*Q"↑↓"N

Wypróbuj online: demonstracja

Wyjaśnienie:

              implicit: Q = input number
V3            for N in [0, 1, 2]:
      "↑↓"       string "↑↓"
    *Q           repeat Q times
  .>      N      rotate the string by N
Jakube
źródło
12

Java, 313 296 bajtów

Oto przykład, który wyświetla strzałki graficznie:

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();}

W bardziej czytelnym formacie:

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();
}

Wyświetlacz dla 5 jako danych wejściowych:

Display for 5 as input

Musisz zmienić rozmiar okna, które się pojawi, aby zobaczyć strzałki. Próbowałem to zrobić, aby żadne z nich nie wyglądało na „odcięte” przez wewnętrzną ramkę okna, ale może tak wyglądać na niektórych platformach.

TNT
źródło
9

CJam, 18 bajtów (14 znaków)

ri3*"↑↓"*3/zN*

Wygeneruj kolumny (które tworzą powtarzalny wzór), a następnie transponuj.

Wypróbuj online .


Alternatywne 18 bajtów:

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

Obróć łańcuch "↑↓"*no 0, 1 lub 2 razy.

Sp3000
źródło
7

CJam (15 znaków, 19 bajtów)

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

Demo online

Peter Taylor
źródło
1
Warunkiem wygranej są bajty, a nie znaki.
isaacg,
@PeterTaylor: Określono wyzwanie Język, format X bajtów . Masz go w formacie char, ale znaki Unicode są warte 2 bajty, więc twój rzeczywisty wynik to 17 bajtów
Levi
@Levi Zgodnie z tym każdy ma 3 bajty.
isaacg,
@isaacg ah my bad
Levi
7

Befunge, 71 bajtów

Moja pierwsza odpowiedź, więc proszę, bądź ze mną delikatny: o)

Irytujące problemy z wyrównaniem spowodowały kilka zmarnowanych bajtów, jeśli masz jakieś ulepszenia dla mnie, chciałbym je usłyszeć!

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

Wejście: 4

 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
 \|/  /|\  \|/  /|\  \|/  /|\  \|/  /|\ 
 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
Sok
źródło
6

CJam, 14 bajtów

0000000: 332c 7269 2218 1922 2a66 6d3e 4e2a       3,ri".."*fm>N*

Wymaga to terminalu obsługującego, który renderuje stronę kodową 850 w następujący sposób:

Nie spiczasta część kodu okazała się identyczna z alternatywną wersją @ Sp3000 .


CJam, 17 bajtów

ri"⇅⇵⇅"f*N*

Cheaty wersja z podwójną strzałką, z kredytami dla @DigitalTrauma.

Wypróbuj online.

Dennis
źródło
5

Pyth, 16 bajtów (12 znaków)

J"↑↓"V3*~_JQ

Przykład:

Input: 4
Output:
↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
isaacg
źródło
5

Python 2, 131 122 bajtów

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()

Cóż ... Chyba pokonałem C Java?

enter image description here


Wybrałem wysokość 32strzał, która jest dość duża, więc po chwili żółw zaczyna rysować poza ekranem. Jeśli chcesz, aby wszystko pasowało do dużych nakładów, możesz zmniejszyć strzałki, zastępując 32s, lub użyć screensize()(nie jestem pewien, czy na wyjściu poza ekranem jest meta post ...)

Sp3000
źródło
1
Więc ... kiedy zamierzamy dodać grafikę żółwia do Pytha?
Cyfrowa trauma,
Z pewnością do gry w golfa powinieneś wybrać jednocyfrową liczbę do zmiany rozmiaru ...
Beta Decay
@BetaDecay W przypadku rozmiaru jednocyfrowego ogon jest ledwo widoczny, ponieważ jest zasłonięty przez żółwia
Sp3000,
4

GNU sed, 25 bajtów

Znalazłem symbole strzałek i Unicode, które pozwalają na dalsze skracanie i zostały one dopuszczone przez ten komentarz :

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

Dane wejściowe są jednostkowe , więc np. 4 to 1111:

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

Previous answer in case and are disallowed:

GNU sed, 39 bytes

s/1/↑↓/g
s/.*/&a&↑\n&/
s/a↑/\n/
Digital Trauma
źródło
3
Whenever I see "GNU sed" at the top of a post, I don't even need to scroll down to know who posted it.
Alex A.
@AlexA. This guy? ;-)
Digital Trauma
Input is in unary?! Is that a general for the language or something you programmed in?
Beta Decay
1
What a nefarious answer :-)
xebtl
1
@BetaDecay thats the unique property of unary strings - their numeric value is equal to their length. The meta question/answer allows for this strictly for languages that don't have native arithmetic (e.g. sed). This is particularly handy for this question, because the output of the required length can easily be generated from the unary input. Cheaty? perhaps - but the meta answer consensus seems to be OK with it.
Digital Trauma
3

Swift 2, 66 bytes

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

If Swift would be just a liiiitle bit less verbose, it wouldn't even be that bad for golfing (I'm looking at you, named parameter appendNewline)

Kametrixom
źródło
3

Ruby 39 (or 44) characters, 43 (or 48) bytes

According to https://mothereff.in/byte-counter the arrow characters are 3 bytes each!

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

An anonymous function which returns an array. If the function has to print the array, it should end with puts a for 5 more bytes.

Example use

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

puts f.call(6)

Gives

↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
Level River St
źródło
3

J, 41 35 32 bytes (28 characters)

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

I have never programmed anything in J so this took me a while, and it's most definitely not the best way to do it.

This waits for you to input a number when run before outputing the arrows.

Fatalize
źródło
What do you mean you haven't programmed anything in J? I seem to recall a certain J answer which got you over 1k rep. ;)
Alex A.
@AlexA. Doing simple arithmetics is not really what I would call programming. When I posted that answer I really didn't know anything about J besides the right to left priority
Fatalize
2

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

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

Props to Digital Trauma for finding the ⇅ and ⇵ characters and allowing me to shave off more bytes.

George Reith
źródło
2

J, 30 bytes

|:((2*".1!:1<1),3)$ucp'↑↓'
gar
źródło
2

C, 169 170 162 125 123 105 119 107 bytes

So, I though I might as well give this a go, even though this is obviously not the winner :)

Golfed:

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

Ungolfed:

#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("");
    }
}

Example:

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

Update:

See it run here

Levi
źródło
You can do for(j=0;j++<3;) and the same with i
lirtosiast
@ThomasKwa aha... well spotted. thanks
Levi
i and j are globals, so they're initialized to zero. You can drop i=0 and j=0.
Andrea Biondo
Also, you can exploit little-endianess and zero initialization to use n as a buffer: n=getchar();n=atoi(&n);
Andrea Biondo
@AndreaBiondo when i remove i=0 and j=0, all the output is on one line. can you reproduce this? i'm using gcc 4.9.2
Levi
2

Octave, 37 bytes

EDIT: corrected from the earlier stripe-antiferromagnetic version. Thanks @beta-decay for catching my mistake.

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

Defines a function f(n). Sample output:

octave:4> f(1)
ans =

⇅
⇵
⇅

octave:5> f(5)
ans =

⇅⇅⇅⇅⇅
⇵⇵⇵⇵⇵
⇅⇅⇅⇅⇅
xebtl
źródło
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
źródło
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
źródło
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
źródło
1

BBC BASIC, 70 bytes

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

This can probably be golfed more

Beta Decay
źródło
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
źródło
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
źródło
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
źródło
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
źródło
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
źródło
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
źródło
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
źródło
0

Tcl 49 bytes

No winner but at least it's competitive:

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