Ich bin neu im Scripting und habe diese Aufgabe, 100 Palindromzahlen mit dem folgenden Algorithmus zu finden:
- Erhalten Sie eine zweistellige Zufallszahl (größer als 10)
- Kehren Sie die Nummer um
- Summiere die Zahl und ihre Umkehrung
- Wenn das Ergebnis der Summe eine Palindromzahl ist, drucken Sie sie aus. Andernfalls kehren Sie zu Schritt 2 zurück
Zum Beispiel:
- Startnummer: 75
- Rückwärts ist 57
- Die Summe beträgt 75 + 57 = 132
Da 132 keine Palindromzahl ist, fahren Sie mit Schritt 2 fort:
- Rückwärts ist 321
- 132 + 321 = 363
- 363 ist eine Palindromzahl. Drucken Sie es auf stdout!
Und so weiter, bis 100 dieser Zahlen gedruckt werden.
Das habe ich bisher:
#! /bin/bash
CONT=0
while [ $CONT -lt 100 ]
do
NUM= $RANDOM
while [ $SUM -ne $SUMINV ]
do
echo $NUM > file.txt
INV= rev file.txt
SUM= `expr[ $NUM + $INV ]`
echo $SUM > file2.txt
SUMINV= rev file2.txt
NUM= $SUM
done
echo $NUM
CONT=`expr $CONT + 1`
done
Suchen Sie nach Lösungen und helfen Sie mit diesem Skript!
Antworten:
Wie ich zunächst verstehe, müssen Sie eine zweistellige Nummer erhalten, die
So können Sie es erreichen
Nächster Schritt, um die Summe der Zahlen und ihre Umkehrung zu überprüfen
quelle
$RANDOM%100
In Ihrem ursprünglichen Skript gab es verschiedene Syntaxfehler. Zum Beispiel
foo= bar
ist falsch, Leerzeichen sind wichtig in Bash. Du brauchstfoo=bar
. Um die Ausgabe eines Befehls zu erhalten, könnenfoo=command
Sie den Befehl nicht in Backticks oder besser einschließenfoo=$(command)
. Hier ist eine Arbeitsversion:Beachten Sie, dass das Skript die Zahlen unverändert wiederholt. Um eindeutige Zahlen zu erhalten, kommentieren Sie die Zeilen wie in den Kommentaren des Skripts beschrieben aus.
quelle
Dieser macht Spaß. Ich mag diese Frage. Ich habe die folgende Funktion geschrieben, um die Aufgabe auszuführen, und sie erledigt den Job.
Es gibt ein paar Dinge, die daran bemerkenswert sind. In erster Linie
getopts
wird verwendet, um die Zahl umzukehren. Die Hauptfunktion vongetopts
besteht darin, kurze Optionen zu analysieren, die möglicherweise alle aneinandergereiht sind oder nicht - und ist daher ein praktisches Werkzeug zum Durchlaufen jedes Bytes in einer Zeichenfolge.Ich mag die
$RAND
Funktion derbash
Shell nicht sehr , aber wahrscheinlich ist sie konservativer als meinerand()
Funktion, die nur eine No-Op-Task hinterlegt und ihre nicht mehr existierende PID dem in ihrem ersten Argument gespeicherten Variablennamen zuweist. Ziemlich billig, das gebe ich zu.Das
case
Konstrukt kann in einem einfachen Test leicht alle Facetten Ihrer Aufgabe bewerten. Ich mache:Ich hatte anfangs große Schwierigkeiten damit. Zuerst habe ich Sachen gemacht wie:
Das war eine schlechte Idee. Die außer Kontrolle geratene Addition vergrößerte die Zahlen sofort auf Größen, bei denen die bloße Anzahl der Ziffern ausreichte, um die Wahrscheinlichkeit zu verringern, jemals ein Palindrom zu finden. Ich habe herumgespielt,
date +%S
aber ich dachte mir, wenn ich trotzdem einen anderen Prozess ausführen würde, könnte ich genauso gut die PID verwenden. Und dieser Prozess könnte in diesem Fall genauso gut ein Null-Op sein. Wie auch immer, der PID-Bereich ist klein genug, um so ziemlich jedes Mal im Runaway-Faktor zu regieren, wie es scheint.Zum Beispiel werde ich dies jetzt ausführen und die Ergebnisse einfügen:
AUSGABE
Es sind wahrscheinlich einige Dupes drin - es passiert anscheinend. Nicht viele. Ich weiß nicht, ob das ein Problem für Sie ist oder nicht, aber dies ist nur ein Beispiel dafür, wie es gemacht werden könnte.
Ein letzter Hinweis: Das Ausführen
dash
ist weitaus schneller als das Einführenbash
. obwohl der Unterschied nur eine Sekunde oder so zu sein scheint. In jedem Fall müssen Sie , wenn Sie verwendendash
, dierev()
set -- "$1"
Zeile in ändernset -- "${1#?}".
Ich habe gerade festgestellt, dass es eine zweistellige Anforderung gibt - obwohl ich den Verdacht habe, dass diese spezielle Regel ein Versuch ist, zu verhindern, dass die Aufgabe zu schwierig wird. Auf jeden Fall ist es sehr einfach, nur eine Teilmenge eines Strings abzurufen. In der Tat ist es das, womit ich mache,
r=
wenn ich:... die immer
r
einen Wert zuweist , der nicht mit einer Null beginnt.Hier ist eine Version davon
rand()
, die immer eine zweistellige Nummer zuweist$1
:Sie können natürlich die gleiche Logik auf
bash
's anwenden$RAND
. Der$((var=(value)?(assign if true):(assign if false)))"
ternäre Operator arbeitet mit nahezu jeder Ganzzahl. Hier weise ich ihm entweder das Modulo 100 (im Grunde genommen ein Perzentil) zu, wenn dieser Wert größer als zehn ist, oder ich weise das als zweite von zwei Ziffern zu, wobei die erste eine Zählung der Ziffern in ist$!
.Laufen Sie so und die Ergebnisse sind etwas weniger aufregend:
quelle