CMD challenge - teszteld parancssori képességeidet!

 ( trey | 2017. augusztus 20., vasárnap - 20:48 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Jópofa. :)
--
"Sose a gép a hülye."

Ezen elbuktam: https://cmdchallenge.com/#/print_number_sequence
Szerintem 3 jó megoldást is adtam, de nem lép tovább. Vagy az IQ teszten buktam el, és nem értem a feladatot.

mi volt az a három? :)

Ez pl elég eccerű:
seq -s ' ' 1 100

--
zrubi.hu

echo {1..100}

(szerk.: rejtett subscribe volt, meg egy szvsz. még egyszerűbb megoldás)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Na a "-s"-t nem ismertem, és úgy működik is. A "seq 1 100 | tr '\n' ' '" ugyanazt adja, és az nem ment.

Mert a végére is teszel egy szóköz karaktert...

Jé, tényleg!
Ez is ugyanazt csinálja, és ez is ugyanazért nem működött:
for i in {1..100}; do echo $i; done | tr '\n' ' '

Köszi!

Mondjuk a -s opciót én sem ismertem, de így lehet egyszerűsíteni:

seq -s " " 100

ha nem ismered az opciot, meg mindig csinalhatod igy: echo $(seq 1 100)

hibát én is találtam benne, pl volt hogy a
find -type f
nem minden file-ra meccselt...

--
zrubi.hu

azok symlinkek voltak :)

ohh :)

--
zrubi.hu

Kár, hogy megmutatja a megoldást.

--
zrubi.hu

jó móka volt :)
-------------------------------------------------------------------------------
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 14.2 | 4.4.37-janos

Egy darabig csináltam, s arra jöttem rá, ideje volna megtanulnom a find parancs használatát. Meg lehet kerülni a shell eszközeivel, de jó volna érteni hozzá, mert lényegesen egyszerűsíti az életet.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

find és xargs. A find-nak van '-exec' kapcsolója, ami elvileg ugyanazt csinálja, mint az xargs, de sok fájlnál az xargs lényegesen gyorsabb.

A xargs-ot legalább minimálisan, a legalapabb esetben tudom használni, de a find-ot még úgy sem. Mindig azon kapom magam, inkább írok ciklust, process helyettesítéssel vagy pipe-ból átadok neki egy listát, meg effélék. Holott az egész egyetlen parancsból megoldható lenne.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Jaj. Nincs benne openssl, akkor vajon hogy döntsem el, hogy egy szám <törölt szövegrész>-e?

Szerk: na, kész, mára kellemesen elfáradtam, ahogy a TV-tornában mondták;)

Én írtam rá egy rövid scriptet (megkeresi a szám gyökét, 2-től egy ciklus elmegy a gyökig, ha a szám modolo cikl. vált == 0, akkor nem prím), de nem fogadta el, pedig ua volt az eredmény, mint a factor használatával. Amúgy több esetben is volt olyan, hogy az eredmény ua lett, mint a megoldásoknál, de valamiért nem fogadta el.

Igen, volt, ahol a helyes eredmény 3 volt - talán file-okat kellett megszámolni -, beírtam, hogy echo 3, de nem fogadta el. :)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szóval van ilyen program is, hogy 'factor'... Jó tudni, köszi!
Szerk: és méghozzá nem is a haszontalan-bizbazok csomag része ez a factor, hanem a coreutils-é!

Nahát, még neked is lehet újat mondani? ;)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A másik újdonság a column parancs volt, ami a bsdmainutils része :)

Ezt meg én nem ismertem. Linuxon a util-linux csomagban van.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Linuxon a util-linux csomagban van.

Hátőőő...

$ dpkg -S `which column`
bsdmainutils: /usr/bin/column
$ dpkg -L util-linux | grep column
$

:)


rpm -qf `which column`
util-linux-2.30.1-1.fc26.x86_64

cat /etc/system-release
Fedora release 26 (Twenty Six)

;)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Dehát' Linuxról volt szó... :)

(csak hülyéskedek, nehogy komolyan vedd... :))

Köszi, ez nekem is újdonság, azt a feladatot egyedi printf-fel oldottam meg.

Azt hittem, tényleg CMD challenge, de ez shell scripting... :(
Időm lenne, megcsinálnám CMD.EXE-re. Ott aztán vannak vicces megoldások és szintaktikák... :)

Üdv,
Marci

ez kb. olyan lehet, mint kamaszutra poziciokat reklamozni a 70 feletti korosztalynak. Nem mondom, van meg ott is elet, csak hat az a celkozonseg mar egy kisse kisebb...

--
t-systems-es it architect allast keres. Jelige: csak webshopot ne kelljen...

LOL

Na, az a sajtreszelővel való próbálkozáshoz lehet hasonló élmény.
Sok sikert ;)

Még nosztalgiának is durva. Maga a gondolat is.

--
zrubi.hu

monjuk perl van benne, megkérhetnéd őket, hogy dobjanak bele egy powershellt is :D

Én 3 perc alatt felhúztam magam rajta, hogy "szép" megoldást nem fogadott el / nem is értette mit akarok, de olyat ami meg tipikus bad practice simán megevett.
Aki ezt csinálta, addig ütném, ameddig lélegzik! :P

Két tipikus példa a fentiekre, amiért ütném a szerzőt, amíg mozog:
#1: listázd ki a _fájlokat_ (soronként 1-et) szerepelt a feladatban. Nosza, reflexből find -type f
Nem jó!
de bezzeg az ls -1-et megette.
Saját magának önellentmond! Az ls -1, nem csak a fájlokat listázza ki.
#2: listáz ki az összes fájlt, amiben előfordul az "500" string.
Első megoldás:
grep -rl 500 .
Nem eszi meg.
Bezzeg a grep -l 500 *-ot igen.
Aki a shell expansion-t használja ilyen feladatra, az nagyobb aljasságokat is képes elkövetni!

Aki a shell expansion-t használja ilyen feladatra, az nagyobb aljasságokat is képes elkövetni!

Eddig azt hittem, az azért van, hogy használjam. ;)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az expansion, csak egy buta behelyettesites.

Nem ez az a celterulet, ahol hivatott hasznalni.

Ha ilyenre hasznalod, akkor gondold ujra, hogy hany helyen mehet felre egy scripted fals feltetelezesek miatt.

Ezek szerint rossz a holmi működési elve.
Úgy lenne csak értelme, hogy random adaton futtatja sandboxban és az outputot hasonlítja össze az általa futtatott megoldáséval.

Üdv,
Marci

Igen. Tehát amikor a file-okat meg kell számolni, és 3 a helyes eredmény, akkor az echo 3 egy helyes megoldás. :))


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szerintem működhet, ha egy/(vagy több) olyan könyvtáron is teszteljük a parancsot, amit felhasználó nem lát. Nem?

Nem kell előre megmutatni az aktuális tesztadatokat.

Üdv,
Marci

No igen, de kiadhatsz bármilyen parancsot. Egy ls -a után nem volt nehéz dolgom. :) Nyilván meg tudom számolni a file-okat, de kíváncsiságból beírtam bedrótozotta, s innen jöttem rá, hogy nem csak az eredményt nézi.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Mire mész az egyik futtatás tesztadatával a másik tesztadattal történő másik futtatásnál?

Üdv,
Marci

Arra gondolsz, hogy minden egyes alkalommal random generál tesztadatot? Mert akkor semmire. :)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Arra.

Üdv,
Marci

Azt csinálja (néha még irja is, higy random adattal nem volt jó) , csak nem mindig van összhangban a feladat kiírása azzal, amit valóban ellenőriz.
Ill a def része a példa adat.

+1

Igen, annak lenne ertelme, sott...
Minden szempontbol ertelmesebb lenne!

Gyu!

Az elsővel nincs igazad.

In UNIX everything is a FILE.

(Arról már nem is beszélve, hogy összekevered a file-t az ordinary file-lal :-) )

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Attol meg nem jo practice-t ls-t hasznalni olyan muveletre, ami igazibol egy sima echo is lehetne.
Masreszt open()-el pl. nem tudsz dir-t megnyitni, ha jol remlik. Szoval a dir megse annyira file. (socke-t, pipe-ot, device nodeokat meg tudsz :P A symlinket meg szandekosan nem emlitem)

Marpedig a * -ban azok is benne lesznek.

Szoval a legnagyobb bajom: shell-ben a *-ot, pl. for ciklusan erdemes hasznalni, ahol iteralni akarsz a listan.
De egy listazo programnak odaadni elore a listat, amit kerek vissza. Ertelmetlen szerintem. Foleg ugy, hogy a listazo program (ls) nincs is igazibol listazasra hasznalva, mert nem -l vagy mas parameterekkel van hivva, hogy extra infot adjon vissza a fajlokrol.
Visszaadja ugyanazt, amit beadtunk neki.
Max meggyozodik rola, hogy azok tenylegesen letezo direntry-k. Ami meg megint ertelmetlen, hiszen a glob is ezt csinalja: visszaadja a ra matchelo direntry-ket.

Az ilyen for i in `ls *`; do whatever ; done megoldasokert szemely szerint.
Lehet, hogy nincs igazam. De szemely szerint en kerulom meg az olyat is, akinek a kodjaban ilyet latok.
Hacsak nincs ra valami extra remek magyarazata, mint pl. hogy fiatal volt, masnapos es kellett a penz...

`ls *`

Ez a * hosszú írásmódja? :)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szerintem az open() még müxik könyvtárakra.

Azzal egyetértek, hogy nem jó gyakorlat.

Ja, man 2 open (nyilván FreeBSD-n) részletek a hibakódok környékéről:
[EOPNOTSUPP] An attempt was made to open a socket (not currently implemented).
[ENOTDIR] O_DIRECTORY is specified and the file is not a directory.

Szóval socketet nem lehet open-nel nyitni, dir-t meg igen :-) - de ettől még a local-domain (lánykori nevén: UNIX-domain) socketet a jobbak (mármint én ;-) ) fel szokták sorolni a 7-féle fájltipus felsorolásakor (mármint UNIX/Linux alaptanfolyamon). Úgyismint:

közönséges fájl (ordinary file)
könyvtár / mappa (directory)
szimbolikus link (symlink)
pipe
socket
chardev
blockdev

Szóval csak hogy magyarázzam a bizonyítványomat: amit írtál, az gyakorlati szempontból helytálló, csak volt benne egy tárgyilagosan nézve hiba.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Masreszt open()-el pl. nem tudsz dir-t megnyitni, ha jol remlik.
Rosszul remlik. Meg tudsz nyitni, csak ismerni kell a szukseges kapcsolokat ...

Szoval a legnagyobb bajom: shell-ben a *-ot, pl. for ciklusan erdemes hasznalni, ahol iteralni akarsz a listan.
De egy listazo programnak odaadni elore a listat, amit kerek vissza. Ertelmetlen szerintem. Foleg ugy, hogy a listazo program (ls) nincs is igazibol listazasra hasznalva, mert nem -l vagy mas parameterekkel van hivva, hogy extra infot adjon vissza a fajlokrol.
Visszaadja ugyanazt, amit beadtunk neki.

Nem. Visszaadja azt, amit talalt abbol, amit mi beadtunk neki.

Max meggyozodik rola, hogy azok tenylegesen letezo direntry-k.
Es itt az extra info, amit fentebb hianyoltal.

Ami meg megint ertelmetlen, hiszen a glob is ezt csinalja: visszaadja a ra matchelo direntry-ket.
Nem, nem ezt csinalja. Visszaadja, amit talalt, ill. szepen visszatolja az arcodba azt, amit beadtal neki, ha nem talalt semmit. Tehat, ha azt szeretned itt mondani, hogy az 'ls *' es az 'echo *', vagy legyen inkabb 'for f in *; do echo $f; done' ugyanazt az eredmenyt szallitja, hat akkor megint tevedsz sajnos. Az elso esetben ugyanis kapsz egy uzenetet es egy definialt hibakodot, ha nincs talalat, a masodik esetben viszont csak egy csillagot a szemeid koze ;)
Tegyuk itt persze rogton hozza, hogy mindket megoldas ebben a formaban erosen kerdojeles, ha az ember megbizhato szkriptet akar irni, pusztan a mondandodat kivantam kommentalni ;) Szinten meg kell jegyezni, hogy a glob hasznalata pl. a compgen-nel parositva hibakezelesre alkalmasabba teheto, tehat azt altalam irtakban meg veletlenul sem kell az 'egyetlen igaz megoldas' utan kutatni, nem lesz meg, es nincs is ilyen ;) De azert egy tipp: 'man find'.