[Çözüldü] Bir satırda aynı sayıların kaç kere geçtiğini saymak?

Başlatan 012rev3, 17 Kasım 2017 - 22:46:34

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

012rev3

Merhaba arkadaşlar.
Bir zamanlar yani çocukken bir kitabın herhangi sayfasından (ve) leri saymak bir oyun oynardım. En çok (ve) bulan kazanmış olurdu vs.
Yapmak istediğim şey üçbirim ekranından herhangi bir sayı ürettirip bu sayılar arasından hangi sayı o satırda kaç kere belirmiş olduğunu saymak.
Örneğin 0-9 a kadar olan sayılardan 10 karakter uzunluğunda bir sayı üretelim ve bu sayılar rastgele olsun. Örnek kod;
makepasswd -s 0123456789 --chars=10
3392637784

Görüldüğü gibi (2) sayısı bir kere geçmiş, (3) sayısı üç kere ... vs.
Gedit ile örneğin arama yapıldığında aranan kelime/harf/sayının kaç tane bulunduğunu yazıyor. Ama bu sadece o an aranan için geçerli. Ben aynı satırda hepsinin üzerinden hesaplama yapılmasını istiyorum.
"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

Amenofis

Önce sayıyı rakamlarına ayırırsın. Bunu yapmanın en kolay yolu sayıyı stringe çevirmek. Sonra 10 elemanlı bir dizi tanımlarsın ve rakamlarını bu diziye indeks olarak kullanırsın. Döngüyle stringin üzerinden geçip rakamlara karşılık gelen elemanların değerini 1 arttırırsın. Döngü bitince istediğin veriler dizide hazırdır. Afiyet olsun.

mhmtkrktr

Anlamadım ;-)
Ne olacağını, örnek bir kaynak ve beklenen sonuç olarak örneklendirebilirmisin? Aranan harf veya sayı kullanıcı girişinden mi alınacak, yada belirli kriterler baz alınarak mı arama yapılacak mesela.

012rev3

[mention=633315]@Amenofis[/mention]
Söylediklerinizi kısmen anladım ancak bunu kodlara dökecek yeterince deneyimim yok ne yazık ki. :)

[mention=633316]@mhmtkrktr[/mention]

Yukarıda verdiğim örnek kaynak olabilir. Ya da şunun gibi bir örnek;
cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -n 1
7029299486

Bu çıkan sonuçtan gelen rakamlar tekrarı hesaplanacak. Grep ile arandığında sadece aranmak isteneni arıyor fakat kaç adet bulduğunu yazdıramadım. Bunu yapabilsem kısmen çözüm olurdu. :)

Şimdilik kullanıcıdan herhangi giriş talep edilmeyecek. Sadece yukarıda vermiş olduğum örneğin çıktısı baz alınarak buradan gelen sayıların hepsinin ayrı ayrı kaç kez tekrarlandığı ayrı bir çıktı olarak görünecek.

Örnek çıktı ; 7029299486
Hesaplanan; (0)=1, (1)=0, (2)=1, (3)=0, 4=(1), (5)=(0), (6)=1, (7)=1, (8)=1, (9)=3

Script üzerinde çalışıyorum ancak bu sayıları nasıl ölçüp tartacaz bunun yolunu bulamadım...

Güncellendi.
cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -n 1 | grep -o 2 | wc -l
3

Bu şekilde aranan sayının kaç kere geçtiğini bulabiliyoruz. Yani kısmen çözüm olurdu dediğim kısmı çözdüm. :)
"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

mhmtkrktr

Şu şekilde olur mu?
cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -1|sed 's/.* //;s/\(.\)/\1 /g'| tr ' ' '\n' | sort | uniq -c|sed -n '1!p'
Çıktıyı x tane y var şekilde okuyabilirsin.
Senin örnek verdiğin gibi sonuç vermesi için döngü kullanmak gerekir sanırım. Tek bir komut olsun dersen bu. (biraz daha esnetilebilir)
Doğrudan istediğin gibi bir sonuç istiyorsan belirtirsin. Küçük bir script oluşturabilirim.

012rev3

Böyle de oldu tabi ki. İstediğim sonuçtu bu. Çok teşekkürler :)

Ben de amatör işi böyle bir şey yapmaya çalışmıştım ama malesef henüz çalışmadı. :D
kaynak=echo cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -n 1
a=echo "$kaynak" | grep -o 0 | wc -l
b=echo "$kaynak" | grep -o 1 | wc -l
c=echo "$kaynak" | grep -o 2 | wc -l
d=echo "$kaynak" | grep -o 3 | wc -l
e=echo "$kaynak" | grep -o 4 | wc -l
f=echo "$kaynak" | grep -o 5 | wc -l
g=echo "$kaynak" | grep -o 6 | wc -l
h=echo "$kaynak" | grep -o 7 | wc -l
i=echo "$kaynak" | grep -o 8 | wc -l
j=echo "$kaynak" | grep -o 9 | wc -l
<<EOL
hesaplanan: (0)=$a (1)=$b (2)=$c (3)=$d (4)=$e (5)=$f (6)=$g (7)=$h (8)=$i (9)=$j
EOL


Daha kolay okunabilmesi için şu şekilde çıktı veren bir script yazılabilir tabi.
(0)=?, (1)=?, (2)=?, (3)=?, (4)=?, (5)=?, (6)=?, (7)=?, (8)=?, (9)=?

"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

mhmtkrktr

Amaç okunaklı olması ise değişik şekiller verilebilir tâbiki. ;-)
cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -1|sed 's/.* //;s/\(.\)/\1 /g'| tr ' ' '\n' | sort | uniq -c|sed -n '1!p'|awk '$1=$1' FS=" " OFS="-dene-"|xargs

Ancak olmayanlarında listesini versin dedin mi işin rengi değişir. Bir deneyeyim ben bunu sonra.

012rev3

Olmayanların listesini vermesi çok da önemli değil aslında ama üretilen sayının görünmesini sağlayabilirsek daha iyi olacak sanırım.
"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

mhmtkrktr

Bunun gibi mi?
C=$(cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -1);echo -e "\nSayı = ${C}\n";echo $C|sed 's/.* //;s/\(.\)/\1 /g'| tr ' ' '\n' | sort | uniq -c|sed -n '1!p'|awk '$1=$1' FS=" " OFS="-tane-"|xargs

Veya,
C=$(cat /dev/urandom | tr -dc '0-9' | fold -w ${1:-10} | head -1);echo -e "\nSayı = ${C}\n";echo $C|sed 's/.* //;s/\(.\)/\1 /g'| tr ' ' '\n' | sort | uniq -c|sed -n '1!p'|awk '$1=$1' FS=" " OFS=" --> "



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 18 Kasım 2017 - 10:10:49

Bu da bonus olsun. Telifini al, Ömer Çelakıl 'a satarsın. ;-)

echo;read -p "giriş : " C;echo;sed 's/ //g' <<<$C|sed 's/İ/i/g;s/I/ı/g'|tr [A-Z] [a-z]|sed 's/.* //;s/\(.\)/\1 /g'|tr ' ' '\n'|sort|uniq -c|sed -n '1!p'|awk '$1=$1' FS=" " OFS=")--> "|sed 's/^/ (/g';echo -e "\nToplam : $(($(wc -c <<<$C)-1)) karakter"

Örnek çıktı;

Alıntı Yapgiriş : Mustafa Kemal Atatürk 1881 - ∞

(1)--> -
(1)--> ∞
(2)--> 1
(2)--> 8
(5)--> a
(1)--> e
(1)--> f
(2)--> k
(1)--> l
(2)--> m
(1)--> r
(1)--> s
(3)--> t
(1)--> u
(1)--> ü

Toplam : 33 karakter

012rev3

Evet, uğraş ve emeğiniz için çok teşekkür ederim.
! Bonus harika oldu bu arada.
Mümkünse bir konu daha açıp orada da yardımınızı isteyebilirim.
Sağlıcakla kalın. :)
"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

bourbaki


Kaleihan


mhmtkrktr

Alıntı YapEvet, uğraş ve emeğiniz için çok teşekkür ederim.
! Bonus harika oldu bu arada.
Mümkünse bir konu daha açıp orada da yardımınızı isteyebilirim.
Sağlıcakla kalın. :)

Sen sağolasın. Ama hemen sevinmeyelim. Olmamış çünkü. ;-)

hata 1: Türkçe karakter sorunu tam olarak çözülmemiş. ( Düzeldi )
hata 2: Çoklu kelimelerde toplam karakter sayısını hesaplarken boşlukları düşmemişim. Hatalı sonuç çıkarıyormuş. ( Düzeldi )
hata 3: Hata denilemez belki ama aynı karakter sayısı çift haneye geçince görsel bozukluk oluşuyormuş. ( Kısmen düzeldi )

El atmışken, toplamda kaç farklı karakter içerdiği bilgisini de ekledim.

echo;read -p "--İçerik : " C;echo;C=$(echo $C|tr -d [:space:]);echo $C|awk '{ print tolower($0) }'|sed 's/.* //;s/\(.\)/\1 /g'|tr ' ' '\n'|sort|uniq -c|sed -n '1!p'|awk '$1=$1' FS=" " OFS=" )\t-->  "|sed 's/^/( /g'|nl -nln -w1|sed 's/^/\> /g;s/\t/\t--\t/';echo -e "\n--Toplam : ${#C} karakter"

O değilde adamlar 29 harfi tek çümleye koymak için gerçekten hasta bi insanı katakulliye getirmişler. Hastaya sonra noldu ki acaba ;D
Alıntı Yap--İçerik : Pijamalı hasta yağız şoföre çabucak güvendi

> 1     --      ( 7 )   -->  a
> 2     --      ( 1 )   -->  b
> 3     --      ( 1 )   -->  c
> 4     --      ( 1 )   -->  ç
> 5     --      ( 1 )   -->  d
> 6     --      ( 2 )   -->  e
> 7     --      ( 1 )   -->  f
> 8     --      ( 1 )   -->  g
> 9     --      ( 1 )   -->  ğ
> 10    --      ( 1 )   -->  h
> 11    --      ( 2 )   -->  ı
> 12    --      ( 2 )   -->  i
> 13    --      ( 1 )   -->  j
> 14    --      ( 1 )   -->  k
> 15    --      ( 1 )   -->  l
> 16    --      ( 1 )   -->  m
> 17    --      ( 1 )   -->  n
> 18    --      ( 1 )   -->  o
> 19    --      ( 1 )   -->  ö
> 20    --      ( 1 )   -->  p
> 21    --      ( 1 )   -->  r
> 22    --      ( 1 )   -->  s
> 23    --      ( 1 )   -->  ş
> 24    --      ( 1 )   -->  t
> 25    --      ( 1 )   -->  u
> 26    --      ( 1 )   -->  ü
> 27    --      ( 1 )   -->  v
> 28    --      ( 1 )   -->  y
> 29    --      ( 1 )   -->  z

--Toplam : 38 karakter

hitokiri

Amma dallanıp budaklanmış konu, sorun çözüleli çok olmuş gerçi, ama tabii ilk iletiyi okuyup gerisine bakmayınca uğraşmış oldum. Biraz daha derli toplu bir yanıt olarak dursun artık burada. :) İyi ufak bi tekrar oldu benim içinde.
#!/bin/bash
#! coding:utf-8 -*-
# vim: ts=4:sw=4
function numbers() {
number=""
for no in `seq 0 1 9`;
do
shuf -i1-9 -n1;
number="$number$no";
done
return $number
}
first_number=$(numbers)
echo $first_number
for no in `seq 0 1 9`;
do 
tekrar=$(echo $first_number |grep -o $no|wc -l) 
if  [[  `echo $first_number|grep -c $no`  -eq 1 ]] && [[ $tekrar > 1 ]] ;
then
echo $no ">>>"    $first_number  ">>>>>   Tekrar:" $tekrar "kere"
fi
done 

mhmtkrktr


hitokiri

Alıntı yapılan: mhmtkrktr - 19 Kasım 2017 - 15:20:11
Bayâ derleyip toplamışsın, eline sağlık  :)
@mhmtkrktr sağol, ben senden şaşırtıcı bir şey bekliyorum, bakalım. İş derleyip toplamak olsun :)

SM-A700F cihazımdan Tapatalk kullanılarak gönderildi