• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Możliwie najkrótszy kod w c++

Object Storage Arubacloud
0 głosów
466 wizyt
pytanie zadane 17 listopada 2020 w C i C++ przez KumberTwo Dyskutant (8,270 p.)

Próbuję napisać program, którego zadaniem jest połączenie każdego z 30 elementów z losowym innym, przy czym element a nie może być połączony z samym sobą oraz z każdym elementem musi być połączony dokładnie jeden inny. Ilość znaków tego kodu musi być możliwie jak najkrótsza (złożoność nie ma znaczenia), przy czym liczymy spacje i znaki końca linii. Najlepsze co udało mi się napisać jest ten twór wykorzystujący seta:

#include<bits/stdc++.h>
using namespace std;set<int>t;int main(){srand(time(NULL));for(int i=0;i<30;i++){int x=rand()%31+1;while(*t.find(x)==x)x=rand()%31+1;t.insert(x);cout<<i+1<<"-"x<<endl;}}

Czy możliwe jest jeszcze mocniejsze skrócenie tego kodu?
I dodam jeszcze że output musi być formatu "nr - nr"

komentarz 17 listopada 2020 przez Tomek Sochacki Ekspert (227,510 p.)
Heh nie patrzymy na złożoność i czytelność tylko na liczbę znaków... niech zgadne, pomysl jakiegoś nieogarnietego nauczyciela?
komentarz 17 listopada 2020 przez KumberTwo Dyskutant (8,270 p.)
Raczej kolegi, który stwierdził, że napisze krótszy kod w pythonie. (Niestety prawdopodobnie napisze)
1
komentarz 17 listopada 2020 przez Tomek Sochacki Ekspert (227,510 p.)
Nie idź w tą stronę, jak już to lepiej robić sobie wyzwania na wydajność ale nigdy na krotki kod, to bardzo zły nawyk aby dążyć do krotkiego kodu.
komentarz 17 listopada 2020 przez KumberTwo Dyskutant (8,270 p.)

Spokojnie, ze złożonością wygrałem. Pierwszy raz robię coś takiego i nie zamierzam więcej. Ale jednak pozostaje niesmak przegranej. laugh

komentarz 17 listopada 2020 przez Whistleroosh Maniak (56,980 p.)
Skoro każdy element ma być połączony z jednym innym, to czy ten kod nie jest błędny? Bo może być tak, że 1 połączysz z 2, a takie 3 z 1. I teraz teoretycznie 1 jest połączony z dwoma elementami. Czy może źle rozumiem treść?
komentarz 17 listopada 2020 przez KumberTwo Dyskutant (8,270 p.)
Rzeczywiście, źle to wytłumaczyłem. To "łączenie" jest jednostronne. Czyli gdy a jest połączony z b to b nie jest jeszcze połączony z a.

1 odpowiedź

+1 głos
odpowiedź 17 listopada 2020 przez Whistleroosh Maniak (56,980 p.)
wybrane 17 listopada 2020 przez KumberTwo
 
Najlepsza

Jeżeli Twój kolega korzysta z pythona to masz marne szanse na wygraną. Natomiast spróbowałem wymyślić coś z random shuffle i mam taki kod:

#include<bits/stdc++.h>
using namespace std;vector<int>v(30, 0);int main(){srand(time(0));for(int i=0;i<30;i++)v[i]=i;random_shuffle(begin(v),end(v));for(int i=0;i<30;i++)cout<<i+1<<"-"<<v[i]+1<<"\n";}

Tylko jest on niestety dłuższy niż to co Ty wymyśliłeś, dlatego poniżej wklejam nieco krótszą wersję Twojego pomysłu:

#include<bits/stdc++.h>
using namespace std;int t[30];int main(){srand(time(0));for(int i=0;i<30;i++){int x=rand()%30;while(t[x])x=rand()%30;t[x]=1;cout<<i+1<<"-"<<x+1<<'\n';}}

 

komentarz 17 listopada 2020 przez KumberTwo Dyskutant (8,270 p.)
Ok, dzięki za pomoc
komentarz 17 listopada 2020 przez tkz Nałogowiec (42,000 p.)

@Whistleroosh,

#include<bits/stdc++.h>
#define a x=rand()%30
#define j int
j t[30],i;j main(){srand(time(0));for(;i<30;i++){j a;while(t[x])a;t[x]=1;printf("%d - %d\n",i+1,x+i);}}

 

komentarz 17 listopada 2020 przez KumberTwo Dyskutant (8,270 p.)
Wow, naprawdę mocno zwinięte, dzięki
komentarz 17 listopada 2020 przez Whistleroosh Maniak (56,980 p.)

@tkz, przyznaję, pokonałeś mnie :)

komentarz 17 listopada 2020 przez Whistleroosh Maniak (56,980 p.)

@tkz, mam jednak krótszą wersję:

#include<bits/stdc++.h>
#define a x=rand()%30
int t[30],i,x;int main(){srand(time(0));for(;i<30;i++){a;while(t[x])a;t[x]=1;printf("%d - %d\n",i+1,x+1);}}

:)

komentarz 17 listopada 2020 przez tkz Nałogowiec (42,000 p.)

@Whistleroosh,

#include<bits/stdc++.h>
#define a x=rand()%30
int t[30],i,x;int main(){srand(time(0));while(i++<30){a;while(t[x])a;t[x]=1;printf("%d - %d\n",i,x+1);}}

 

komentarz 17 listopada 2020 przez Whistleroosh Maniak (56,980 p.)

@tkz, tego się już nie da pobić:

#include<bits/stdc++.h>
#define a x=rand()%30
int t[30],i,x;int main(){srand(time(0));while(i++<30){a;while(t[x]++)a;printf("%d - %d\n",i,x+1);}}

 

komentarz 17 listopada 2020 przez tkz Nałogowiec (42,000 p.)
#include<bits/stdc++.h>
#define a x=rand()%30
int t[30],i,x;int main(){srand(time(0));while(i++<30){while(a,t[x]++);printf("%d - %d\n",i,x+1);}}

 

komentarz 18 listopada 2020 przez Whistleroosh Maniak (56,980 p.)
No dobra nic krótszego nie potrafię znaleźć. Wygrałeś
komentarz 19 listopada 2020 przez KumberTwo Dyskutant (8,270 p.)
edycja 19 listopada 2020 przez KumberTwo
Wow, naprawdę bardzo wszystkim dziękuję i gratuluję, ponieważ wspólnymi siłami udało się wygrać z pythonem, który miał o 2 znaki więcej!

Podobne pytania

0 głosów
1 odpowiedź 234 wizyt
pytanie zadane 18 września 2015 w Offtop przez baszmest Gaduła (3,080 p.)
+1 głos
3 odpowiedzi 433 wizyt
pytanie zadane 16 kwietnia 2015 w Java przez WojciechJot Gaduła (3,410 p.)
0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 13 września 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

92,567 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...